【问题标题】:Relative private access specifier in java?java中的相对私有访问说明符?
【发布时间】:2015-09-14 09:02:43
【问题描述】:

如果我们在一个类中声明了一个私有实例变量,那么该变量只在该类内部可见,如果我们想访问它就必须为它创建成员函数,即该类的对象是无法直接访问... 例如,int 此代码...

    class A {
       private int a;

       public int getA() {
          return a;
       }
    }

    class B extends A {
void display()
{
       System.out.println(a);//error,trying to access private variable
       A obj=new A();
       System.out.println(obj.a); //Even object is not able to access it directly
       System.out.println(obj.getA());//Fine,it can access
    }
}

但是为什么在内部类的情况下,外部类的对象可以通过对象直接访问内部类的私有变量...例如-

    class Outer {
void method1()
{
       System.out.println(y); //Error,can't access private member of Inner
       Inner obj=new Inner();
       System.out.println(obj.y); //Why this doesn't show error 
}

       class Inner {
          private int y;
       }
    }

为什么给java中的外部类提供这种权限???

【问题讨论】:

  • 这两个代码块都不能编译;您在任何函数或方法之外都有 println 语句。
  • 是的,像这样的问题的出发点是编译的代码,并且在运行时,按照你说的做。

标签: java object inheritance nested private


【解决方案1】:

因为内部类是其封闭类的成员,因此可以访问封闭类的其他成员,甚至是私有成员,就像该类的其他成员一样。

Java tutorial on nested (including inner) classes 中明确列出了与此相反的情况:

...是其封闭类的成员。 非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无法访问封闭类的其他成员。作为 OuterClass 的成员,嵌套类可以声明为私有、公共、受保护或包私有。 (回想一下,外部类只能声明为公共或包私有。)

(我的重点。)

但是你描述的方向,外部类访问内部类的私有成员,也是允许的,并且出于同样的原因:一个类的所有成员都可以访问该类的其他成员。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2021-06-19
    • 2013-06-19
    • 2013-10-22
    • 2016-05-23
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多