我在理解java中的受保护访问修饰符(或其背后的设计)时遇到了一些麻烦。我认为这意味着包访问和访问通过继承包含抽象成员的类的对象。
我写了以下示例代码。我看到如果取消注释,注释掉的行会产生编译错误。为什么我可以通过Second中的Second对象访问pro,但不能通过Second中的First对象访问pro?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
答案 0 :(得分:15)
webpage @MadProgrammer链接给出了一个不错的解释:
“protected modifier指定只能访问该成员 在它自己的包中(与package-private一样),另外,通过 另一个包中其类的子类。“
这意味着必须通过所定义的类或所述类的子类直接访问受保护的成员,同时也在相应的包中。它并不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是所涉及的包裹。
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
尝试从哪个包中访问相关成员? 第一次
包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,First
定义了package first
,因此可以protected
中的First
访问package first
成员。
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
尝试从哪个包中访问相关成员? 第二
包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 不,First
已在package first
中定义,因此protected
会使First
中的package second
无法访问该成员。
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
尝试从哪个包中访问相关成员? 第二
包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,Second
中定义的package second
继承了First
中的成员,因此protected
成员可以Second
访问package second
1}}。
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
尝试从哪个包中访问相关成员? 第一次
包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,Second
继承了First
中package first
定义的成员,因此可以protected
中的Second
访问package first
成员}}。
package first; // Current package
Third third = new Third(); // from package third and extends Second from package second,
// which extends First from package first
third.pro();
尝试从哪个包中访问相关成员? 第一次
包含所述成员的(子)类或它继承该成员的父类是否在同一个包中定义? 是的,Third
从Second
继承成员,该成员从First
继承成员,其中成员已定义(package first
),因此protected
成员可以Third
中的package first
访问。
答案 1 :(得分:1)
这是显示访问级别的图表。您的代码属于图中Convertible中的R(参考)案例。也就是说,不允许在另一个包中的子类中引用。
答案 2 :(得分:1)
java中的受保护成员
相同的包 - (它表现得像默认)
可以在同一类,它的子类以及非子类中访问它(它的行为类似于默认值) 您甚至可以使用父或子引用访问受保护的成员。
外包装 -
只有itz子类才能访问它,这里最重要的一点是所使用的引用必须是同一个子类 仅
答案 3 :(得分:0)
protected表示可以访问同一个包中的其他类。因为Second在另一个包'second.Second'中,所以它不能首先访问.pro()。
如果您在“first”的包名下创建了Second,那么它将起作用。