Java SE 是什么,包括哪些内容(二十)?
本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
1、.this
如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟原点(".")和关键字this。这样产生的引用自动地具有正确的类型,这一点在编译期就被知晓并接受到检查,因此没有任何运行时开销。
下面的代码示例展示了如何使用.this:
// .this的使用
//类DoThis
public class DotThis{
//方法f()
void f(){
//打印字符串"DoThis.f()"
System.out.println("DoThis.f()");
}
//内部类Inner()
public class Inner{
//方法outer(),返回类型为DoThis
public DoThis outer(){
//返回对外部类DotThis的引用
return DoThis.this;
}
}
//方法inner()
public Inner inner(){
//返回内部类对象实例
return new Inner();
}
//程序执行入口main方法
public static void main(String[] args){
//创建外部类DoThis的对象实例
DoThis dt = new DoThis();
//返回一个内部类Inner的对象实例
DoThis.Inner dti = dt.inner();
//调用outer()返回外部类对象实例,在调用外部类方法f()
dti.outer().f();
}
}
以上代码示例适用于想在内部类明确获得对外部类对象的引用:
2、.new
有时你可能想要告知某个外部类的对象,去创建它某个内部类的对象。要实现此目的,你必须使用.new语法。
代码示例:
// 明确创建一个外部类的内部类对象
//外部类DotNew
public class DotNew{
//内部类Inner
public class Inner{}
//程序执行入口main方法
public static void main(String[] args){
//创建外部类DotNew对象实例
DotNew dn = new DotNew();
//这是,想明确创建外部类DotNew的内部类Inner对象
//就需要像下面这样
//明确使用外部类对象的引用dn,然后加上.new,最后加上
//内部类的构造方法
DotNew.Inner dni = dn.new Inner();
}
}
要想直接创建内部类的对象,你不能按照你想象的方法,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建该内部类的对象(也就是在创建内部类对象之前,必须先创建外部类对象),就像在上面的示例代码中看到的那样。这同时也解决了内部类名字作用域的问题:你不必再声明(实际上你也不能这么声明)成这样:dn.new DotNew.Inner()。
你在拥有外部类对象之前是不可能创建内部类对象的,这是因为内部类对象会秘密地连接到创建它的外部类对象上。但是,如果你创建的是嵌套类(静态内部类),那么它就不需要对外部类对象的引用(也就是不需要有一个外部类对象)。
代码示例:
// 创建一个静态内部类对象
//类Parcel3
public class Parcel3{
//静态内部类Contents
static class Contents{
//int类型类变量i,初始化值为11
private int i = 11;
//方法value()
public int value(){
//返回类变量i的值
return i;
}
}
//静态内部类Destination
static class Destination{
//String类型的类变量label
private String label;
//构造方法,带一个String类型的类变量whereTo
Destination(String whereTo){
//初始化类变量
label = whereTo;
}
//方法readLabel()
String readLabel(){
//返回类变量label的值
return label;
}
}
//程序执行入口main方法
public static void main(String[] args){
//创建静态内部类Contents的对象实例,需要明确标明Parcel3.Contents
Parcel3.Contents c = new Parcel3.Contents();
//创建静态内部类Destination的对象实例
Parcel3.Destination d = new Parcel3.Destination("HaHa");
}
}
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明优快云,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。