2010-06-05 88 views
6

任何人都可以解释以下代码的工作...?任何人都可以解释以下代码的工作...?

interface myInterface{} 

public class Main { 

    public static void main(String[] args) { 

     System.out.println(new myInterface(){public String toString(){return "myInterfacetoString";}}); 

     System.out.println(new myInterface(){public String myFunction(){return "myInterfacemyFunction";}}); 
    } 
} 

输出是...

myInterfacetoString 
[email protected] 

所有答案中说的println是MyInterface的()语句是匿名类。但是,因为我已经将它声明为一个接口,为什么它允许我创建同名匿名类....?

再次...如果这些都是匿名类,则class主要应该让我给任何名义向这些匿名classes..But如果尝试做so..I'm获得编译错误

+0

这是作业,还是好奇?标记作业问题本身被认为是一种很好的形式。 – ojrac 2010-06-05 02:17:58

+1

Siddhi,很好的问题。不过,我建议你不要经常用显着的新内容改变问题。相反,你可以提交一个新的问题并引用这个问题。 – akf 2010-06-05 02:53:37

+0

这使得一个匿名类的实例实现一个空的接口。一个覆盖toString(),所以System.out.println会自动使用它。另一个有myFunction,它没有被调用,所以它使用Object的toString(),它提供了一些信息,包括对象的地址。 – mk12 2010-06-05 03:12:37

回答

14

当你打印出一个对象,它会调用toString()方法。在第一个语句中,您创建了新的对象,并且还覆盖了称为toString的方法。因此,当打印对象时,会调用此toString()方法。

在第二条语句,你还可以创建一个对象,但你不重写toString()方法,使其使用Object类的toString()方法。

对于新的问题,这个链接对你的理解一个很好的解释: Anonymous Classes

下面是解释的副本:

new className(optional argument list){classBody} 

这个表达式实例从一个无名一个新的对象和此前未定义的类,它自动扩展名为类名,类和不能明确地实现任何接口。新课程的主体由classBody提供。

执行该表达式的结果是,该延伸的className一个新的类定义,新的类新对象被实例化,并且表达由对新对象基准所取代。

new interfaceName(){classBody} 

该表达从无名和先前未定义类,它可以自动实现名为接口名接口实例化一个新对象,并自动延伸名为对象的类。这个类可以明确实现一个,只有一个接口,并不能延长超过对象其他任何类。再一次,新班的主体由classBody给出。

现在是清楚的吗?

+0

好的......但是这个调用toString方法,因为默认情况下myAbstractClass是扩展了Object类......但是如果我使用Interface而不是抽象类......它给了我相同的输出......为什么它如此......? – Siddhi 2010-06-05 02:23:27

+2

所有对象直接或间接地,明确或隐含地扩展Object类。如果您使用接口而不是抽象类,那么您的匿名类仍将隐式扩展Object。 – emory 2010-06-05 02:27:12

+0

我已经为接口的匿名类添加了一个新的,更清晰的解释。你也应该看看链接,这是非常好的:) – vodkhang 2010-06-05 04:11:04

3

在第一println()你是从匿名myAbstractClass实例重写toString()方法,所以你得到的字符串你重写toString()方法返回,这就是println()功能的默认行为。

在第二println(),你是不是重写toString()方法,所以println()使用默认的(从Object继承)。

在附注中,尝试正确地格式化您的代码,阅读和理解起来要容易得多。

abstract class myAbstractClass{} 

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new myAbstractClass(){ 
      public String toString(){ 
       return "myAbstractClass toString"; 
      } 
     }); 

     System.out.println(new myAbstractClass(){ 
      public String myFunction(){ 
       return "myAbstractClass myFunction"; 
      } 
     }); 
    } 
} 
+0

好吧...但这调用toString方法,因为myAbstractClass默认情况下扩展了Object类...但是如果我使用Interface而不是抽象类...它给了我相同的输出......为什么如此..? – Siddhi 2010-06-05 02:26:39

+1

由于您创建的任何对象实例(即使它来自实现接口的类)都从Object扩展而来。 http://java.sun.com/javase/6/docs/api/java/lang/Object.html – Cesar 2010-06-05 02:33:00

3

myAbstractClass是一个最小类。它从对象继承。

类主要从myAbstractClass构造两个匿名内部类,并打印它们的toString输出。

  1. 内部类重写toString方法,您会看到它的输出。
  2. 内部类获取添加的方法,并且您将默认的toString定义。
1

在这两种情况下,您都打印了该对象。所以它会调用toString()方法的对象。在第一种情况下,由于您已覆盖toString()方法,因此它正在打印myAbstractClass toString。在第二种情况下,由于它未被覆盖,因此它调用Object类中实现的默认toString()

我想你在期待第二种情况下的函数调用是错误的。你刚刚重写了它,但从来没有打过电话。

相关问题