多态:
同一个对象在不同时刻表现出来的不同形态。
前提:
- List item存在继承/实现关系
- 存在方法重写
- 父类引用指向子类对象
多态中成员访问特点
使用多态时,访问成员变量的特点:
编译看左边,运行看左边
使用多态时,访问成员方法的特点:
编译看左边,运行看右边public class Animal{ public int age=40; public void eat(){ System.out.println("动物吃东西"); } } public static Cat extends Animal{ oublic int age=20; public int weight =10; @Override public void eat(){ System.out.println("猫吃鱼"); } public void playGame(){ System.out.println("猫捉迷藏"); } } public class AnimalDemo { public static void main(String[] args) { //有父类引用指向子类对象 Animal a = new Cat(); System.out.println(a.age); //System.out.println(a.weight); a.eat(); //a.playGame(); //成员变量编译执行都看左边,成员方法编译看左边,执行看右边 //因为成员方法有重写,成员变量没有 } }
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{ public void lookHome(){ System.out.println("狗看家"); } } public class AnimalOpeart{ /*public void useAnimal(Cat c){ c.eat(); } public void useAnimal(Dog d){ d.eat(); }*/ //把Animal a 传入这个方法 解决不同子类传入动作类的问题 public void useAnimal(Animal a){ a.eat(); } } public class AnimalDemo{ public static void main(String[] args) { AnimalOpeart ao=new AnimalOpeart(); Cat c=new Cat(); ao.useAnimal(c); c.eat(); Dog d=new Dog(); ao.useAnimal(d); d.lookHome(); } }
public class Animal { public void eat() { System.out.println("动物吃东西"); } } public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } public void playGame() { System.out.println("猫捉迷藏"); } } public class Dog extends Animal { @Override public void eat() { System.out.println("狗吃骨头"); } } public class AnimalDemo { public static void main(String[] args) { //向上转型 Animal a = new Cat(); a.eat(); //向下转型 Cat c = (Cat) a; c.eat(); c.playGame(); //向上转型 a = new Dog(); a.eat(); //向下转型 //classCastException 类型转换异常 // Cat cc=(Cat) a; // cc.eat(); //cc.playGame(); } }
public class Animal { private String name; private int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void eat(){ System.out.println("动物吃东西"); } } public class Cat extends Animal { public Cat() { } public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } } public class Dog extends Animal{ public Dog() { } public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("狗吃骨头"); } } public class AnimalDemo { public static void main(String[] args) { Animal a =new Cat(); a.setName("加菲猫"); a.setAge(5); System.out.println(a.getName()+","+a.getAge()); a.eat(); a=new Cat("大花猫",6); System.out.println(a.getName()+","+a.getAge()); a.eat(); System.out.println("--------------"); Animal d=new Dog(); d.setName("二哈"); d.setAge(6); System.out.println(d.getName()+","+d.getAge()); d.eat(); d=new Dog("大黄",5); System.out.println(d.getName()+","+d.getAge()); d.eat(); } }