Java内部类

Java内部类字段可见性分析

代码

public class OuterClass {

    private static String a = "这是静态字段";
    private String b = "这是非静态字段";

    public static void method01(){
        System.out.println(a);
//        System.out.println(b);
//        System.out.println(c);
//        System.out.println(d);
//        System.out.println(e);
//        System.out.println(f);
    }

    public void method02(){
        System.out.println(a);
        System.out.println(b);
//        System.out.println(c);
//        System.out.println(d);
//        System.out.println(e);
//        System.out.println(f);
    }


    public class InnerClass{
        //非静态内部类中不允许存在静态字段
        //private static String c = "这是非静态内部类静态字段";
        private String d = "这是非静态内部类非静态字段";

        public void method03(){
            System.out.println(a);
            System.out.println(b);
            System.out.println(d);
//            System.out.println(e);
//            System.out.println(f);
        }
    }

    public static class StaticInnerClass{
        private static String e = "这是静态内部类静态字段";
        private String f = "这是静态内部类非静态字段";

        public static void method05(){
            System.out.println(a);
//            System.out.println(b);
//            System.out.println(d);
            System.out.println(e);
//            System.out.println(f);
        }

        public void method06(){
            System.out.println(a);
//            System.out.println(b);
//            System.out.println(d);
            System.out.println(e);
            System.out.println(f);
        }
    }
}
public static void main(String[] args) {
    OuterClass a = new OuterClass();
    OuterClass.InnerClass b = a.new InnerClass();
    OuterClass.InnerClass c = a.new InnerClass();
    OuterClass.StaticInnerClass d = new OuterClass.StaticInnerClass();
    OuterClass.StaticInnerClass e = new OuterClass.StaticInnerClass();
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
    System.out.println(d);
    System.out.println(e);
}

执行结果

内部类.OuterClass@1b6d3586
内部类.OuterClass$InnerClass@4554617c
内部类.OuterClass$InnerClass@74a14482
内部类.OuterClass$StaticInnerClass@1540e19d
内部类.OuterClass$StaticInnerClass@677327b6

分析

  1. 外部类不能看到内部类的字段,内部类之间也不能看到对方的字段,内部类可以看到外部类的字段,非静态内部类可以看到外部类的静态和非静态字段,而静态内部类只能看到外部类的静态字段
  2. 非静态内部类中不能存在static标记的字段和方法,也不能存在静态代码块
  3. 非静态内部类需要通过外部类的对象才能初始化,可以被子类继承

造成静态内部类与非静态内部类字段可见性差异的,主要是static修饰内部类时造成内部类的初始化是否依赖与外部类的初始化,静态内部类初始化是通过new 外部类.内部类()的方式,并不需要外部类对象的参与,所以在静态内部类中就无法直接访问外部类的非静态方法与字段;非静态内部类的初始化是通过new 外部类().new 内部类()的方式,必须要外部类对象的参与,内部类对象与外部类对象绑定,相当于外部类对象的一个字段,因此可以访问外部类的任意方法和字段,又由于非静态内部类必须与外部对象绑定才能初始化,所以非静态内部类不可以有任何的static修饰的字段/方法/代码块。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值