public class Twisted  {
  private String name;  Twisted (String name) {
    this.name = name;
  }  private String name() {
    return name;
  }  private void reproduce() {
    new Twisted ("reproduce") {
      void printName() {
        System.out.println(name());
      }
    }.printName();
  }  public static void main(String[] args) {
    new Twisted ("main").reproduce();
  }
}输出 main 还是 reproduce 呢???

解决方案 »

  1.   

    main(),这个就是继承里面的一些东西,private的方法或字段是无法被继承的
      

  2.   

    reproduce吧;
    这和继承有什么关系?
      

  3.   

    main
    ==============
    回复内容太短了!
      

  4.   

    这个跟继承没关系吧,非静态内部类可以访问非静态外部类的方法,很正常,毕竟之前main字段已经初始化了~!所以理所当然main了
      

  5.   

    main看了一遍不知道答案,拿过去运行一下才出来这个答案
      

  6.   

    main 
    ============== 
    回复内容太短了!
      

  7.   

    答案:main
     
    System.out.println(name());
    这里的name()是new Twisted ("main").name()
      

  8.   

    main
    new Twisted ("main")实例中的name就是main
      

  9.   

    main............................................
      

  10.   

    main(),这个就是继承里面的一些东西
      

  11.   

    new Twisted ("reproduce") {
          void printName() {
            System.out.println(name());
          }
        }
    是类Twisted的一个子类,大家看一下CLASS文件,
    而private 是类保护的,
    所以大家可以测试一下:
    private String name() {
        return name;
      }
    方法有private 和没有 private 的区别.
      

  12.   

    看了半天,没明白,
    还是跑了一遍,csdn上强人多啊.
      

  13.   

    终于找到答案拉!!根据一个肤浅的分析会判断该程序不能通过编译。reproduce方法中的匿名类试图调用Twisted类中的私有方法name。一个类不能调用另一个类的私有方法,是吗?如果你试图编译这个程序,你会发现它可以成功地通过编译。在顶层的类型(top-level type)中,即本例中的Twisted类,所有的本地的、内部的、嵌套的和匿名的类都可以毫无限制地访问彼此的成员[JLS 6.6.1]。这是一个欢乐的大家庭。 在了解了这些之后,你可能会希望程序打印出reproduce,因为它在new Twisted(“reproduce”)实例上调用了printName方法,这个实例将字符串”reproduce”传给其超类的构造器使其存储到它的name域中。printName方法调用name方法,name方法返回了name域的内容。但是如果你运行这个程序,你会发现它打印的是main。现在的问题是它为什么会做出这样的事情呢?这种行为背后的原因是私有成员不会被继承[JLS 8.2]。在这个程序中,name方法并没有被继承到reproduce方法中的匿名类中。所以,匿名类中对于printName方法的调用必须关联到外围(“main”)实例而不是当前(“reproduce”)实例。这就是含有正确名称的方法的最小外围范围(enclosing scope)(
      

  14.   


    main 看了一遍不知道答案,拿过去运行一下才出来这个答案
      

  15.   


    ======================================================================package com.sysdynamic.test;public class Twisted {
    private String name; Twisted(String name) {
    this.name = name;
    System.out.println(name + "    =======");
    } private String name() {
    System.out.println(name+"     &&&&&&&");
    return name;
    } private void reproduce() {
    new Twisted("reproduce") { void printName() {
    System.out.println(name+"      ^^^^^^");
    System.out.println(name());
    }
    }.printName();

    } public static void main(String[] args) {
    new Twisted("main").reproduce();
    }
    }//main    =======
    //reproduce    =======
    //main      ^^^^^^
    //main     &&&&&&&
    //main
      

  16.   

    当然是main哦!自己好好学习呀!
      

  17.   

    没什么可说了,Java解惑原文都贴出来了,参见23楼。
      

  18.   

    Java解惑  迷题92:双绞线    呵呵,得好好看看这本书...
      

  19.   

    main 
      

  20.   

     main函数先new Twisted ("main").reproduce();调基类方法  
    基类reproduce()方法里面一个匿名内部类 new Twisted ("reproduce")继承基类 
    但是添加了printName()方法 并调用````
    printName()通过 System.out.println(name())调基类name())方法输出 
     这里应该是两个实例(应该是基类new子类):基类name="main"; 输出的是main..
     
     如果     new Twisted ("reproduce") {
              private String name() {
                  return name;
              }
           …………
    应该也是输出main吧。。因为实际上new Twisted ("reproduce")就没有name属性。。