多态:
父类引用指向子类对象,从而产生多种形态。
Animal dog = new Dog();
Animal cat = new Cat();
同一种事物,在不同时刻表现不同状态。
二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即 形成多态。
当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象。
向上转型(子类转换为父类):
class Animal{
void eat(){ }
}
class Cat extends Animal{
void eat() {
System.out.println("狗吃骨头");
}
}………
Animal x=new Cat() //向上造型,Cat对象提升到Animal对象
x.eat() //在编译奇迹只能调用父类中定义的方法, 如果子类重写了父类方法,那么运行时
调用子类重写的方法
向下转型(父类转换为子类):
class Animal{
void eat(){ }
}
class Cat extendsAnimal{
void look() {
System.out.println("看家");
}
} ………
Animal x=new Cat()
x.look();//编译报错,Animal类型中没有look方法
Cat m=(Cat)x; //需要向下转型,转为Cat类型
m.eat() ;
m.look();//子父类中的方法都可以使用
作用:
为了使用子类中的特有方法。
好处:
提高代码扩展性。
class Animal{
void eat() { }
}
class Cat extends Animal{
void eat() { }
}
class Dog extends Animal{
void eat(){ }
}
//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象
method(Animal animal){
animal .eat();
}
对成员方法的调用:
class Animal{
void show() {
System.out.println(“Anmial");
}
}
class Cat extends Animal{
void show() {
System.out.println(“cat");
}
}……. Animal x = new Cat()
x.show() //调用的是子类中的方法
简单的说:编译看左边,运行看右边。
对静态成员方法的调用:
class Animal{
static void show() {
System.out.println(“Animal");
}
}
class Cat extends Animal {
static void show() {
System.out.println(“Cat");
}
}……. Animal x = new Cat()
x.show() //调用的是动物类中的静态成员方法。 简单的说:编译和运行都看左边
对成员变量的调用:
class Animal{
int num = 3;
}
class Cat extends Animal {
int num = 4;
}……. Animal x = new Cat()
x.num; //调用的是动物类中的成员变量。
简单的说:
编译和运行都看等号左边。
注意:
变量不存在被子类覆写这一说法,只有方法存在覆写。