Java SE 是什么,包括哪些内容(二十)?
本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
通常,如果所读,写的代码包含了内部类,那么它们都是平凡的内部类,简单并且容易理解。然而,内部类的语法覆盖了大量的其它的更难以理解的技术。
例如:可以在一个方法里面或者再任意的作用域内定义内部类。
这么做的理由如下:
①、利用内部类实现了一个接口,于是可以创建并返回对这个内部类对象的引用(引用类型是这个接口类型)。
②、想通过一个类来辅助你解决一个复杂的问题,但是又不希望这个类是公共可用的。
代码示例:
展示了在方法的作用域内(而不是在其它类的作用域内)创建一个完整的类,这被称作局部内部类:
// 局部内部类
//外部类Parcel5
public class Parcel5{
//外部类方法destiantion(String s),带一个String
//类型的形式参数s,返回类型为接口Destiantion
public Destination destination(String s){
//---------------------------------------
//以下的位置为外部类的作用域位置,但现在写的是一个
//内部类
//内部类PDestination实现了接口Destination
class PDestination implements Destination{
//内部类PDestination的类变量label
private String label;
//内部类的构造方法,带一个String
//类型的形式参数whereTo
private PDestination(String whereTo){
//为类变量进行初始化
label = whereTo;
}
//内部类方法readLabel()
public String readLabel(){
//返回类变量label的值
return label;
}
}
//这是外部类的方法的返回值
//返回一个内部类PDestination的对象实例
return new PDestination(s);
}
//程序执行入口main方法
public static void main(String[] args){
//创建外部类Parcel5的对象
Parcel5 p = new Parcel5();
//通过外部类方法destination(String s)
//返回一个内部类PDestination的对象实例
//赋值给接口Destinaiton类型的引用d
Destination d = p.destination("Tasmania");
//因为内部了已经对方法readLabel()进行了实现
//所以可以直接调用,最后得出的结果是内部类的实现
//输出字符串Tasmania
System.out.println(d.readLabel());
}
}
结果示例:
通过内部类实现的多态。
在以上的代码示例中,你需要重点关注的内容就是,方法destiantion(String s)的返回类型是接口Destination类型,内部类PDestianation就是在这个方法的作用域位置实现的(它实现了接口Destination),那么这个方法的return语句直接就返回了一个内部类的对象实例(在方法内部创建的内部类,在方法内部可以直接使用),那么在使用的时候,就可以直接用内部类实现的父接口类型去接收这个方法返回的对象实例,从而实现多态效果(上面实例中就是使用了父接口Destination类型去接收方法destination(String s)返回的内部类PDestination类型)。
子类PDestination是方法destiantion(String s)方法的一部分,而不是类Parcel5的一部分,所以在方法destination(String s)之外是不能访问子类PDestination。
PS:当然,在方法destination(String s)中定义了内部类PDestination,并不意味着一旦方法destination(String s)执行完毕,类PDestination的对象就不可用了(在main()方法中,虽然引用类型是Destination,但是实际的对象类型是PDestination)。
你可以在同一个子目录下的任意类中对某个内部类使用名称"PDestination",这并不会有命名冲突。
代码示例:
展示了如何在任意的作用域内嵌入一个内部类:
// 在任意的作用域内嵌入一个内部类
//外部类Parcel6
public class Parcel6{
//方法internalTracking(boolean b),带一个boolean类型
//的形式参数b
private void internalTracking(boolean b){
//if语句
if(b){
//内部类TrackingShip
class TrackingShip{
//String类型的类变量id
private String id;
//内部类构造方法,带一个String类型的形式参数s
TrackingShip(String s){
//初始化类变量id
id = s;
}
//方法getShip()
String getShip(){
//返回类变量id的值
return id;
}
}
//----------------------------------
//这里内部类已经结束了,但是仍然在if语句内,
//可以直接使用内部类,创建内部类对象
TrackingShip ts = new TrackingShip("slip");
//使用内部类方法getShip()
String s = ts.getShip();
//打印结果
System.out.println(s);
}
//------------------------------------
//这里已经超出了if语句的范围,不能使用内部类TrackingShip了
}
//外部类方法track()
public void track(){
//调用外部类方法internalTracking(boolean b)
//传入的实际参数为true
internalTracking(true);
}
//程序执行入口main方法
public static void main(String[] args){
//创建外部类Parcel6的对象
Parcel6 p = new Parcel6();
//调用方法track()
p.track();
}
}
结果示例:
内部类TrackingShip嵌入在了if语句的作用域内,这不是说该类的创建是有条件的,它其实与别的类一起编译过了。然而,在定义内部类TrackingShip的作用域之外,它是不可用的。除此之外,它与普通类一样。
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。