【问题标题】:Access modifier Protected [duplicate]访问修饰符受保护[重复]
【发布时间】:2019-05-07 21:02:15
【问题描述】:
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;
}

你好。

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

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

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

所以我在不同的包中创建了 DiffPackageSubClass 类,但在 accessTest 包中继承了测试类。

但是,当我尝试执行代码时,它给了我一个错误,说 t1.display();无法执行,因为 'display()' 在 'accessTest.Test' 中具有受保护的访问权限

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

我已经盯着代码看了一段时间,但仍然无法弄清楚为什么它会给我一个错误。

请帮助我理解这一点

【问题讨论】:

  • 提示:所有这些基本的东西都在这里被问过很多次了。它们也记录在任何好书或教程中。并且:您应该在发布问题之前进行一些研究。

标签: java protected access-modifiers


【解决方案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(并且是 DiffPackageSubClass 的实例),则 main 方法可以访问 t1.at1.display

【讨论】:

    【解决方案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 类进行实例化,因为 protected 可以通过子类访问不同的包。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        受保护意味着方法\变量在同一个包中是可见的。 从扩展您的类的类中可以看到它。 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

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

        new DiffPackageSubClass().display();
        

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

        new Test().display()
        

        仍然只能在 accessTest 包中访问

        【讨论】:

          猜你喜欢
          • 2015-02-11
          • 2012-03-25
          • 2013-03-05
          • 1970-01-01
          • 2014-12-29
          • 2013-04-03
          • 1970-01-01
          相关资源
          最近更新 更多