java 第四天

包package
package语句只能是第一条可执行的代码
四种权限修饰符:
private 本类中
默认(什么都不加):本类中、同一包下
protected:本类中、同一包下、不同包下(子类)
public:都可用
内部类:在类中定义的类。
调用方法:外部类名.内部类名 对象名 = new 外部类对象.new 内部类对象

outer.Inner oi = new outer().new Inner();

静态内部类:用static修饰的内部类,调用方法 :外部类名.内部类名 对象名 = 外部类名.new 内部类对象 = new 外部类名. 内部类对象

outer.Inner oi = new outer.Inner();

内部类之所以可以获取到外部类的成员是因为他获取到了外部类的引用:外部类名.this

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

局部内部类。定义在成员方法中的类。
不能在成员函数外声明对象,局部类只能访问final修饰的局部变量。因为当调用这个方法时,局部变量如果没有final修饰,它的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,就是方法弹栈,常量池的常量依然存在,也可以继续使用。但是jdk1.8取消了这个事情。
匿名内部类必须继承一个类或者实现一个接口格式为:
new 类名或者接口名( ){ };这相当于创建了一个子类对象。调用成员直接(.成员)就可以了.
调用多个成员时只能多次创建子类对象。所以匿名内部类最好只调用一个成员。
也可以将匿名类对象指向父类引用,但这样无法调用子类的特殊方法。因为他没有子类类名,无法向下强转。
匿名内部类在开发中当做参数使用。(本质是把匿名内部类当做子类对象)

class Inner_Class{
    public static void main(String[] args){
        Outer oi = new Outer();
    }
}
interface Inter{
    public void print();
}
class Outer{
    public void method(){
        final int num =10;
        //局部内部类
        class Inner{
            public Inner(){
                System.out.println("This is inner Class;"+"num = "+num);
            }
        }
        Inner in = new Inner();
        //匿名内部类
        new Inter(){                        //实现Inter接口
            public void print(){            //重写Inter抽象方法
                System.out.println("This is anonymous inner calss! ");
            }
        }.print();                         //创建子类对象并调用方法
    }

    public Outer(){
        method();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41584674/article/details/81748262