首先,会大致介绍一下什么叫做向上转型,方便后续的理解
提示:以下是本篇文章正文内容,下面案例可供参考
向上转型是Java的一个多态性的表现形式。指的是一个子类的对象赋值给父类类型的引用变量。换句话说,它是将一个对象转换为它的父类类型。
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.需要注意的是,重写和重载的区别在于方法的签名(包括方法名称和参数列表),而不仅仅是方法名称相同。
好了博客到此结束咯,希望大佬们的三连,欢迎大佬们的评论哇!!