多态是什么
多态是 animal a=new dog();
给出父类animal,子类dog和cat
public class animal { //父类
public void eat() {
System.out.println("吃东西");
}
}
public class Cat extends animal{
public void eat() { //子类
System.out.println("猫猫酱吃鱼");
}
public void catchfish() {
System.out.println("猫猫酱抓鱼");
}
}
public class Dog extends animal{ //子类
public void eat() {
System.out.println("狗比酱吃肉");
}
public void Lookhome() {
System.out.println("狗比酱看家");
}
}
在父类中我给出了eat方法,子类对eat方法都进行了重写。
当我们在主函数中使用cat和dog中的eat方法的时候得到的结果都是重写之后的方法。
那么有一个问题
public class Demo extends animal {
public static void main(String[] args) {
Cat cat =new Cat();
Dog dog=new Dog();
method(cat);
method(dog);
}
public static void method(Dog a) {
a.eat();
}
public static void method(Cat a) {
a.eat();
}
}
既然cat和dog都是继承animal的那么有没有什么方法能够简化method方法。
多态很好的解决了这个问题
public static void method(animal a) { //animal a = Dog dog 或者animal a = Cat cat
a.eat();
if (a instanceof Dog) { \\instanceof 函数是判断是否为该类型
Dog d =(Dog)a;
d.Lookhome();
}
if (a instanceof Cat) {
Cat c = (Cat)a;
c.catchfish();
}
}
下面这段代码体现了类型转换和多态
animal b=new Dog();
Dog a=(Dog)b;
a.Lookhome();
父类引用指向子类对象
b是animal类 但是b能够使用Dog类中所有的方法
多态的成员变量访问特点:
成员变量:编译看父类,运行看父类
成员方法:编译看父类,运行看子类
举一个例子 如果父类里面有一个int i=1;
子类里面有int =2;
那么输出的是1
如果就像上面代码中的cat和dog那么输出的就是重写过的eat方法,
父类引用指向子类对象
父类的方法用子类
父类的成员变量还是用父类的