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 的用法:
image
image

要注意 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一言难尽……

posted @ 2023-07-29 12:56  N0zoM1z0  阅读(3)  评论(0编辑  收藏  举报