还没搞懂重写和重载吗?这篇文章可以帮助你

简介: 还没搞懂重写和重载吗?这篇文章可以帮助你

前言

首先,会大致介绍一下什么叫做向上转型,方便后续的理解


提示:以下是本篇文章正文内容,下面案例可供参考

一、向上转型

1.概念:

向上转型是Java的一个多态性的表现形式。指的是一个子类的对象赋值给父类类型的引用变量。换句话说,它是将一个对象转换为它的父类类型。

2.CODE

class Animal {
    public void eat() {
        System.out.println("Animal is eating.");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking.");
    }
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // 直接通过子类对象调用父类方法
        dog.bark(); // 调用子类特有的方法

        Animal animal = dog; // 向上转型,将Dog对象赋值给Animal类型的引用变量
        Animal animal1 = new Dog();//也可以这样子
        animal.eat();
        animal.eat(); // 通过父类引用调用父类方法
        // animal.bark(); // 错误,父类引用无法调用子类特有的方法
    }
}

在上述示例中,Dog 类继承自 Animal 类。通过向上转型,我们将 Dog 对象赋值给 Animal 类型的引用变量 animal。虽然 animal 是 Animal 类型的引用,但实际上它引用的是 Dog 类的对象。因此,我们可以通过 animal 调用 Animal 类的方法,但无法调用 Dog 类特有的方法。

二、重写

1.发生在子类和父类之间。

2.子类通过定义一个与父类中具有相同名称、参数列表和返回类型的方法来重写父类的方法。

3.重写方法在运行时动态绑定,即根据实际对象的类型确定调用哪个方法。

4.重写方法可以访问和修改父类中的非私有成员

5.重写方法可以修改方法的行为,实现自定义的逻辑。

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Cat meows.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.makeSound(); // 输出:Animal makes a sound.

        Cat cat = new Cat();
        cat.makeSound(); // 输出:Cat meows.

        Animal animalCat = new Cat();
        animalCat.makeSound(); // 输出:Cat meows.,动态绑定到 Cat 类的 makeSound() 方法
    }
}

看到虽然向上转型了,但是调用的依然是子类的方法。

动态和静态绑定在文末

三.重载

1.发生在同一个类中,或者在父类和子类之间。

2.同一个类中的方法可以有相同的名称,但参数列表必须不同(参数的类型、顺序或数量)。

3.重载方法在编译时静态绑定,即根据调用方法时传递的参数类型来确定调用哪个方法。

4.重载方法不能修改已有方法的行为,只是提供了更多的方法签名选项,用于处理不同的参数组合

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public String add(String a, String b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        int result1 = calculator.add(2, 3);
        System.out.println(result1); // 输出:5

        double result2 = calculator.add(2.5, 3.5);
        System.out.println(result2); // 输出:6.0

        String result3 = calculator.add("Hello", "World");
        System.out.println(result3); // 输出:HelloWorld
    }
}

所以只是提供了更多的方法签名选项,用于处理不同的参数组合。

四.动态和静态绑定

1.当说重载方法在编译时静态绑定,是指在编译时期就确定了要调用哪个重载方法,而不是在运行时动态决定。

当我们调用一个重载方法时,编译器会根据我们传递的参数类型来确定要调用哪个重载方法。这个决定是在编译时期完成的,因此称为静态绑定。

比如上述图片中calculator就是根据前面是int还是double类型确定调用哪个方法

2.动态绑定(Dynamic binding)是指在程序运行时根据对象的实际类型确定要调用的方法。在动态绑定中,方法的调用是根据对象的实际类型来决定的,而不是根据变量的声明类型或编译时期的类型来决定。

动态绑定通常与多态性(Polymorphism)相关联。当使用父类类型的引用变量引用子类对象时,如果调用的方法在子类中被重写,那么在运行时会根据对象的实际类型来决定调用的方法。就是仍然调用子类的方法

总结

1.重写是子类对父类方法的重新实现,重载是在同一个类中或父子类之间对方法名称的多次定义。

2.重写关注于继承关系,子类重写父类的方法。

3.重载关注于方法的参数列表,同一个类中的方法可以有不同的参数列表。

4.重写方法在运行时动态绑定,重载方法在编译时静态绑定。

5.需要注意的是,重写和重载的区别在于方法的签名(包括方法名称和参数列表),而不仅仅是方法名称相同。

好了博客到此结束咯,希望大佬们的三连,欢迎大佬们的评论哇!!

目录
相关文章
|
1月前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
1月前
|
Java
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
32 0
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
|
3月前
|
编译器 C++ 开发者
通俗讲解 初学者一文看懂!虚函数、函数重载、重写的区别
函数重载允许在同一作用域内定义同名但参数列表不同的函数,提高代码灵活性和可读性,避免命名冲突。通过参数类型自动选择合适版本,如C++中的`print()`可处理整数、浮点数和字符串。虚函数实现运行时多态,基类指针调用时调用实际对象的版本。抽象类至少有一个纯虚函数,不能实例化,用于定义接口规范。抽象类和纯虚函数是构建多态和继承体系的基础,提供接口标准,减少代码冗余,增强代码清晰性和可维护性。
|
9月前
|
Java 编译器
八股文-Java方法的重载与重写
在 Java 中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。
109 2
八股文-Java方法的重载与重写
|
4月前
|
C++
面试题:重写和重载的区别
面试题:重写和重载的区别
26 0
|
C++
【C++知识点】重载
【C++知识点】重载
93 0
|
安全 Java 编译器
重温C与C++之构造函数
C++进阶之构造函数
122 0
|
Java
java多态进阶,吃透多态,这一篇就够了
1.动态绑定机制 java的动态绑定机制非常重要🎈 实例A 我们来看一个实例:
85 1
java多态进阶,吃透多态,这一篇就够了
|
编译器 C++
<C++>搞明白构造函数和析构函数有这一篇就够了
<C++>搞明白构造函数和析构函数有这一篇就够了
1172 1
<C++>搞明白构造函数和析构函数有这一篇就够了