java内部类的分类
java内部类的分类:成员内部类、局部内部类、静态内部类(嵌套类)、匿名内部类。在构建内部类对象时,需要一个指向其外部类对象的引用,而且这种引用的传递是通过内部类的构造器来完成的。
如果编译器访问不到这个引用就会报错。
CASE 1:
// 用.new语法传递了外部类对象的引用
public class Outer
{
class Inner { }
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
}
}
由于对外部类引用的传递是通过构造器来完成的,故在子类继承内部类的时候情况变得复杂起来。因为内部类缺少了对外部类对象的引用,而Test类的默认构造 器又无法向其提供,故编译出错。PS:Test() { super(); }这句写不写效果都一样,而且仅仅用super();语句向内部类传递构造信息是不够的。
CASE 2:
// 编译器提示:需要包含 Outer.Inner 的封闭实例
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test() { super(); }
public static void main(String[] args)
{
Test test = new Test();
}
}
为了解决这个难题,java语言提供了一种特殊的语法(enclosingClassReference.super();)来说明内部类与外部类对象引用之间的关联。
注意:这是一种特殊的语法,任何非内部类中的使用都会报错,无论super语句的前缀是什么。
CASE 3:
// 注意super语句前多了new Outer()
// 带有瑕疵的解决方案:内部类关联的对象是临时创建的,有时候这样的引用并不是你想要的
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test()
{
new Outer().super();
}
public static void main(String[] args)
{
Test test = new Test();
}
}
CASE 4:
// 或许这才是你想要的
public class Outer
{
class Inner { }
}
class Test extends Outer.Inner
{
Test( Outer o)
{
o.super();
}
public static void main(String[] args)
{
Outer outer = new Outer();
Test test = new Test(outer);
}
}
最后,需要注意的是语法enclosingClassReference.super();是java处理内部类继承时的特殊语法,非内部类上下文中的使 用都会出错;enclosingClassReference.super();与非内部类中super();语句的其中一个作用是一样的,都控制转向了 对象实例化的流程
(以上转至http://hi.baidu.com/xiongshihu/item/89f43e2a905bd5ccdcf69ac0)
再来一个类似程序
package project_4;
public class InnerClassTest {
class Clothes{
private String material;
private int size;
private String color;
public String getColor(){
return color;
}
public void setColor(String color){
this.color=color;
}
public String getMaterial(){
return material;
}
public void setMaterial(String material){
this.material=material;
}
public int getSize(){
return size;
}
public void setSize(int size){
this.size=size;
}
}
}
class Coat extends InnerClassTest.Clothes{
public Coat(InnerClassTest o){
o.super(); //Coat类继承了内部类Clothes,
//在构造方法中,o.super()实现了初始化父类引用的功能
}
}