内部类(二) 使用.this与.new & 内部类与向上转型

使用.this与.new

  • 如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this。
    这里写图片描述

  • 有时候需要告知某些其他对象,去创建其某个内部类的对象。需要在new表达式中提供对其他外部类对象的引用,这时需要使.new语法。
    这里写图片描述

  • 要想直接创建内部类的对象,不能按照想象的方式,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建该内部类对象。

  • 在拥有外部类对象之前是不可能创建 内部类对象的。这是因为内部类对象会连接到创建它的外部类对象上。但是,如果创建的是嵌套类(静态内部类),就不需要对外部类对象的引用。
    这里写图片描述

内部类与向上转型

  • 当将内部类向上转型为其基类,尤其是转型为一个借口的时候,内部类很有用。(从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的)这是因为此内部类—某个接口的实现—能够完全不可见,并且不可用。所得到的只是指向基类或接口的引用,能够很方便地隐藏实现细节。
/**
 * Created by Panda on 2018/6/8.
 */
public interface Contents {
    int value();
}
/**
 * Created by Panda on 2018/6/8.
 */
public interface Destination {
    String readLabel();
}
/**
 * Created by Panda on 2018/6/8.
 */

//private 内部类给类的设计者提供了一种途径 通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节。
class Parcel4{
    private class PContents implements Contents{
        private int i=11;
        @Override
        public int value() {
            return i;
        }
    }
    protected class PDestination implements Destination{
        private String label;
        private PDestination(String label){
            this.label=label;
        }
        @Override
        public String readLabel() {
            return label;
        }
    }

    public Destination destination(String s){
        return new PDestination(s);
    }
    public Contents contents(){
        return new PContents();
    }
}
public class TestParcel {
    public static void main(String[] args) {
        Parcel4 parcel4=new Parcel4();
        Contents contents=parcel4.contents();
        Destination destination =parcel4.destination("milk");
    }
}

猜你喜欢

转载自blog.csdn.net/panda_____/article/details/80627731