代码示例说明:
1)父类A:有三个方法分别是public、protected、default的
package com.cn;
public class A {
public void a(){
System.out.println("A.a");
}
protected void b() {
System.out.println("A.b");
}
void c() {
System.out.println("A.c");
}
}
2)同一个包中的子类B:注意这是在同一个包中,main方法是测试用的,可以看到访问权限。
package com.cn;
public class B extends A {
public static void main(String[] args) {
B b = new B();//同一个包中可以继承public 、protected 、缺省的方法
b.a();
b.b();
b.c();
}
}
同一个包中的另外一个非A的子类来测试:
package com.cn;
public class Y {
public static void main(String[] args) {
B b = new B();//A 与 Y 是在同一个包所以B继承的A的方法在Y中都是可以使用的。
b.a();
b.b();
b.c();
}
}
3)另外一个包中的子类C:注意这是另外一个包中了,main方法来测试:
package com.dai;
import com.cn.A;
public class C extends A {
public static void main(String[] args) {
C c = new C();//不同包只能继承protected、public方法。但是继承的protected
//方法只能在该类的类部使用,不能再其他类中使用。除非重写这个
//方法。
c.a();
c.b();
}
}
另外一个与C在同一个包中的测试用例类,用来查看可以使用类C中的那些方法:
package com.dai;
public class H {
public static void main(String[] args) {
C c = new C();
c.a();//这是可以的
//c.b();这个是不行的。应为这个是父类中的方法,子类C并没有去重写。protected
//方法只能在同一个类,同一个包,或者该类的子类中使用,而H不是A的子类所以
//不能使用。
}
}
在与父类A同包中使用C:
package com.cn;
import com.dai.C;
public class Y {
public static void main(String[] args) {
/*B b = new B();//A 与 Y 是在同一个包所以B继承的A的方法在Y中都是可以使用的。
b.a();
b.b();
b.c();*/
C c = new C();//可以使用c中的所有继承的方法
c.a();
c.b();
}
}
总结:
当子类和父类在同一个包时子类继承父类中的public/protected/默认级别的变量个方法 ,在不同包时继承public/protected级别的变量和方法。这是大方向。
在访问修饰符的约束下,protected方法只能在同一个类,同一个包,该类的子类使用,所以当父类与子类没有在同一个包中,子类继承父类的protected方法是,继承是允许的,但是当我们通过子类使用这个方法时,只能在该子类的内部使用或者在父类的内部,及与父类同包的类中使用。
这儿说了两个问题,子类继承父类中的方法,首先要看有没有继承的资格;当有资格继承后,我们使用子类中该继承的方法是还要看在使用的地方是否有权限使用这个方法的,即是判断父类中的该方法,使用的地方是否可以访问到。
但我们在子类中重写这个方法时,使用时判断权限的依据就不是父类了,而就是该子类。