JDK 1.8下 多态的实现
第一种方法:使用lambda表达式 既可以用接口 也可以用一般的父类
第二种方法:使用Consumer函数接口实现
package duotai;
import java.util.function.Consumer;
abstract class Animal {
public abstract void makeSound();
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class Duotai {
public static void main(String[] args) {
Animal[] animals = new Animal[3];
animals[0] = new Animal() {
@Override
public void makeSound() {
System.out.println("Animal makes sound");
}
};
animals[1] = new Dog();
animals[2] = new Cat();
// 使用 Lambda 表达式 接口和类都可以
for (Animal animal : animals) {
animal.makeSound();
}
// 使用 Consumer 函数式接口实现多态
// Consumer<Animal> soundConsumer = Animal::makeSound;
// for (Animal animal : animals) {
// soundConsumer.accept(animal);
// }
}
}
注意 在 @override 重写父类方法的时候仍然要用public 保证可视性不会降低
关于 Consumer 的用法:
要注意 consumer不能对迭代类型中的元素进行修改
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class Mine {
public static void main(String[]args) {
List<String> names = Arrays.asList("Alice", "Bob", "Christie");
Consumer<String> printName = (name) -> System.out.println(name);
names.forEach(printName);
}
}
有个重要的点:
在入口类中编写的函数必须用static修饰!!!
因为我们不会创建 Main的实例 所以必须要静态方法才能调用!服了,自学Java一言难尽……