Java 中的 实现、泛型
弥补 Java 单继承的不足一个类只能继承 1 个父类但可以实现多个接口比如class A extends B implements C, D实现 多继承的效果定义行为标准接口封装 能做什么实现类负责 怎么做解耦行为规范和具体实现接口多态的核心基础。示例代码// 1. 定义接口封装行为规范只有方法签名无实现 public interface AnimalBehavior { // 抽象方法无方法体 void eat(); void move(); // 默认方法JDK8有默认实现实现类可重写 default void breathe() { System.out.println(动物呼吸空气); } } // 2. 实现类必须实现接口的所有抽象方法 public class Dog1 implements AnimalBehavior { Override public void eat() { System.out.println(狗啃骨头); } Override public void move() { System.out.println(狗跑); } // 可选重写接口的默认方法 Override public void breathe() { System.out.println(狗用鼻子呼吸); } public static void main(String[] args) { Dog1 dog1 new Dog1(); dog1.eat(); // 输出狗啃骨头 dog1.move(); // 输出狗跑 dog1.breathe();// 输出狗用鼻子呼吸 } }二、泛型Generics定义参数化类型—— 允许在定义类、接口、方法时使用 类型参数编译时指定具体类型从而实现类型安全和代码复用。类比快递箱泛型类可以装任何物品类型参数你在使用时指定装 书籍String或 电子产品Integer箱子就只接受对应类型避免装错。作用类型安全编译时检查类型避免运行时 ClassCastException强制类型转换异常代码复用一套代码支持多种类型无需为不同类型重复编写消除冗余的强制类型转换。泛型类示例// 自定义泛型类BoxTT是类型参数可以任意命名常用T/E/K/V public class BoxT { private T content; // 泛型方法设置内容 public void setContent(T content) { this.content content; } // 泛型方法获取内容 public T getContent() { return content; } // 测试泛型类 public static void main(String[] args) { // 1. 指定T为String类型 BoxString stringBox new Box(); stringBox.setContent(Hello 泛型); String str stringBox.getContent(); // 无需强制转换 System.out.println(str); // 输出Hello 泛型 // 2. 指定T为Integer类型 BoxInteger integerBox new Box(); integerBox.setContent(100); Integer num integerBox.getContent(); System.out.println(num); // 输出100 // 3. 类型安全编译时检查避免装错类型 // stringBox.setContent(100); // 编译错误不能将Integer赋值给String类型的Box } }泛型方法独立于类的泛型示例public class GenericMethodDemo { // 泛型方法T是方法的类型参数T[]是参数类型T是返回类型 public static T T getFirstElement(T[] array) { if (array null || array.length 0) { return null; } return array[0]; } public static void main(String[] args) { String[] strArray {Java, 泛型, 教程}; Integer[] intArray {1, 2, 3, 4}; // 调用泛型方法自动推断类型 String firstStr getFirstElement(strArray); Integer firstInt getFirstElement(intArray); System.out.println(firstStr); // 输出Java System.out.println(firstInt); // 输出1 } }泛型通配符?、? extends T、? super T示例// 父类抽象的动物 public class Animal { // 父类属性 protected String name; // protected子类可直接访问 // 父类构造方法 public Animal(String name) { this.name name; } // 父类方法 public void eat() { System.out.println(name 在吃食物); } // 父类方法 public void sleep() { System.out.println(name 在睡觉); } } // 子类Dog2继承Animal public class Dog2 extends Animal { // 子类特有属性 private String breed; // 品种 // 子类构造方法必须通过super调用父类构造 public Dog2(String name, String breed) { super(name); // 调用父类的构造方法 this.breed breed; } // 重写Override父类方法扩展/修改父类行为 Override public void eat() { System.out.println(name breed 在啃骨头); } // 子类特有方法扩展父类功能 public void bark() { System.out.println(name 在汪汪叫); } } // 子类Cat继承Animal public class Cat extends Animal { public Cat(String name) { super(name); } // 重写eat方法 Override public void eat() { System.out.println(name 在吃小鱼干); } // 子类特有方法 public void meow() { System.out.println(name 在喵喵叫); } } public class GenericWildcardDemo { // 通配符?表示任意类型只读不能添加元素 public static void printList(List? list) { for (Object obj : list) { System.out.print(obj ); } System.out.println(); } // 上限通配符? extends Animal只能是Animal或其子类 public static void feedAnimals(List? extends Animal animals) { for (Animal animal : animals) { animal.eat(); } } // 下限通配符? super Dog2只能是Dog2或其父类 public static void addDog(List? super Dog2 list) { list.add(new Dog2(旺财, 金毛)); // 可以添加Dog或其子类 } public static void main(String[] args) { ListDog2 dogs new ArrayList(); dogs.add(new Dog2(旺财, 金毛)); ListCat cats new ArrayList(); cats.add(new Cat(咪宝)); // 通配符? printList(dogs); // 输出Dog26f496d9f - 旺财 printList(cats); // 输出Cat723279cf - 咪宝 // 上限通配符? extends Animal feedAnimals(dogs); // 输出旺财金毛在啃骨头 feedAnimals(cats); // 输出咪宝在吃小鱼干 // 下限通配符? super Dog ListAnimal animals new ArrayList(); addDog(animals); System.out.println(animals.size()); // 输出1