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

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

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

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

|作用域| 当前类|同一package| 子孙类| 其他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之继承中的方法重写与属性覆盖/

posted @ 2018-03-22 19:31  Hansen1  阅读(242)  评论(0)    收藏  举报