java内部类的实现方式,java三种常用设计模式和实例
内部类是定义在类内部的类,是从JDK1.1引入的,在最初的版本中,没有内部类。由于消息机制是在JDK1.1之后引入的,一个类需要访问另一个类的私有成员,因此引入了内部类并改进了其系统以实现这一目标。学习使用内部类是掌握Java高级编程的一部分,可以让你更优雅地设计自己的程序结构。我在这里试着更详细地解释一下。先看这个例子:
抽象类内容{
抽象公共int value();
}
接口目标{
字符串read label();
}
公共类Parcel3 {
私有类内容扩展内容{
private int i=11
public int value(){ return I;}
}
受保护类PDestination实现目标{
私有字符串标签;
private p destination(String where to){
label=whereTo
}
公共字符串read label(){ return label;}
}
公共目的地dest(字符串){
返回新的目的地;
}
公共内容cont() {
返回新的p contents();
}
}
类别测试{
公共静态void main(String[] args) {
parcel 3 p=new parcel 3();
内容c=p . cont();
目的地d=p.dest("坦桑尼亚");
//非法—无法访问私有类:
//Parcel3。p contents a=p . new p contents();这是从外部类获取内部类对象的另一种语法。
}
} ///:~
在本例中,类PContents和PDestination是在类Parcel3中定义的,分别具有private和protected来控制访问级别。在Parcel3中,与方法dest()一样,PContents和PDestination都是Parcel3的成员,因此它们具有相同的属性。因此,与成员函数一样,这两个成员类(即内部类的函数)也可以访问外部类的私有变量。另外,可以在内部类的声明前添加public、protected、private等修饰符,实现内部类的访问控制;从这个角度来看,如果在内部类声明之前添加static,那么原本属于外部类对象的内部类就可以变成属于外部类的内部类,成为类成员,改变了类的初始化顺序。
以上解释了关于内部类的基础知识,再回到上面的程序,两个内部类分别实现了两个接口。在下面的main()方法中,直接使用Contents c和Destination d进行操作,你甚至看不到两个内部类的名字!at Contents c=p . cont();而目的地d=p.dest("坦桑尼亚");语句,表面上是用外部的内容和目的对象来操作,实际上操作的是自己定义的内部类的对象,只是别人不知道调用了另一个类的对象,结果是一样的。向上转换这种方法的理论基础是子类的对象总是可以被父类调用。使用这种方法有两个原因:
1.我们将实现某种形式的接口,这样我们就可以创建并返回一个句柄。
2.解决一个复杂的问题,并希望创建一个类来辅助自己的程序,同时不愿意透露该类的细节。
这实际上是一种设计模式。
同时,我们也找到了第一种在外部类范围之外获取内部类对象的方法,即利用其外部类的方法创建并返回。此外,获取内部类对象的另一种方法参见程序注释。它的语法是:
outer class . inner class inner object=outer object . new inner class(构造函数参数);
注意,创建非静态内部类对象时,必须先创建相应的外部类对象。至于原因,这就把我们带到了下一个话题——非静态内部类对象对其外部类对象有一个引用,刚才的例子稍微修改了一下:
公共类Parcel3 {
私有value rate=2;
私有类PContent实现内容{
private int i=11 * valueRate
public int value(){ return I;}
}
受保护类PDestination实现目标{
私有字符串标签;
private p destination(String where to){ label=where to;}
公共字符串read label(){ return label;}
}
公共目的地dest(字符串){
返回新的目的地;
}
公共内容cont() {
返回新的p content();
}
}
这里我们给Parcel3类添加一个私有成员变量valueRate,我们发现value()可以访问valueRate,这是内部类的第二个优点——一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!这是一个非常有用的功能,在设计的时候给我们提供了更多的思路和捷径。为了实现这个功能,内部类对象必须有一个对外部类对象的引用。当Java编译器创建内部类对象时,它们隐式地传入外部类对象的引用并保存它们。这样,内部类对象总是可以访问它的外部类对象,这就是为什么在外部类的作用域之外创建内部类对象之前,必须先创建外部类对象的原因。
像普通类一样,内部类可以是静态的。但与非静态内部类相比,区别在于静态内部类没有对外部的引用。在任何非静态内部类中,不能有静态数据、静态方法或其他静态内部类(内部类可以嵌套在多个层中)。然而,静态内部类可以拥有这一切。这是两者的第二个区别。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。