package com.pro;
public class Parent {
protected int parent = 4;
protected static int staticPrivate = 3;
protected void met(){}
protected static void smet(){}
}
package com.pro.child1;
import com.pro.Child0;
import com.pro.Parent;
import com.pro.child2.Child2;
/**
* 与父类P不在同一个包的某个子类C1,
* C1只能在C1内部(直接使用或通过生成C1实例的方式)使用P的protected属性或方法。
*
* C1不能通过生成P的C2子类实例的方式来调用C2的extends自P的protected属性或方法,
* 无论C2与P同包还是与C1同包,或在其他的包。
*
* 与父类P在同一个包的某个子类C3,
* C3可以通过生成P的C4子类实例的方式来调用C4的extends自P的protected属性或方法,
* 无论C4在哪个包。
*
* 当P的属性或方法被static修饰时:
* (无论与父类P在不在同一个包的)某个子类C1可以通过类名C.属性名/方法名的方式调用属性/方法,C是P的任意包的子类。
* 与类P在同一个包的类O(非P的子类),可以通过类名C.属性名/方法名的方式调用属性/方法名,C是P的任意包的子类。
* 与类P在不同一个包的类O(非P的子类),在任何情况下都不能通过类名C.属性名/方法名的方式调用属性/方法名。
*
*/
public class Child1 extends Parent{
private void test(){
System.out.println(this.parent);
this.met();
Child1 c1 = new Child1();
System.out.println(c1.parent);
c1.met();
System.out.println(Child1.staticPrivate);
System.out.println(Child2.staticPrivate);
System.out.println(Child0.staticPrivate);
Child1.smet();
Child2.smet();
Child0.smet();
}
private void otherPackBrother(){
Child2 c2 = new Child2();
System.out.println(c2.parent);
c2.met();
}
private void samePackBrother(){
Child1_2 c1_2 = new Child1_2();
System.out.println(c1_2.parent);
c1_2.met();
}
private void parentPackBrother(){
Child0 c0 = new Child0();
System.out.println(c0.parent);
c0.met();
}
}
package com.pro.child2;
import com.pro.Parent;
public class Child2 extends Parent{
private void test(){
System.out.println(this.parent);
}
}
package com.pro.child1;
import com.pro.Parent;
public class Child1_2 extends Parent{
}
package com.pro;
import com.pro.Parent;
import com.pro.child1.Child1;
import com.pro.child2.Child2;
public class Child0 extends Parent{
private void test(){
System.out.println(this.parent);
Child0 c1 = new Child0();
System.out.println(c1.parent);
System.out.println(Child1.staticPrivate);
System.out.println(Child2.staticPrivate);
System.out.println(Child0.staticPrivate);
Child1.smet();
Child2.smet();
Child0.smet();
}
private void otherPackBrother(){
Child2 c2 = new Child2();
System.out.println(c2.parent);
c2.met();
}
private void samePackBrother(){
Child0_2 c0_2 = new Child0_2();
System.out.println(c0_2.parent);
c0_2.met();
}
}
package com.pro;
import com.pro.Parent;
public class Child0_2 extends Parent{
}
package com.pro;
import com.pro.Parent;
import com.pro.child1.Child1;
import com.pro.child2.Child2;
public class Other{
private void test(){
System.out.println(Child1.staticPrivate);
System.out.println(Child2.staticPrivate);
System.out.println(Child0.staticPrivate);
Child1.smet();
Child2.smet();
Child0.smet();
}
private void otherPackBrother(){
Child2 c2 = new Child2();
System.out.println(c2.parent);
c2.met();
}
private void samePackBrother(){
Child0_2 c0_2 = new Child0_2();
System.out.println(c0_2.parent);
c0_2.met();
}
}
package com.pro.child1;
import com.pro.Child0;
import com.pro.Parent;
import com.pro.child2.Child2;
public class other1 {
private void test(){
System.out.println(Child2.staticPrivate);
System.out.println(Child0.staticPrivate);
Child1.smet();
Child2.smet();
Child0.smet();
}
private void otherPackBrother(){
Child2 c2 = new Child2();
System.out.println(c2.parent);
c2.met();
}
private void samePackBrother(){
Child1_2 c1_2 = new Child1_2();
System.out.println(c1_2.parent);
c1_2.met();
}
private void parentPackBrother(){
Child0 c0 = new Child0();
System.out.println(c0.parent);
c0.met();
}
}