多态概念:
在不同情况下,一个对象呈现不同的状态
Cat cat=new Cat(); Animal c=cat;
猫的对象可以是动物,也可以是猫本身,
多态的三个条件:
1),在继承或者实现体系内;
2),有方法重写
3),父类引用指向子类对象
而三个条件可以看为是一个条件,就是父类引用指向子类对象,因为有父类子类,肯定就是在继承体系中,而方法重写不是非必要的,可以有,也可以没有,但是如果没有那么多态一般也没有什么意义;
多态中的成员访问特点:
public class Animal {
public int age=40;
public void eat(){
System.out.println("动物进食");
}
}
public class Cat extends Animal{
public int age=20;
public double weight;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("玩球");
}
}
public class Test {
public static void main(String[] args) {
Animal a =new Cat();
a.eat();
// System.out.println(a.weight);
System.out.println(a.age);
//a.playGame();
}
}
1),访问成员变量
当多态在编译时,看左边即就是父类中是否有你要访问的变量,若有则编译通过,若没有则编译就会报错,并且在编译通过后,执行的结果是左边(父类)的成员变量的值,而不是右边(子类)成员变量的值
2),访问成员方法
访问成员方法时候编译看左边(父类)中是否有该方法,有的话编译通过.,没有的话就编译报错,执行的时候,执行的是右边(子类)的方法,也就是重写后的方法,若是子类中没有重写父类中的方法,那么就会执行父类中的方法.
多态的好处的:提高代码的扩展性就是通用性,比较难理解,代码展示,
public class AnimalOprator {
// public void useAnimal(Cat c){
// c.eat();
// }
// public void useAnimal(Dog d){
// d.eat();
// }
public void useAnimal(Animal a){
a.eat();
}
}
本来我们需要对每个类对象都创建方法,而我们可以直接通过多态定义父类方法,直接就可以完成这样的代码
多态也是有弊端的,不能使用子类中的独有的方法,因为编译看父类,调用子类中独特方法,编译直接会报错,
而为了解决这样的弊端我们也会有对应的处理方式:转型,我们多态定义是向下转型,父类指向子类对象
//向下转型 Animal a =new Cat();
我们处理多态弊端就需要将Animal a转为Cat类型,我们的格式是
Cat c = (Cat) a;
和我们的基本数据类型转换类型需要在要转换的类型前面加上目标类型,就将Animal类型的a转化为Cat类型的c,这样我们就可以使用Cat类中特有的方法了.