public class InstanceofDemo {
public static void main(String[] args) {
Animal a = new Dog("旺财");
// 老写法:判断 + 强转,两步
if (a instanceof Dog) {
Dog d = (Dog) a;
d.fetch();
}
// JDK 16+ 模式匹配:判断 + 绑定变量一步到位(本站后端常用)
if (a instanceof Dog d) {
d.fetch(); // d 已自动转型
}
// 危险操作:ClassCastException
Animal c = new Cat("咪咪");
if (c instanceof Dog d2) { // 不会进这个分支
d2.fetch();
} else {
System.out.println("猫不是狗,强转前必须 instanceof");
}
}
}
步骤 4:抽象类——半成品模板
abstract class Payment { // 抽象类:不能 new
protected String channel;
public Payment(String channel) { this.channel = channel; }
public abstract void pay(double amount); // 抽象方法:只声明不实现,子类必须实现
public void log(double amount) { // 具体方法:公共逻辑放这
System.out.printf("[%s] 支付 %.2f 元%n", channel, amount);
}
}
class WechatPay extends Payment {
public WechatPay() { super("微信"); }
@Override
public void pay(double amount) { log(amount); System.out.println("调用微信支付 API"); }
}
class AlipayPay extends Payment {
public AlipayPay() { super("支付宝"); }
@Override
public void pay(double amount) { log(amount); System.out.println("调用支付宝 API"); }
}
public class AbstractDemo {
public static void main(String[] args) {
Payment[] channels = { new WechatPay(), new AlipayPay() };
for (Payment p : channels) {
p.pay(99.9); // 新增支付方式无需改这里 → 开闭原则
}
}
}
步骤 5:接口——行为契约
interface Cacheable { // 接口:纯行为约定
void put(String key, String value); // 抽象方法,隐式 public abstract
String get(String key);
default String getOrDefault(String key) { // JDK 8+ default 方法
String v = get(key);
return v != null ? v : "默认值";
}
}
interface Expirable {
void expireAfter(int seconds);
}
// 类可以实现多个接口(弥补 Java 单继承限制)
class RedisCache implements Cacheable, Expirable {
private final java.util.Map<String, String> data = new java.util.HashMap<>();
@Override
public void put(String key, String value) { data.put(key, value); }
@Override
public String get(String key) {
return data.get(key);
}
@Override
public void expireAfter(int seconds) {
System.out.println("设置 " + seconds + " 秒过期(模拟 Redis TTL)");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
Cacheable cache = new RedisCache(); // 用接口类型接收 → 面向接口编程
cache.put("user:1001", "tom");
System.out.println(cache.get("user:1001"));
System.out.println(cache.getOrDefault("user:9999"));
((Expirable) cache).expireAfter(300);
}
}
步骤 6:Object 三大方法速览
import java.util.Objects;
class Point {
int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
@Override
public String toString() { return "(" + x + "," + y + ")"; }
@Override
public boolean equals(Object o) {
if (this == o) return true; // 同一对象快速返回
if (!(o instanceof Point p)) return false; // 类型不符直接 false
return x == p.x && y == p.y;
}
@Override
public int hashCode() { return Objects.hash(x, y); } // 重写 equals 必须配套重写
}
public class ObjectDemo {
public static void main(String[] args) {
Point p1 = new Point(1, 2), p2 = new Point(1, 2);
System.out.println(p1 == p2); // false:不同对象
System.out.println(p1.equals(p2)); // true:内容相等
System.out.println(p1.hashCode() == p2.hashCode()); // true
}
}