在尝试访问受保护的成员时,我无法获得某些内容。 通常我们说可以通过调用(int protected;)这种方式从同一个包或子类访问受保护的成员
System.out.println(protected);
但是当尝试通过对象调用成员时会发生奇怪的事情。 这是我做了什么,没有得到 我有3个包
1- javaapplication1 //the root package
|- javaapplication1.entities (inside javaaplication1)
|- javaapplication1.newpackage (inside javaapplication1 also)
我有3节课 实体包中的Personne.java和Employe,以及newpackage中的AlphaEmploye
Personne.java:
package javaapplication1.entities;
import javaapplication1.newpackage.AlphaEmploye;
public class Personne {
private int i;
protected int j;
public int k;
public Personne(){
i=8;
j=9;
k=10;
}
@Override
public String toString() {
return "Personne{" + "i=" + i + ", j=" + j + ", k=" + k + '}';
}
public void test(Personne p, Employe e, AlphaEmploye ae){
System.out.println(" "+p.i+p.j+p.k);
System.out.println(" "+e.i+e.j+e.k); //e.i doesn't work <-- explain this
System.out.println(" "+ae.i+ae.j+ae.k); //ae.i doesn't work
}
}
员工班:
package javaapplication1.entities;
import javaapplication1.newpackage.AlphaEmploye;
public class Employe extends Personne{
public Employe(){
}
public void test(Personne p, Employe e, AlphaEmploye ae){
System.out.println(" "+p.i+p.j+p.k); // p.i doesn't work
System.out.println(" "+e.i+e.j+e.k); // e.i doesn't work <-- explain this
System.out.println(" "+ae.i+ae.j+ae.k); //ae.i doesn't work <-- explain why ae.j works
}
}
和AlphaEmploye
package javaapplication1.newpackage;
import javaapplication1.entities.Employe;
import javaapplication1.entities.Personne;
public class AlphaEmploye extends Personne{
public AlphaEmploye(){
}
public void test(Personne p, Employe e, AlphaEmploye ae){
System.out.println(" "+p.i+p.j+p.k); //p.i AND p.j doesn't work <-- explain this
System.out.println(" "+e.i+e.j+e.k); // e.i AND e.j doesn't work <-- explain this
System.out.println(" "+ae.i+ae.j+ae.k);// ae.i doesn't work <-- explain this
}
}
我确实知道保护修饰符通常会做什么,但是当试图从对象中调用受保护的成员时,我不知道会发生什么。
关闭这个问题的人粘贴了一个不回答我的问题。 这是链接说的/
设C是声明受保护成员的类。只允许在C的子类S的主体内访问。
此外,如果Id表示实例字段或实例方法,则:
表达式Q的If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type
是S或S的子类。
如果访问是通过字段访问表达式E.Id,其中E是a 主表达式,或方法调用表达式E.Id(...), 其中E是主表达式,如果和,则允许访问 只有当E的类型是S或S的子类时。
这是如何解释通过对象的访问如何工作以及为什么我可以从雇员班到达ae.j作品。 请在结束前阅读,或者告诉我为什么你认为它已经得到了解答。它只处理一种情况,甚至没有解释其背后的逻辑。