JAVA成员与方法的继承与覆盖中的有趣点

JAVA成员与方法的继承与覆盖中的有趣点

要了解Java继承中的方法重写与属性覆盖,可以参考文章
Java之继承中的方法重写与属性覆盖
我接下来只说说我发现的几个有趣点。

谈到继承,首先我们很容易想到protected关键字,下面我先列出java中
访问权限修饰词及其对应的权限(不写时默认为friendly ),后面的讲解会用到这个表

作用域 当前类 同一package 子孙类
public
protected
friendly ×
private × ×
  1. 方法与成员的覆盖的一点区别
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);//编译通过
    }
}

暂时只发现这两点,先记录下,日后再补充

[1]http://yunnigu.dropsec.xyz/2016/09/25/Java%E4%B9%8B%E7%BB%A7%E6%89%BF%E4%B8%AD%E7%9A%84%E6%96%B9%E6%B3%95%E9%87%8D%E5%86%99%E4%B8%8E%E5%B1%9E%E6%80%A7%E8%A6%86%E7%9B%96/

你可能感兴趣的:(JAVA成员与方法的继承与覆盖中的有趣点)