使用.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");
}
}