Java内部类总结

成员内部类

定义于一个类的的内部,可以无条件访问外部类的所有成员属性和方法(包括静态成员和private成员)

而外部类想访问内部类的成员就需要先船舰成员内部类的对象,在通过对象引用来访问。

public class TestStatic {
    public final int number; //成员字段可以在构造器中赋值
    private static final int id; //静态成员字段可以在静态代码块中赋值
    static {
        id = 1;
    }
    public TestStatic() {
        number = 1;
    }
    private void tostr(){
        System.out.println("私有方法");
        new Tes().to(); //外部类访问内部类需要实例化对象来访问。
    }
    class Tes{ //成员内部类,可以访问当前类下的private修饰的字段
        private int id = 0; //如果与外部类重名,默认为内部类
        public void to(){
            System.out.println(id); //内部类的id
            System.out.println(TestStatic.id); //外部类的id
            System.out.println(TestStatic.this.id); //外部类的id
            tostr(); //可以直接调用private修饰的方法
        }
    }
}

成员内部类依附于外部类存在,如果想创建内部类的对象,需要先存在一个外部类的对象。

public class Test {
    public static void main(String[] args)  {
        //第一种方式:
        Outter outter = new Outter();
        Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建

        //第二种方式:
        Inner inner1 = new Outter().new Inner();
        //或者
        Outter.Inner = new Outter().new Inner()
    }
}

局部内部类

定义在一个方法内或者一个作用域内,类似局部变量,该内部类只能在该方法内或该作用域内访问

就像局部变量一样,无法使用static、四种访问修饰符

静态内部类

定义在一个类的内部,但多了修饰符static。不依赖外部类,可以直接创建内部类对象,只能使用外部类static成员变量和方法。因为在没有外部类的情况下可以创建内部类的对象,此时外部类的非static成员还不存在。

问题

为什么局部内部类和匿名内部类只能访问局部final变量?

public class ThreadTest {  
      
    public void function(String a) {  
        a="b";  //jdk1.8后会默认为final String a,即使你不写,但如果你重新给a赋值,就会报错
        new Thread(){  
            @Override  
            public void run() {  
                System.out.println(a);  
            }  
        }.start();  
    }  
    public static void main(String[] args) {  
        new ThreadTest().function("a");  
          
    }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值