访问修饰符受保护

Access modifier Protected

package my.examples.javaexam;

import accessTest.*;

public class DiffPackageSubClass extends Test {
    public static void main(String[] args) {
        Test t1 = new Test();
        System.out.println(t1.a);
        t1.display();

    }
}

package accessTest;

public class Test {
    public int a = 10;
    protected int b = 120;
    protected void display(){
        System.out.println("Hello");
    }
    int c = 130;
    private int d = 999;
}

你好

我想弄清楚访问修饰符 'Protected' 是如何工作的。

我创建了两个包 'my.examples.javaexam' 和 'accessTest'

据我所知,如果 class 在不同的包中但它是子 class.

,则可以使用受保护的变量或方法

所以我在不同的包中制作了 DiffPackageSubClass class,但在 accessTest 包中继承了 Test Class。

然而,当我尝试执行代码时,它给我一个错误,指出 t1.display();无法执行,因为 'display()' 在 'accessTest.Test'

中具有受保护的访问权限

我不确定代码哪里出了问题:(

我已经盯着代码看了一段时间,但仍然不明白为什么它会给我一个错误。

请帮助我理解这个

根据https://www.geeksforgeeks.org/access-modifiers-java/使用

//Java program to illustrate 
//protected modifier 
package p2; 
import p1.*; //importing all classes in package p1 

//Class B is subclass of A 
class B extends A 
{   
    public static void main(String args[]) 
    { 
        B obj = new B(); 
        obj.display(); 
    }  

} 

//Java program to illustrate 
//protected modifier 
package p1; 

//Class A 
public class A 
{ 
    protected void display() 
    { 
       System.out.println("Test"); 
    } 
} 

即您需要在 main 中使用 DiffPackageSubClass class 进行实例化,因为 protected 可以通过 subclass 访问不同的包。

Java Language Specification 是这样说的:

Details on protected Access

A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.

(强调我的)

main 方法没有定义类型 DiffPackageSubClass 对象 的实现。

总之,可以在子类的实例方法中访问this.athis.display。但不是 Test.

类型的另一个对象的受保护成员

规范中有更多详细信息。这是官方的真实观点。特别是,它说:

Let C be the class in which a protected member is declared. Access is permitted only within the body of a subclass S of C.

In addition, if Id denotes an instance field or instance method, then:

If the access is by a qualified name Q.Id or a method reference expression Q :: Id (§15.13), where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.

因此,在您的示例中,如果 t1 被声明(并且是 DiffPackageSubClass.

的实例),main 方法可以访问 t1.at1.display

Protected 表示 method\variable 在同一个包中可见。 从 class 可以看出, 扩展了 您的 class。 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

使display()方法自动成为DiffPackageSubClass的成员,你可以这样使用它:

new DiffPackageSubClass().display();

但是你还是要调用subclass的方法,而不是superclass.

new Test().display()

仍然只能在 accessTest 包中访问

应该是从继承对象访问,而不是作为普通对象访问。请参阅下面的示例:

public class DiffPackageSubClass extends Test {
    public static void main(String[] args) {
        Test t1 = new Test();
        System.out.println(t1.a);
        t1.display(); // error
        DiffPackageSubClass diffPackageSubClass = new DiffPackageSubClass();
        diffPackageSubClass.display(); // ok 

    }
}