访问修饰符受保护

时间:2018-12-06 07:47:12

标签: java protected access-modifiers

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;
}

你好。

我试图弄清楚Access修饰符“受保护”的工作原理。

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

据我所知,如果该类位于不同的包中但是子类,则可以使用受保护的变量或方法。

因此,我在不同的程序包中制作了DiffPackageSubClass类,但使它继承了accessTest程序包中的Test Class。

但是,当我尝试执行代码时,出现一个错误,提示我说t1.display();。不能被夸大,因为'display()'在'accessTest.Test'中具有受保护的访问权限

我不确定代码在哪里出错:(

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

请帮助我理解这一点

4 个答案:

答案 0 :(得分:2)

根据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 类实例化,因为受保护的对象可以通过子类访问不同的包。

答案 1 :(得分:1)

Java Language Specification的意思是:

  

受保护访问的详细信息

     

对象的受保护成员或构造函数只能在负责该对象实现的代码中从该包的外部进行访问,该代码负责实现该对象。

(重点是我的)

main方法未定义类型DiffPackageSubClass object 的实现。

简而言之,您可以在子类的实例方法中访问this.athis.display。但不是Test类型的另一个对象的受保护成员。

更多详细信息,请参见规范。这是官方的真理。特别是说:

  

让C为声明受保护成员的类。只能在C的子类S的主体内进行访问。

     

此外,如果Id表示实例字段或实例方法,则:

     

如果通过限定名称Q.Id或方法引用表达式Q :: Id(§15.13)(其中Q是ExpressionName)进行访问,则在且仅当表达式Q的类型为时才允许访问S或S的子类。

因此,在您的示例中,如果声明了t1(并且是t1.a的实例),则main方法可以访问t1.displayDiffPackageSubClass

答案 2 :(得分:0)

受保护意味着方法\变量在同一包中可见。 从扩展课程的课程中可以看到其内容。 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

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

new DiffPackageSubClass().display();

但是仍然必须调用子类而不是超类的方法。

new Test().display()

仅在accessTest软件包中仍可访问

答案 3 :(得分:0)

它应该是从继承对象访问的,而不是普通对象。参见下面的示例:

CookieManager.check.cookies=false