一个对象在不同时刻体现出来的不同形态
举例 : 一只猫对象
public class Animal {
public void eat(){
System.out.println("吃东西");
}
}
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼。。。。");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头。。。");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal a = new Cat();
a.eat();
Animal b = new Dog();
b.eat();
}
}
运行程序后结果如下:
D:\jdk17\bin\java.exe "-javaagent:D:\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=58814:D:\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Linuxshare\StartJava\out\production\StartJava;E:\Linuxshare\StartJava\lib\jl-1.0.1.jar com.itheima.polymorphism_demo.AnimalTest
猫吃鱼。。。。
狗吃骨头。。。
Process finished with exit code 0
public class Fruit {
int num=100;
public void show(){
System.out.println("父类的show方法");
}
}
public class Apple extends Fruit{
int num=10;
@Override
public void show() {
System.out.println("子类的show方法");
}
public void showNum(){
System.out.println(this.num);
}
}
D:\jdk17\bin\java.exe "-javaagent:D:\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=59076:D:\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Linuxshare\StartJava\out\production\StartJava;E:\Linuxshare\StartJava\lib\jl-1.0.1.jar com.itheima.polymorphism_demo.FruitTest
100
Process finished with exit code 0
public abstract class Animal {
private String breed;
private String color;
public Animal() {
}
public Animal(String breed, String color) {
this.breed = breed;
this.color = color;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract void eat();
}
public class Cat extends Animal{
public Cat() {
}
public Cat(String breed, String color) {
super(breed, color);
}
@Override
public void eat() {
System.out.println("猫吃鱼...");
}
public void catchMouse() {
System.out.println("抓老鼠...");
}
}
public class Dog extends Animal{
public Dog() {
}
public Dog(String breed, String color) {
super(breed, color);
}
@Override
public void eat() {
System.out.println("狗吃骨头!");
}
public void lookDoor(){
System.out.println("狗看门...");
}
}
public class Pig extends Animal{
public Pig() {
}
public Pig(String breed, String color) {
super(breed, color);
}
@Override
public void eat() {
System.out.println("猪拱白菜...");
}
public void sleep() {
System.out.println("一直再睡...");
}
}
/*
如果方法的参数是一个类的话 , 那么调用此方法需要传入此类的对象 , 或者子类对象
多态的好处 :
提高代码的扩展性 , 灵活性
多态的缺点:
不能调用子类的特有功能
*/
public class AnimalTest {
public static void main(String[] args) {
userAnimal(new Cat());
System.out.println("-------------");
}
public static void userAnimal(Animal a){
a.eat();
// 向下转型,使用子类的方法
if(a instanceof Cat){
Cat cat = (Cat) a;
cat.catchMouse();
}
if(a instanceof Dog){
Dog dog=(Dog)a;
dog.lookDoor();
}
if(a instanceof Pig) {
((Pig) a).sleep();
}
}
}
异常代码如下
public static void main(String[] args) {
Animal a = new Cat();
useAnimal(a);
}
public static void useAnimal(Animal a) {
Dog d = (Dog) a;
d.eat();
}