JAVA内部匿名类中的语句块问题【先多谢高手】

royaki 2009-01-22 07:25:13
百度知道里也问了,http://zhidao.baidu.com/question/83255827.html
package net.chapter1;
abstract class Base{
public Base(int i){
System.out.println("Base Constructor! "+i);
}

public abstract void f();
}
public class AnonymousConstructor {
public static Base getBase(int i){
return new Base(i){

{System.out.println("内部初始化");}
public void f(){
System.out.println("内部f()");
}
};
}
public static void main(String[] args){
Base base=getBase(47);
base.f();
}
}


{System.out.println("内部初始化");}这句为什么要用括号呢?是什么作用啊?

这个程序是按什么步骤运行的呢?

运行结果:
Base Constructor! 47
内部初始化
内部f()
...全文
64 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bzwm 2009-01-22
  • 打赏
  • 举报
回复
首先类 Base 是抽象类,
所以 Base 不能被实例化。

getBase方法 返回一个 Base 的引用,

由于Base不能实例化,所以这里用到了 返回一个 匿名对象引用,

首先类的初始化顺序是:
如果有父类,则是父类的(静态变量、静态初始化块)-->(变量、初始化块)-->构造方法,
然后再按照这个顺序初始化子类。

在new Base(i)的时候,首先要对Base的区域进行初始化,由于没有成员变量和初始化块,
所以进入构造方法打印出Base Constructor! 47

然后
{
System.out.println("内部初始化");
}


相当于是对抽象类Base的扩展,也就是相当于子类的初始化块。
所以按照刚刚说过的顺序,就打印出 内部初始化 。
后来的方法调用就不说了。
royaki 2009-01-22
  • 打赏
  • 举报
回复
十分好奇是按什么顺序运行的程序

62,615

社区成员

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

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