Java内部类、外部类之间访问权限

啥是内部类

顾名思义,内部类就是在一个类中定义了另一个类,比如在类A中定义了一个类B,B就是A的内部类。

class A{
	String a = "a";

	class B{
		String b = "b";
	}
}

内部类可以访问外部类的所有成员吗

修改一下代码,外部类A中有多种访问权限的字符串,在内部类B中的方法去打印这些字符串,先抛开static来看。

public class A {
    String a = "a";
    private String privateA = "privateA";
    protected String protectedA = "protectedA";
    public String publicA = "publicA";

    public static void main(String[] args){
        A a = new A();
        a.test();
    }

    public void test(){
        B b = new B();
        b.accessA();
    }

    class B{
        public void accessA(){
            System.out.println(a);
            System.out.println(privateA);
            System.out.println(protectedA);
            System.out.println(publicA);
        }
    }
}

编译没有错可以正常执行,结果如下,可以看出内部类B可以访问所有外部类A的成员。
在这里插入图片描述

那外部类能访问内部类的所有成员吗

再改,需要创建一个内部类的对象

public class A {
  
    public static void main(String[] args){
        A a = new A();
        a.accessB();
    }

    public void accessB(){
        B b = new B();
        System.out.println(b.b);
        System.out.println(b.privateB);
        System.out.println(b.protectedB);
        System.out.println(b.publicB);
    }

    class B{
        String b = "b";
        private String privateB = "privateB";
        protected String protectedB = "protectedB";
        public String publicB = "publicB";

        public void accessA(){
            System.out.println(a);
            System.out.println(privateA);
            System.out.println(protectedA);
            System.out.println(publicA);
        }
    }
}

执行结果如下。嗯,没啥问题,各种权限都能访问
在这里插入图片描述

匿名内部类

public class A {
    String a = "a";
    private String privateA = "privateA";
    protected String protectedA = "protectedA";
    public String publicA = "publicA";

    public static void main(String[] args){
        A a = new A();
        a.test();
    }

    public void test(){
        B b = new B(){
            @Override
            public void accessA(){
                System.out.println(a);
                System.out.println(privateA);
                System.out.println(protectedA);
                System.out.println(publicA);
            }
        };
        b.accessA();
        accessB(b);
    }

    public void accessB(B b){
        System.out.println(b.b);
        System.out.println(b.privateB);
        System.out.println(b.protectedB);
        System.out.println(b.publicB);
    }

    class B{
        String b = "b";
        private String privateB = "privateB";
        protected String protectedB = "protectedB";
        public String publicB = "publicB";

        public void accessA(){
           
        }
    }
}

运行结果,匿名内部类和内部类都一样
在这里插入图片描述

静态内部类呢

给B加上static关键字结果
在这里插入图片描述
但是外部类A还是可以通过内部类B的对象访问B的所有成员

为啥会这样呢

为什么B中的accessA方法可以直接访问A的成员,而A中的accessB方法要创建B对象?

内部类创建的时候会自动持有一个外部类的引用,所以创建内部类B的对象可以直接访问A的成员,而外部类A的对象要手动创建一个内部类B的对象才能访问B对象的成员。

为什么加上static关键字A的成员就访问不了了?

加上static关键字B就脱离了对象,B不会持有A的引用了,但B还可以创建A对象,去访问对象的所有成员

 static class B{
        public void accessA(){
            A aObj = new A();
            System.out.println(aObj.a);
            System.out.println(aObj.privateA);
            System.out.println(aObj.protectedA);
            System.out.println(aObj.publicA);
        }
    }

得出结论

外部类、内部类之间通过对象可以访问任意权限的成员。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值