[英]Sub-class not able to access the protected method of super-class when the reference is of type super-class
[英]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.