运行结果就是:foobarhi
我理解
(new Bar() {}).go();
和
Bar a = new Bar();
a.go();
是一个意思,不知道是否正确,关注……
我理解
(new Bar() {}).go();
和
Bar a = new Bar();
a.go();
是一个意思,不知道是否正确,关注……
解决方案 »
- 有谁知道java中new string(“abc”)是调用了什么东西
- ArrayList源代码中一行神秘代码求解?
- 关于获取本身的地址!
- java之乱码问题
- 求救~linux系统下用java编写一个内存测试程序,算出cpu的miss rate等一大堆数据
- 一个hibernate dynamic-update配置的问题
- 如果已经建立了jtable,数据也导入了。但没有加滚动条。请问应该怎么追加滚动条。我用自己的方法把界面都弄乱了
- LinkedList 问题!
- 深入了解java
- 如何根据<select>的选择改变button的value和enable??<javascript>
- 文件写入时的中文问题?
- 谁能给我一个弹出式菜单的小例子。。。在线等
其实这个题目很简单
public class Foo {
Foo() {System.out.print("foo");}
class Bar{
Bar() {System.out.print("bar");}
public void go() {System.out.print("hi");}
}
public static void main (String [] args) {
Foo f = new Foo(); 初始化F,结果应该输出FOO
f.makeBar(); 调用makeBar()函数
}
void makeBar() {
(new Bar() {}).go();初始化函数,输出BAR,再调用GO()输出HAI
}
}
(new Bar()).go();倒好理解。
Bar()
{}
先声明一个类
再生成这个类的实例
new Bar();new Bar()是调用Bar类的构造函数,返回一个Bar实例。
new Bar().go();没有必要搞这么多括号,不知这些括号都有什么用?不明的!是不是要弄得很神密的样子才显得java的高深啊?
我测试了一下,(new Bar(){})中的{}里不能加任何代码,否则就会出现错误,不妨运行一下下面的程序看看:
public class Foo {
Foo() {System.out.print("foo");}
class Bar{
Bar() {System.out.print("bar");}
public void go() {System.out.print("hi");}
}
public static void main (String [] args) {
Foo f = new Foo();
f.makeBar();
}
void makeBar() {
(new Bar() {System.out.print("ha");}).go();
}
}
我运行的时候出现了错误:<identifier> expected,不知道是为什么
A. Compilation fails.
B. An error occurs at runtime.
C. foobarhi
D. barhi
E. hi
(new Bar() {}).go() 和 (new Bar()).go() 是一个意思
A. Compilation fails.
B. An error occurs at runtime.
C. foobarhi
D. barhi
E. hi
new Bar(){}
这种写法和new Bar()有本质的区别
new Bar(){}是一个匿名的Bar的子类
可以在{}之间定义函数,或者覆盖父类函数,这样写就很明白了
new Bar(){
public void go() {System.out.print("hihihihi");}
}
}
至于iversonxk的程序出的错误是由于new Bar() {}中{}的内容应该是表示一个子类所拥有的方法和属性的,只有一个System.out当然会出错
你要看例子,是吧?
public class Foo {
Foo() {System.out.print("foo");} class Bar{
Bar() {System.out.print("bar");}
public void go() {System.out.print("hi");}
} public static void main (String [] args) {
Foo f = new Foo();
f.makeBar();
}
void makeBar() {
(new Bar() {public void go() {System.out.println("this is what I add!");}}).go();
}
}
bar.go();
new Bar(){
super.go();//添加此句更容易理解,执行了Bar的方法
public void go() {System.out.print("hihihihi");}
}
}
new Bar(){
public void go() {
super.go();//添加此句更容易理解,执行了Bar的方法
System.out.print("hihihihi");}
}
}
Anonymous classes can implement an interface (implicit extension of Object) or explicitly extend a class. Cannot do both.
Syntax: new interfacename() { } or new classname(can take arg.) { }
overload和override是不同的,很多人会讲错