Java日志第21天 2020.7.26

Posted 把你的脸迎向阳光,那就不会有阴影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日志第21天 2020.7.26相关的知识,希望对你有一定的参考价值。

内部类

如果一个事物包含另一个事物,这就是一个类内部包含另一个类。

如身体与心脏、汽车与发动机

 

内部类中包括成员内部类与局部内部类,其中局部内部类中又包含匿名内部类

成员内部类

格式:

修饰符 class 外部类名称{

  修饰符 class 内部类名称{

    // ...

  }

  // ...

}

内部类用外部类时,可以随意访问;外部类用内部类时,需要用内部类的对象。

 

两种使用成员内部类的方法

1.间接方法:在外部类方法中使用内部类,main方法直接调用外部类方法。

public class Body {//外部类

    public class Heart{//内部类

        //内部类方法
        public void beat(){
            System.out.println("心脏跳动");
        }

    }
    //外部类方法中使用内部类
    public void methodBody(){
        Heart heart = new Heart();
        heart.beat();
    }
}

2.直接方法:

类名称 对象名 = new 类名称

外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()

public class DemoMain {
public static void main(String[] args) {

Body body = new Body();
body.methodBody();

Body.Heart heart = new Body().new Heart();
heart.beat();
}
}

 

 

当存在重名变量时,访问如下:

public class Outer {
    
    private int num = 10;
    
    public class Inner{
        private int num = 20;
        
        public void method(){
            int num = 30;
            System.out.println(num);//30
            System.out.println(this.num);//20
            System.out.println(Outer.this.num);//10
        }
    }
}

 

 

*内部类的.class文件命名是 外部类名称$内部类名称.class,所以不建议命名类名称时使用$符号

局部内部类

如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。

只有当前所属方法可以使用它,出了这个方法就不能使用。

格式:

修饰符 class 外部类名称{

  修饰符 返回值类型 方法名称(参数列表){

    class 内部类名称{

    }

    // 方法体

  }

}

public class Outer {

    private int num = 10;

    public void method(){
        /*final*/ int num = 20;
        class Inner{
            public void getNum(){
                System.out.println(num);
            }
        }
    }
}

 

局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的。

从Java 8 开始,只要局部变量事实不变,那么final关键字可以省略。

 

匿名内部类

如果接口的实现类(或者父类的子类)只需要使用唯一一次,那么这种情况下就可以省略掉该实现类的定义,而使用匿名内部类。

格式:

接口名称 对象名 = new 接口欧名称{

  //覆盖重写所有抽象方法

}

public interface MyInterface {

    public abstract void method();

}
public class DemoMain {
    public static void main(String[] args) {

        MyInterface obj1 = new MyInterface() {
            @Override
            public void method() {
                System.out.println("对象调用匿名内部类中的方法");
            }
        };
        obj1.method();
        
        new MyInterface() {
            @Override
            public void method() {
                System.out.println("匿名对象调用匿名内部类中的方法");
            }
        }.method();
    }
}

 

 

今天的内容需要理解,多练一练,明天还有一点内容,然后做一个综合实例。

 

以上是关于Java日志第21天 2020.7.26的主要内容,如果未能解决你的问题,请参考以下文章

Java日志第14天 2020.7.19

Java日志第41天 2020.8.15

Java日志第17天 2020.7.22

java 代码第一天练习

Java日志第8天 2020.7.13

Java日志第6天 2020.7.11