Java 保护访问不起作用

Posted

技术标签:

【中文标题】Java 保护访问不起作用【英文标题】:Java Protected Access Not Working 【发布时间】:2010-09-24 21:05:00 【问题描述】:

在java中,访问权限分为三个级别:

公开 - 向世界开放 私人 - 只对班级开放 受保护 - 仅对类及其子类(继承)开放。

那么为什么 java 编译器允许这种情况发生呢?

TestBlah.java:

public class TestBlah 

    public static void main(String[] args) 
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    

Blah.java:

public class Blah 
    protected String message;

    public Blah(String msg) 
        this.message = msg;
    

    protected String getMessage()
        return(this.message);
       

Bloo.java:

public class Bloo extends Blah 
    public Bloo(String testing) 
        super(testing);
    

【问题讨论】:

还有包访问。这是没有修饰符的默认值。 你确定这是对的 - a.testing 和 b.testing 没有被声明。你是说 a.message 和 b.message 吗? 有四个访问级别。按设计工作。 我希望 Java 具有类似于 C++ 和 C# 的访问权限。为问题 +1 【参考方案1】:

因为受保护意味着子类同一包中的其他类。

实际上还有第四个“默认”访问级别,当修饰符被省略时,它提供对同一包中其他类的访问。

所以protected 介于默认和public 访问权限之间。

【讨论】:

【参考方案2】:

您可以调用b.getMessage(),因为bBloo 类型,它扩展了Blah,并且getMessage() 受到保护。如您所述,受保护的允许子类访问该方法。

不过,您遇到了以下错误:

Bloo 构造函数中不带参数调用super() 是错误的。编译器找不到无参数 Blah 构造函数,因为您定义了一个带有字符串参数的构造函数。 在TestBlahmain方法中调用new Blah()是一个错误,原因同上。 引用a.testingb.testing 是错误的,因为您没有为任何类定义变量testing

【讨论】:

嘿嘿,我猜我永远不会知道他是不是故意的。嘿,蜥蜴对龙的回答很有趣。 :)【参考方案3】:

实际上有四个访问级别:“公共”、“受保护”、“私有”和默认也称为包私有或包保护。默认限制对包的可访问性。默认非常有用,我经常使用它。

【讨论】:

【参考方案4】:

更具体地说,您期望 protected 像在 C++ 中一样工作。

但是,在 Java 中,它有不同的含义。在 Java 中,类(显然)、同一包中的所有其他类以及该类的任何子类都可以使用受保护的方法。其他包中的类将无权访问,除非它们是这个原始类的子类。

See this similar question 了解更多关于继承标记的具体信息。

就个人而言,我几乎从不使用protected。我开发的是应用程序而不是框架,所以我更有可能定义public 方法、private 数据,并且经常将我的整个类标记为final

【讨论】:

【参考方案5】:

其实应该是:

只对classes on the same package类及其子类开放(继承)

这就是为什么

【讨论】:

以上是关于Java 保护访问不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 OAuth2 保护服务,JWT 令牌不起作用 Spring Cloud

多个保护级别在 WCF 中不起作用

iOS 对核心数据的数据保护不起作用

typeof 类型保护在分配给变量时是不是不起作用?

Node js csrf令牌保护不起作用

在 XMLHttpRequest() 之后 PHP 定义不起作用