老黑讲Java之面向对象的重写

2025-12-30 02:20:39

1、父类的引用只能访问父类的成员

   在继承关系中,在编译期父类的引用只能访问父类的成员,不能访问子类的扩展部分,否则编译错误。代码如下:

public class Father {

    int age;

    public void go() {}

    

    public static void main(String[] args) {

        Father obj = new Son();

        obj.age = 56;

        obj.go();

        obj.weight = 162;//编译错误

        obj.run();//编译错误

     }

}

class Son extends Father{

    int weight;

    public void run() {}

}

分析:当父类的引用指向子类的对象时,在编译期父类的引用只能访问父类的成员,否则编译错误。

老黑讲Java之面向对象的重写

2、方法的重新

    1.子类继承父类,子类中可以重写父类的方法,言外之意方法名和参数列表与父类的方法完全相同,但具体实现不同;

    2.当父类的引用访问子类重写的方法时,编译期不会报错,而运行期则只访问子类重新后的方法。示例代码如下:

public class Father {

    int age;

    

    public void say() {

    System.out.println("我是父类");

    }

    

    public static void main(String[] args) {

        Father obj = new Son();

        obj.say();

    }

}

class Son extends Father{

    public void say() {

        System.out.println("我是子类");

    }

}

运行结果:我是子类

分析:当父类引用指向子类对象,父类引用访问子类重写后的方法时,编译期没有错误,在运行期父类引用只访问子类对象中的方法。

老黑讲Java之面向对象的重写

3、使用super关键字扩展父类的方法

子类重写父类的方法时,可以使用super关键字访问父类的方法。示例代码如下:

public class Father {

    int age;

    

    public void say() {

        System.out.println("我能说话");

    }

    

    public static void main(String[] args) {

        Father obj = new Son();

        obj.say();

    }

}

class Son extends Father{

      public void say() {

          super.say();

          System.out.println("我能唱歌");

     }

}

运行结果: 

     我能说话

     我能唱歌

分析:通过super关键字可以访问父类自有的方法。

老黑讲Java之面向对象的重写

4、重写与重载的区别(划重点)

    在程序员找工作时,“重写与重载的区别”是许多面试官最喜欢问的问题,不管新手还是老鸟掌握这个知识点对理解继承尤其重要。

    重写与重载是完全不同的语法,就像java与javascript关系一样,名字略微相同,但是完全两回事,区别如下:

    1.重载是对于一个类而言的,在一个类中定义多个方法名相同参数类表不同的方法。编译期,通过参数列表的个数和类型决定绑定哪个方法;

    2.重写是对于多个类而言的,在子类中定义与父类相同的方法。运行期,JVM根据对象的类型调用方法,比如对象的类型是父类只能调用父类方法,对象是子类类型只能调用子类重写后的方法。示例代码如下:

public class Father {

    int age;

    

    public void say() {

        System.out.println("Father类的say方法");

    }

    

    public static void main(String[] args) {

        Father obj = new Son();

        Other other = new Other();

        other.sing(obj);

   }

}

class Son extends Father{

     public void say() {

          System.out.println("Son类的say方法");

     }

}

class Other{

     public void sing(Father father) {

          System.out.println("Other类引用Father类型参数");

          father.say();

     }

     public void sing(Son son) {

          System.out.println("Other类引用Son类型参数");

          son.say();

     }

}

运行结果是:

    Other类引用Father类型参数

    Son类的say方法

分析:Other类中实现方法重载,Father与Son类实现方法重写,不难发现other.sing(obj)根据方法参数类型调用方法,father.say()调用子类重写后的方法。

老黑讲Java之面向对象的重写

5、编译期绑定和运行期绑定的概念

    1.重载遵循编译期绑定,编译期是根据方法的参数变量类型和个数访绑定哪个方法;

    2.重写遵循运行期绑定,运行期是根据对象类型访问重写的方法。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢