多态可理解为事物存在的多种形态
多态的体现:父类引用指向自己的子类对象;父类的引用也可以接收子类的对象(方法中常用)
要实现多态的前提:
1. 要有继承
2. 子类中重写了父类的方法
3. 父类引用指向子类对象
多态的优缺:
优点:多态的出现大大的提高了程序的扩展性
缺点:只能使用父类的引用访问从父类继承的方法
abstract classAnimal{
int weight = 0;
public abstract void eat();
public abstract void sleep();
}
class Cat extendsAnimal{
int weight = 10;
String color = "red";
@Override
public void eat() {
System.out.println("cat eat!");
}
@Override
public void sleep() {
System.out.println("cat sleep!");
}
public void catchMouse(){
System.out .println(" cat catching mouse");
}
}
class Dog extendsAnimal{
int weight = 20;
String color = "black";
@Override
public void eat() {
System.out.println("Dog eat!");
}
@Override
public void sleep() {
System.out.println("Dog eat!");
}
public void houseKeeping(){
System.out .println(" Dog keeping house!");
}
}
public classTextPolymorphism {
public static void main(String[] args) {
Animala1 = newCat();
Animala2 = newDog();
a1.eat();a1.sleep();
a2.eat();a2.sleep();
//a1.catchMouse(); //只能使用父类的引用访问从父类继承的方法 编译出错
//a2.housekeeping();//只能使用父类的引用访问从父类继承的方法编译出错
show(a1);
show(a2);
System.out .println(a1.weight);//结果为0
System.out .println(a2.weight);//结果为0
//System.out .println(a1.color);//只能使用父类的引用访问从父类继承的成员变量 编译出错
//System.out .println(a2.color);//只能使用父类的引用访问从父类继承的成员变量 编译出错
}
public static void show(Animal a){
a.eat();
a.sleep();
}
}
运行结果:
cat eat!
cat sleep!
Dog eat!
Dog eat!
cat eat!
cat sleep!
Dog eat!
Dog eat!
0
0
多态中成员函数的特点:在编译时期参阅引用型变量所属的类中是否有被调方法。如果有编译通过,若果没有编译失败。在运行期间,参阅对象所属类中的方法。即看子类有否重写该方法,若重写了实际运行的是子类中重写后的实现,若为重写则运行的是从父类继承而来的那个方法。
总结:成员函数编译时看左边,运行看右边
在多态中成员变量的特点:无论编译运行都看左边(引用变量的所属类)
在多态中静态成员函数的特点:无论编写还是运行都看左边(引用变量的所属类)
对象的转型可以向上转型也可以向下:
1. 向上转型:子类à父类(直接转换即可)
2. 向下转型:父类à子类 (要用到关键字 instanceof 必要强制转换 当所转对象此类对象时 会抛出ClassCastException)