Java protected!
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(); } }