三、多态子类可以继承父类的所有特性,但其可见性,由父类成员变量、方法的修饰符决定。
对于被private修饰的类成员变量或方法,其子类是不可见的,也即不可访问;
对于定义为默认访问(没有修饰符修饰)的类成员变量或方法,只有与父类同处于一个包中的子类可以访问;
对于定义为public或protected 的类成员变量或方法,所有子类都可以访问。
子类中可以声明与父类同名的成员变量,这时父类的成员变量就被隐藏起来了,在子类中直接访问到的是子类中定义的成员变量。
子类中也可以声明与父类相同的成员方法,包括返回值类型、方法名、形式参数都应保持一致,称为方法的覆盖。
如果在子类中需要访问父类中定义的同名成员变量或方法,需要用的关键字super。Java中通过super来实现对被隐藏或被覆盖的父类成员的访问。super 的使用有三种情况:
l 访问父类被隐藏的成员变量和成员方法;
super.成员变量名;
l 调用父类中被覆盖的方法,如:
super.成员方法名([参数列]);
l 调用父类的构造函数,如:
super([参数列表]);
super( )只能在子类的构造函数中出现,并且永远都是位于子类构造函数中的第一条语句。
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态
例:动物类
class Animal{
void eat(){
System.out.println("animal eat");
}
}
class Dog extends Animal{
void eat(){
System.out.println("Dog eat bone");
}
}
主方法
public static void main(String[] args){
Animal a;
a = new Animal();
a.eat();//编译是类型和运行时类型完全一样,因此不存在多态
a = new Dog();
a.eat();//编译时类型和运行时类型不一样,存在多态
}