Java 内部类继承

public class Outer {

   class Inner1 extends Outer{
		public Inner1() {
			 super(); // 调用 Object() 构造器
			 }
	}
	   class Inner2 extends Inner1{
		 public Inner2() {
			super(); // 调用 Inner1() 构造器 No enclosing instance of type Outer is available due to some intermediate 
			            //constructor invocation
			 }
	 }
	  class Inner3 extends Inner2{
		  public Inner3(){
			super(); //No enclosing instance of type Outer is available due to some intermediate 
                     //constructor invocation
		  }
	  }
}
</pre><pre name="code" class="java">
<span style="font-family: TT1F18o00; font-size: 12pt;"></span><pre name="code" class="java">当超类是非静态内部类时,调用超类的构造器,会显示No enclosing instance of type Outer is available due to some intermediate constructor invocation编译错误。
因为 Inner2 的类本是一个内部类,一个语言规则了 。正如知道的,要想实例一个内部类,如类 Inner1,需要提供一个外部类实例
给构造器。一情况下,它是式地传递给构造器的,但是它可以以expression.super(args)的方式通过类构造器调用(superclass constructorinvovation)显式地传递[JLS 8.8.7] 。如果外部类实例式传递的,编译
自动产生表达式:它使用 this 来代最内部的其是一个变量的外部类这确,但是这就是编译所作的。在本例中,那个就是
Inner1。因为当前类 Inner2 间扩展了 Outer Inner1便是它的一个继承来的。因此, 类构造器定表达式直接就是 this。编译器提供部类
实例,将 super重写成 this.super。解释到这里,编译错误所含的意扩展为:
Outer. java:12:cannot reference this before
supertype constructorhas been called
this.super();
^
在问题就清楚了 :缺省Inner2 的构造器试图在类构造器被调用访this,这是一个非法的操作[JLS 8. 8. 7.1]解决这个问题的方法是显式地传递合的外部类实例
public class Outer {
class Inner1 extends Outer {}
class Inner2 extendsInner1{
public Inner2() {
Outer.this.super();
}
}
}可以通过编译,但是它复杂了 。这里有一个更好的解决方案:无论何时你
了一个,都要问问你,是否这个类真的需要使用它的外部类实
?如果答案是否定的,那么应该

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值