你不知道的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搞明白,还是要阅读官方文档,最一手的资料。
有没有觉得这个知识点很偏呢...

下面这个程序运行结果是什么?

public class Base
{
    private String baseName = "base";
    public Base()
    {
        callName();
    }

    public void callName()
    {
        System. out. println(baseName);
    }

    static class Sub extends Base
    {
        private String baseName = "sub";
        @Override
        public void callName()
        {
            System. out. println (baseName) ;
        }
    }
    public static void main(String[] args)
    {
        Base b = new Sub();
    }
}

答案解析:
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。
创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null

参考:

相关文章
|
3月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
42 5
|
4月前
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
449 1
|
5月前
|
存储 Java
|
5月前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
5月前
|
Java
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
|
5月前
|
Java
【Java基础面试十九】、构造方法能不能重写?
这篇文章指出Java中的构造方法不能被重写,因为构造方法必须与类名相同,而重写要求子类方法与父类方法同名,允许构造方法重写将违背这一规则。
【Java基础面试十九】、构造方法能不能重写?
|
5月前
|
Java
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
47 0
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
|
6月前
|
存储 Java 索引
java 中为什么重写 equals 后需要重写 hashCode
java 中为什么重写 equals 后需要重写 hashCode
80 8
|
6月前
|
编译器 Java
Java编译器注解运行和自动生成代码问题之重写init方法的问题如何解决
Java编译器注解运行和自动生成代码问题之重写init方法的问题如何解决