java文件中1) Book book1=new Book();2)
Book book1=new Book(){
      public void name(){
      System.out.println("is book");
}
};现问,1 上面二种写法,有何不同呢,
           2 第二种写法中,name方法会在new时就执行吗,这与类的构造器有何不同呢,
thanks

解决方案 »

  1.   

    区别在于一个在实例化是在写这个类,一个是先写好一个类在实例化,2中的name方法不会被执行
      

  2.   

    Book book1=new Book(){
      public void name(){
      System.out.println("is book");
    }
    };
    你这是抽象Book类里面的name()抽象方法吗? 要这个抽象类的实例就要把他的方法重写
      

  3.   

    看了楼上各位的回答,自己试了下,有这样的疑問:
    // Book类
    class Book
    {
    private String name; Book(String name)
    {
    this.name = name;
    } public String getName()
    {
    return this.name;
    }
    }// main里的代码
    Book b = new Book("书1")
    {
    private String book; public void changeName()
    {
    this.book = "哈哈";
    } public String getName()
    {
    return this.book;
    }
    };
    System.out.println(b.getName());输出是null呢?
    那main里面这些代码有什么意义?
      

  4.   

    第二个写法毫无意义  The method name() from the type new Test(){} is never used locally
      

  5.   


    1. 先说#5的回复
    Book b = new Book("书1") {.....}
    你这样的实例化之后如果你看编译后文件将会多生成一个.class文件正是类重写Book这个类。因此上这个类中的getName()方法覆盖了原有Book这个class中的方法、你调试可以发现实际上他的name属性值是“书1”,但是在调用的时候调用了{...}这个里面的getName,因为这个里面的name属性从未赋过值,所以这个方法返回了他自己的name,即null#6 正解
    像LZ的第二种写法一般是在需要重写这个Book的方法的时候才会出现这种写法、否则正如#6所说,毫无意义,从未被调用过,当然这种方法可以调用、那你只有通过反射这种方法才能掉到这个方法、我相信没有人回去这么做...楼主的第二种写法
      

  6.   

    楼主写个继承Thread的类就知道每种写法的好处啦。比如你觉得该线程其他地方并不会用到,那么你也不必单独在写一个该线程的类,为了简单起见,你可以写成如下形式。
    Thread thread = new Thread(){
    public void run(){
    System.out.println("111");
    }
    };
      

  7.   

    针对楼主的第二个问题,在new的时候不会执行该方法,他只是声明了这个对象有这个方法,至于执行与否是看程序的调用的啦