JAVA成员与方法的继承与覆盖中的有趣点
要了解Java继承中的方法重写与属性覆盖,可以参考文章
Java之继承中的方法重写与属性覆盖
我接下来只说说我发现的几个有趣点。
谈到继承,首先我们很容易想到protected关键字,下面我先列出java中
访问权限修饰词及其对应的权限(不写时默认为friendly ),后面的讲解会用到这个表
作用域 | 当前类 | 同一package | 子孙类 |
---|---|---|---|
public | √ | √ | √ |
protected | √ | √ | √ |
friendly | √ | √ | × |
private | √ | × | × |
- 方法与成员的覆盖的一点区别
class Super{
int a=1;//默认设置D.a=1;
public int getA(){
System.out.print("D:");
return a;
}
}
class Sub extends Super{
int a;
public int getA(){
System.out.print("B:");
return a;
}
public Sub(int a){
this.a=a;
}
}
public class A {
public static void main(String[] args){
Super d=new Sub(0);
System.out.println(d.a);//这个输出的Super中的a值1
System.out.println(d.getA());//这儿输出的是Sub中的a值0
}
}
输出结果:
1
B:0
可以看到继承中方法可以覆盖(多态),但属性的值只与引用的类型(Super)有关,与其指向的实例无关
2,继承时,protected属性修饰的成员可以被子类继承,但在其它其它包中,却对父类本身不可见!!!可参看
前面的表
package inittest;
public class A {
protected int a=1;
}
//A与Test在不同的包
import inittest.A;
public class Test extends A implements Serializable {
public static void main(String[] args){
A aa=new A();
A b=new Test();
Test c=new Test();
System.out.println(aa.a);//编译不通过
System.out.println(b.a);//编译不通过
System.out.println(c.a);//编译通过
}
}
暂时只发现这两点,先记录下,日后再补充