多态
多态:同一种事物,在不同时刻表现不同的状态
多态存在的三个必要条件:
–要有继承(包括接口的实现)(前提条件)
–要有重写(前提条件)
–父类引用指向子类对象
public abstract class Animal {
//成员方法
public abstract void sleep();
public abstract void eat();
//静态方法
public static void teststatic(){
System.out.println("左边的teststatic");
}
//成员变量
String a="左边的a";
}
public class Cat extends Animal {
@Override
public void sleep() {
System.out.println("猫睡觉");
}
@Override
public void eat() {
System.out.println("猫吃饭");
}
public void capture(){
System.out.println("猫捉老鼠");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃饭");
}
@Override
public void sleep() {
System.out.println("狗睡觉");
}
public static void teststatic() {
System.out.println("右边的teststatic");
}
String a = "右边的a";
public void play() {
System.out.println("狗玩耍");
}
}
public class Test {
public static void main(String[] args) {
/*
成员方法 多态方式调用 编译期间看左边类型 运行时以右边实际对象为准
静态方法 多态方式调用 编译期间和运行期间 都看左边
成员变量 多态方式调用 编译期间和运行期间 都看左边
*/
Animal dog=new Dog();//多态应用: 同一种事务,在不同时刻表现不同的状态
dog.eat();
dog.teststatic();
System.out.println(dog.a);
}
}
public class Test1 {
public static void main(String[] args) {
//向下转型,子类可以调用父类的方法
Animal dog=new Dog() ;
Animal cat=new Cat() ;
Test1 test=new Test1();
test.test(dog);
test.test(cat);
}
/*
* 向下转型缺点,无法访问子类中特定的方法
* */
public void test(Animal animal){
animal.eat();
animal.sleep();
if (animal instanceof Dog){//在运行时 检测判断 animal 中实际 包含是否是指定的类型
Dog dog=(Dog)animal; //向上转型
dog.play();
}
if (animal instanceof Cat){
Cat cat=(Cat)animal;
cat.capture();
}
}
}