内部类对象引用获取的细节

内部类的概念

当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了一种联系,所以

它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。

这是如何做到的呢?

当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有的细节。

但你现在可以看到:内部类的对象只能在与其外围类的对象相关联的情况下才能被创建(就像你应该看到的,在内部类是非static类时)。构建内部类对象时,需要一个指向其外围类对象的引用(如下面的parcel或者q),如果编译器访问不到这个引用就会报错。不过绝大多数时候这都无需程序员操心。

内部类对象引用获取的方式

public class Parcel {
    class Contents{//内部类一
        private int i = 11;
        public int value(){
            return i;
        }
    }

    class Destination {//内部类二
        private String label;
        Destination(String whereTo){
            label = whereTo;
        }
        String readLabel(){
            return label;
        }
    }

    public Destination to(String s){
        return new Destination(s);
    }
    public Contents cs(){
        return new Contents();
    }//各自的获取方法

    public void ship(String dest){
        Contents c = cs();
        Destination d = to(dest);
        System.out.println(d.readLabel());
    }

    public void state(){
        Parcel q = new Parcel();
        Parcel.Contents c = q.cs();
        /*第二种:如果想从外部类的非静态方法以外的任何位置
        创建某个内部类的对象,那么必须如同这般
        具体指明这个对象的类型*/
        Parcel.Destination d = q.to("Borneo");
        System.out.println(c.value());
        System.out.println(d.readLabel());
    }

    public static void main(String[] args) {//静态方法
        Parcel parcel = new Parcel();
        parcel.ship("Tasmania"); 
         /*第一种:典型的通过外部类方法,获取内部类方法的引用
         ,例如同to()和cs()*/
        System.out.println("==================");
        parcel.state();

    }
}

.this 与.new

.this

如果你需要生成对外部类对象的引用,
格式:外部类名称.this 如下图:

  //Parcel q = new Parcel();
  Parcel q = Parcel.this; 
  //但是不能在static方法内使用

将state()方法内用this替换new的创建,从而也获取一个新的外部类对象的引用
好处:这样产生的引用具有正确的类型,这一点在编译期就被知晓并受到检查,因此没有任何运行时开销。

.new

一般地我们创建对象,需要用到new关键字,但创建内部类对象稍微有些不同:

前面我们提到,创建一个非static的内部类对象需要一个外部类引用(只有在与外部类关联的情况下才能创建),如果你能理解这句话,那么直接创建内部类的方式会非常清晰。
如下图:

 //Parcel.Destination d = q.to("Borneo");
 /*第三种:通过.new 直接创建指定类型内部类对象*/
Parcel.Destination d = q.new Destination("Borneo");

格式:外部类名.内部类名 内对象名 = 外部对象引用.new 外部类();

再次点题:从格式我们也可以看到,未拥有外部类对象之前是不可能创建内部类对象的。但是如果我们创建的是嵌套类(静态内部类),那么他就不需要外部类对象的引用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱白熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值