Thinking in java 内部类 final问题

Jack_Yin 2011-09-04 10:30:50
内部类要使用方法中的参数,则这个参数必须为final,但下面的例子中,参数不是final,
Thinking java中的解释是说,参数i是给内部类的基类构造器使用,并没有在匿名内部类中使用,
对于这个解释不是很理解,求解惑

abstract class Base
{
public Base(int i)
{
System.out.println("Base constructor, i = " + i);
}

public abstract void f();
}

public class AnonymousConstructor
{
public static Base getBase(int i)//注意,这个i不是final的
{
return new Base(i) //这里相当于匿名内部类继承自基类Base,但基类只有这个带参数i的构造器,而子类构造器中必须调用
//基类构造器,所以必须要带这个参数,给基类的构造器调用,这里参数i为什么可以不是final的?
{
{
System.out.println("Inside instance initializer");
}

public void f()
{
System.out.println("In anonymous f()");
}
};
}

public static void main(String[] args)
{
Base base = getBase(47);
base.f();
}
}

...全文
226 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jack_Yin 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhouyuqwert 的回复:]
引用 7 楼 jack_yin 的回复:

引用 1 楼 zhouyuqwert 的回复:
你这样看不习惯的话 换个方式
public static Base getBase(int i)//注意,这个i不是final的
{
private class Son extends Base //这里加上一个private
{
public Son(int i)
{
super(i)……
[/Quote]

你说的对,这个局部内部类在定义它的方法外部是不能访问的,也不能用private,protected public 修饰,而只能用final和abstract修饰.
还有 不加任何修改表示是包可见.

我搞错了,呵呵.
阳明 to life 2011-09-04
  • 打赏
  • 举报
回复
还需要修改你一个错误 不加任何访问权限 是包访问级别 不是protect访问级别
这里带名字的内部类在方法体里面是局部的,你在外面没办法访问,继承也没办法继承
阳明 to life 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jack_yin 的回复:]

引用 1 楼 zhouyuqwert 的回复:
你这样看不习惯的话 换个方式
public static Base getBase(int i)//注意,这个i不是final的
{
private class Son extends Base //这里加上一个private
{
public Son(int i)
{
super(i);
}
xxx//……
[/Quote]
那我反问你一下 不加private你如何在外面访问这个类
Jack_Yin 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouyuqwert 的回复:]
你这样看不习惯的话 换个方式
public static Base getBase(int i)//注意,这个i不是final的
{
private class Son extends Base //这里加上一个private
{
public Son(int i)
{
super(i);
}
xxx//其他的就不加了
}
return new Son(i);//这里用到的i 不是在内部类中用的
……
[/Quote]

匿名内部类,其实是局部内部类的一种特殊形式,匿名内部类是说这个类的只需要一个对象就可以,也说就是说匿名内部类不能在定义它的类的外部使用,所以,上面举的例子再加上一个private就应该跟匿名内部类一样了.如果不加的话,这个内部类实际上是protected,在继承类中还是可以使用的.
Jack_Yin 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fly_m 的回复:]

new Base(i)
这里只是普通的构造函数调用而已,根内部类没有关系,不管在哪儿都是这样调用的。
并且
public static Base getBase
方法的签名为静态,所以在进行方法调用时,不需要实例化对象。
[/Quote]

不知道 是不是这位 仁兄 没有理解我的意思,你说的我不是很懂,能否说详细些?
Jack_Yin 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jack_yin 的回复:]

多谢楼上 指导.

这样看,确实好理解了.

不过,楼上给的例子,实际上匿名内部类,已经不是匿名了.这么用跟匿名内部类,是不是 还是一回事呢?

可能我概念还没弄清楚,要再看下.
[/Quote]

呵呵 这是针对一楼兄弟说的,在回帖时,二楼已经回复了.
阳明 to life 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jack_yin 的回复:]

多谢楼上 指导.

这样看,确实好理解了.

不过,楼上给的例子,实际上匿名内部类,已经不是匿名了.这么用跟匿名内部类,是不是 还是一回事呢?

可能我概念还没弄清楚,要再看下.
[/Quote]
没任何区别 只不过一个没名字 一个有名字
Jack_Yin 2011-09-04
  • 打赏
  • 举报
回复
多谢楼上 指导.

这样看,确实好理解了.

不过,楼上给的例子,实际上匿名内部类,已经不是匿名了.这么用跟匿名内部类,是不是 还是一回事呢?

可能我概念还没弄清楚,要再看下.
Fly_m 2011-09-04
  • 打赏
  • 举报
回复
new Base(i)
这里只是普通的构造函数调用而已,根内部类没有关系,不管在哪儿都是这样调用的。
并且
public static Base getBase
方法的签名为静态,所以在进行方法调用时,不需要实例化对象。
阳明 to life 2011-09-04
  • 打赏
  • 举报
回复
你这样看不习惯的话 换个方式
public static Base getBase(int i)//注意,这个i不是final的
{
class Son extends Base
{
public Son(int i)
{
super(i);
}
xxx//其他的就不加了
}
return new Son(i);//这里用到的i 不是在内部类中用的
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧