你不知道的Java重写

我猜这个知识点你可能会弄错。

重写:两个方法有相同的名称和相同的参数,其中一个方法位于子类,另一个方法位于这个子类的父类中。重写让子类可以在父类的基础上实现跟你更多的功能,或者实现自己的功能。

多说两句,重写是针对方法的,针对成员变量的重写有试过吗?

案例

看一下下面的代码,猜一下运行的结果是什么。

class Super {
    String s = "老";

    public String bark(){
        return s;
    }
}

class Sub extends Super {
    String s = "儿子";

    @Override
    public String bark() {
        return s;
    }
}

public class FieldOverriding {
    public static void main(String[] args) {
        Sub c1 = new Sub();
        System.out.println(c1.s);
        System.out.println(c1.bark());

        Super c2 = new Sub();
        System.out.println(c2.s);
        System.out.println(c2.bark());
    }
}

定义:在一个类中,成员变量的名称和父类相同的时候会隐藏父类的成员比那里,尽管类型不同。在子类中,父类的成员变量不能通过变量名字来引用。只能,通过它的父类来访问。
最后:我们不建议这么做,这样会让代码阅读变得困难。

运行结果:

儿子      // c1.s
儿子      // c1.bark()
老      // c2.s
儿子      // c2.bark

分析

c1和c2是相同的对象,也就是相同的class,但是c2.s为父类的内容,意味着父类和子类的成员变量都是存在的。
我们也可以这样访问:

((Super) c2).s      //注意这里的Super不是Java的关键字。

额外

重写和重载都会放在一起呗提到,初学者也经常弄混淆两者的概念。

重载:两个或更多个有相同的名称,但是有不同的参数。(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关。类型,个数,顺序

最后

这个概念在Java的官方文档中有提到,想把Java搞明白,还是要阅读官方文档,最一手的资料。
有没有觉得这个知识点很偏呢…

参考:

点赞