我在A
中有一个package1
课程,而B
中的package2
继承了A
。 A
包含m1
方法protected
。现在我的疑问是,当我在B
的另一个班级C
中创建package2
的对象时,B
的对象无法访问方法m1
为什么?以下是我的代码
package com.package1;
public class A {
protected void m1(){
System.out.println("I'm protectd method of A");
}
}
package com.package2;
import com.package1.A;
public class B extends A {
public static void main(String[] args) {
B b = new B();
b.m1(); // b object able to access m1
}
}
package com.package2;
public class C {
public static void main(String[] args) {
System.out.println("Hi hello");
B b = new B();
b.m1(); //The method m1() from the type A is not visible
}
}
超类的受保护方法在子类中变为私有吗?
答案 0 :(得分:5)
来自JLS 6.6.2. Details on protected Access
对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它。
设C是声明受保护成员的类。只允许在C的子类S的主体内访问。
意味着 protected
修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中使用其类的子类封装
来自Java Doc Controlling Access to Members of a Class
因此,您可以访问类m1
中的方法B
,即使它不在同一个包中,因为它是A
的子类。
但是,您无法从类m1
访问方法C
,因为它既不在A
的同一个包中,也不在A
的子类中。
因此,要访问此方法,您可以将方法m1
公开,或将您的班级C
移至与班级A
相同的包中