【问题标题】:I can access a protected field outside of class in java [duplicate]我可以在java中访问类之外的受保护字段[重复]
【发布时间】:2014-11-18 08:07:38
【问题描述】:

好的,所以我认为拥有受保护字段的目的是使变量只能由子类和具有受保护字段的类访问。创建子类或超类的对象不应授予对这些字段的访问权限。如果我是正确的,为什么这样的代码编译正确?

//superclass
public class SuperClass{
    protected int x = 5;

}

//main class with main method
public class MainClass{        
     public static void main(String[] args) {

         SuperClass a = new SuperClass();

         a.x = 8;       

         System.out.println(a.a);


      }
}

这将打印出 8,这意味着我在拥有它们的类之外修改了一个受保护的变量...

【问题讨论】:

  • 你的意思是 System.out.println(a.x); ?
  • @user889742 是的,对不起

标签: java polymorphism protected


【解决方案1】:

protected 变量和方法可以从同一包的其他类以及当前类的子类中访问。

private 变量和方法只能从当前类中访问。

如果没有修饰符(protectedprivatepublic 都不是),则默认情况下,该变量可从同一包中的任何类访问,但不能从子类访问。

官方文档见here

【讨论】:

    【解决方案2】:

    Java 中的protected 成员对包中的其他类也可见。

    将您的 main() 方法移动到不同的包中,您会收到错误消息。

    【讨论】:

    • (这是一个字段,不是方法,而是一些东西;))
    【解决方案3】:

    我认为拥有受保护字段的意义在于,只有子类和具有受保护字段的类才能访问该变量。

    你想错了。

    创建子类或超类的对象不应授予对这些字段的访问权限。

    确实如此。注意你现在在这里与你自己的想法相矛盾。您的想法包括子类,现在您正试图排除它。

    如果我是对的

    你不是。

    【讨论】:

    • 对于第一部分,他实际上对几种编程语言的想法是正确的。对于第二部分,它的措辞不好,但他的意思是创建超类的对象,所以并没有真正自相矛盾。今天感觉精神抖擞?
    • 大声笑这个人就像讨厌我所说的一切。我之所以这么说,是因为我试图区分 public 和 protected...
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2015-05-09
    • 2018-12-10
    • 2020-11-02
    • 1970-01-01
    • 2010-10-18
    • 2023-03-05
    相关资源
    最近更新 更多