如下代码,由于Point类的构造方法为私有,所以ColoredPoint无法编译通过。class Point {
private Point() {  }
}
class ColoredPoint extends Point {
int color;
}但是,一但将这两个类放到一个外部类中却编译通过了。代码为:class test{

   class Point {
private Point() {  }
   }
   class ColoredPoint extends Point {
int color;
   }
}到底怎么回事呢?

解决方案 »

  1.   

    楼上已经回答得很清楚了,但是怕你不太理解,我再罗嗦下.
    去看下  private public friendly(默认的) protect(受保护的) 的作用域范围你就清楚了.
      

  2.   

    把构造函数定义为Private好像是Singleton模式的做法,为了不让其他的类可以直接去new Object.而是提供了一个public方法getInstance()。
    而我觉得内部类虽然也叫做类,但不能用类的标准去定义它。我觉得它有时候更像是一个大的attribute.
      

  3.   

    是不是内部类中,能够访问Outer Class范围内的任意方法和成员。我知道内部类能够访问外部类的方法和成员,不知道它还能访问其他内部类的方法和成员。我这样理解对吗?
      

  4.   

    只是在同一个类的上下文,当然你还可以把内部类定义为private或protected.
      

  5.   

    不好意思,犯了个错误,protected 弄成 protect ,罪过啊!
    是不是内部类中,能够访问Outer Class范围内的任意方法和成员。我知道内部类能够访问外部类的方法和成员,不知道它还能访问其他内部类的方法和成员。我这样理解对吗?
    ------------------------------
    基本没错,但如果是外部类的静态变量那又另说了.
    只能说象你说的这种情况是对的.
      

  6.   

    flyforlove(吾将远去)   经典,顶
    内隐类 你就把他想成方法方法 访问 private 修饰的是可以的,所以 ,我就不说了
      

  7.   

    谢谢大家,我想从java规范中找到对应描述,但是也没找到。像下面的语句怎么回事呢?
    class Point {protected int n;}
    class OuterColoredPoint extends Point {
    public void t(){
    n=2; //OK,can access superclass's protected member
    super.n=3;//OK
    }
    }
    这种情况下“n=2;”与“super.n=2;”是不是相同的?从调试信息看两者都是相同的。但是如果将protected改为private并放到外部类中时,就出现“super.n=2”正确而“n=2;”编译错误的情况了。
    class test2{
    class Point {
    private int n;
    }
    class OuterColoredPoint extends Point {
    public void t(){
    n=2; //error ,cannot access superclass's private member
    super.n=3;//OK,but how to explain?
             }
    }
    }
      

  8.   

    不好意思,你后面的例子在编译期就已经通不过了
    class test2{
    class Point {
    private int n;
    }
    class OuterColoredPoint extends Point {
    public void t(){
    n=2; //error ,cannot access superclass's private member
    super.n=3;//OK,but how to explain?--这里也是提示can't access
             }
    }
    }