Java基础 | 多态的特性注意
一、多态性
多态性通常通过继承和接口实现来实现
1. 继承方式
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Cat meows");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal myDog = new Dog(); // 父类引用指向子类对象
Animal myCat = new Cat(); // 父类引用指向另一个子类对象
myDog.makeSound(); // 输出: Dog barks
myCat.makeSound(); // 输出: Cat meows
}
}
2. 接口实现方式
interface Shape {
void draw();
}
class Circle implements Shape {
@Override
void draw() {
System.out.println("Drawing a Circle");
}
}
class Square implements Shape {
@Override
void draw() {
System.out.println("Drawing a Square");
}
}
public class InterfacePolymorphismExample {
public static void main(String[] args) {
Shape myCircle = new Circle(); // 接口引用指向实现了接口的类的对象
Shape mySquare = new Square(); // 接口引用指向另一个实现了接口的类的对象
myCircle.draw(); // 输出: Drawing a Circle
mySquare.draw(); // 输出: Drawing a Square
}
}
二、多态的方法调用
当使用父类类型的引用来指向子类对象时
(如 Teacher teacher2 = new JavaTeacher("李老师", "YY学院");)
情况一:该方法 父类类型 和 子类对象 都有
以子类对象的方法执行为主,子类没有重写或实现就使用父类的
- 如果子类重写了父类中的某个方法,那么调用该方法时,将执行子类中的重写版本。
- 如果子类实现了接口中的方法,那么调用该方法时,将执行子类中的实现。
- 如果子类没有重写或实现父类或接口中的某个方法,那么调用将回退到父类中的默认实现(对于接口,这通常意味着该方法需要在子类中实现,除非它是Java 8及以后版本中的默认方法)
情况二:该方法 子类对象 独有
如果你尝试通过父类类型的引用来调用子类中独有的方法,编译器会报错,因为它不知道这个父类类型的引用是否指向了一个具有该方法实现的子类对象。
举个例子,如果 JavaTeacher 类中有一个独有的方法 teachJavaSpecifics(),而 Teacher 类中没有这个方法,那么你不能通过 teacher2 引用调用 teachJavaSpecifics() 方法,因为 teacher2 的声明类型是 Teacher,而 Teacher 类中没有这个方法。
public class JavaTeacher extends Teacher {
// ... 其他代码和重写的方法 ...
// JavaTeacher 独有的方法
public void teachJavaSpecifics() {
System.out.println("教授Java特有的内容");
}
}
// 在某个方法中
Teacher teacher2 = new JavaTeacher("李老师", "YY学院");
// 下面的调用会导致编译错误,因为 Teacher 类中没有 teachJavaSpecifics 方法
// teacher2.teachJavaSpecifics(); // 编译错误
要调用子类中独有的方法,你需要将引用类型转换为子类类型。这可以通过显式类型转换(也称为“向下转型”)来实现:
// 显式类型转换(向下转型)
if (teacher2 instanceof JavaTeacher) {
JavaTeacher javaTeacher = (JavaTeacher) teacher2;
javaTeacher.teachJavaSpecifics(); // 现在可以调用 JavaTeacher 独有的方法了
}
在使用向下转型之前,通常会使用 instanceof 运算符来检查对象是否是特定类的实例,以避免在运行时发生 ClassCastException。
1059

被折叠的 条评论
为什么被折叠?



