繁体   English   中英

从子类访问受保护的超类成员

[英]Access protected super-class member from sub-class

我正在阅读这本Java SCJP书,并且发现了这一点:

受保护的访问控制级别和默认的访问控制级别几乎相同,但有一个关键的区别。 仅当访问成员的类属于同一包时,才可以访问默认成员,而即使子类在不同的包中,子类也可以(通过继承)访问受保护的成员。

因此,我决定测试protected点。

我的包裹里有超一流的

package scjp;

public class Token {

    protected int age = 6; //This is the protected class-level variable.

    public Token(String name){
        this.name = name;
    }
    public Token(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return this.name;
    }

    public int getAge(){
        return this.age;
    }
}

我在另一个包中有一个子类;

package pack;

import scjp.Token;

public class son extends Token{

    public static void main(String[] args) {
       System.out.println(Token.age);
    }

}

如您所见,我正在尝试访问超类中受保护的类级整数变量age

但是我得到这个错误:

 age has protected access in scjp.Token
        at pack.son.main(son.java:11)
Java Result: 1

那么,怎么了?

您正在尝试使用类引用访问父类的非静态保护成员。

public static void main(String[] args) {
       Token t = new Token("somehting");
       System.out.println(t.age);
    }

将编译并正常工作。

age不是您类Token静态变量 实例非静态成员,并且您可以使用实例访问实例非静态成员

   System.out.println(new Token().age);

应该管用

并且作为您的Son IS-A Token您应该能够直接访问它,除非您在Son类中具有另一个具有相同名称(阴影)的变量,在这种情况下,它将访问Son中声明的“年龄”,如我所能看到您尚未在Son类中声明age ,您也可以像这样直接访问它:

System.out.println(age);

age不是静态成员。 您将需要使用Token类的实例访问它。 不是类名本身。

您误解了这个概念

子类可以访问(通过继承)受保护的成员,即使该子类位于其他程序包中也是如此。

意味着您可以通过在类中扩展它来访问该成员,但是您尝试通过静态概念访问类中的变量,即使您的变量不是静态的,所以我认为您必须看一下Java的基础知识。 意味着您可以用两种方式修复程序。

1.创建您的类的对象并访问受保护的变量,为此您必须创建一个构造函数,该构造函数应调用父构造函数。 您的儿子班级可能看起来像是跟随。

public son(String name) {
    super(name);
    // TODO Auto-generated constructor stub
}

public static void main(String[] args) {
    son s = new son("Hello"); //$NON-NLS-1$
   System.out.println(s.age);
}

2.您可以通过将您的受保护变量设置为静态来访问,并在类中使用它,如下所示。
代币类别:

public class Token {
   protected static int age = 6; //This is the protected class-level variable.
  ....
}

儿子班:

  System.out.println(son.age);

您无法访问静态成员,如果要测试继承,可以执行以下操作

public static void main(String[] args) {
   son s = new son();
   System.out.println(s.age);
}

您不应使用以小写字母开头的公共类名称。

受保护的成员:换句话说, protected =继承

对于包外部的子类, 只能通过继承访问受保护的成员。 子类不能在超类引用上使用点运算符来访问受保护的成员。

您不是从子类访问它。 您正在从main()访问它。“ main”方法不是任何一个类的成员,但是它试图直接访问成员变量。

public class son extends Token{
    public static void main(String[] args) {
       System.out.println(Token.age); // Error
    }
}

创建非静态方法并继承受保护的成员。

public class son extends Token{
   public void test1() {
     System.out.println(age); // 6
     System.out.println(new Token().age); // 6 This also works.
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM