多态初学习

一、多态:灵活性的灵魂

  1. 什么是多态?
    多态(Polymorphism)的字面含义是“多种形态”。在Java中,它允许不同的对象对同一消息做出不同的响应。例如,动物类Animal的子类Dog和Cat可以分别实现自己的eat()方法,而调用时通过父类Animal的引用触发具体子类的行为。

多态的实现基础:

继承:子类继承父类并重写方法。

接口:不同类实现同一接口的方法。

  1. 编译时多态 vs 运行时多态
    编译时多态(静态绑定)
    通过方法重载(Overload)实现。编译器在编译阶段即可确定调用的方法。

java
复制
class Calculator {
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
}
调用add(2,3)和add(2.0,3.0)时,编译器根据参数类型选择对应方法。

运行时多态(动态绑定)
通过方法重写(Override)实现。具体调用哪个方法由JVM在运行时决定。

java
复制
class Animal {
void speak() { System.out.println("Animal speaks"); }
}

class Dog extends Animal {
@Override
void speak() { System.out.println("Woof!"); }
}

public class Main {
public static void main(String[] args) {
Animal myPet = new Dog(); // 父类引用指向子类对象
myPet.speak(); // 输出 "Woof!"
}
}
3. instanceof运算符:安全的类型检测
向下转型(Downcasting)时,如果类型不匹配会抛出ClassCastException。instanceof可以避免这一问题。

java
复制
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 安全强制转换
dog.bark();
}
二、Object类:万物之基类
Java中所有类都隐式继承Object类。以下是其核心方法:

  1. getClass()
    返回对象的运行时类信息(Class对象),可用于反射。

java
复制
Dog dog = new Dog();
Class<?> clazz = dog.getClass();
System.out.println(clazz.getSimpleName()); // 输出 "Dog"
2. toString()
返回对象的字符串表示。默认实现为类名@哈希码,建议重写以提供有意义的信息。

java
复制
@Override
public String toString() {
return "Dog{name='" + name + "'}";
}
3. equals() 与 hashCode()
equals():默认比较对象地址,重写后可按内容比较。

hashCode():返回对象的哈希码。重写equals()时必须同时重写hashCode(),确保哈希一致性。

java
复制
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Dog dog = (Dog) obj;
return Objects.equals(name, dog.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}

posted @ 2025-04-13 21:59  f-52Hertz  阅读(23)  评论(0)    收藏  举报