多态
定义:
一种事物的多种表现形式 | 形态
前提:
1.类的继承
2.接口的实现
多态的最终体现:
父类引用执行子类对象
注意:
父类的引用会优先调用子类的重写方法
父类无法使用子类中独有的内容,如果需要使用,则必须转型
public class Person{
void sperak(){
System.out.println("说话");
}
}
class Student extends Person{
//重写方法 优先使用
void speak(){
System.out.println("文明用语....");
}
Void study(){ //父类无法调用 独有方法
System.out.println("学习");
}
}
多态成员访问的特点
1.成员变量
-
编译看左边(父类) , 运行看左边(父类) (静态绑定)
-
一般中情况使用极少, 成员变量一般都是私有化的
public class Father {
String name = "小红";
}
public class Son extends Father {
String name = "小明";
}
public static void main(String[] args) {
Father father = new Son();
String str = father.name;
System.out.println(str); //小红
}
2.成员方法
- 编译看左边(父类), 运行看右边(子类), 动态绑定
- 子类中如果对父类中的方法进行了重写, 父类中的方法无论如何都无法被访问, 这也是java动态绑定的结果
- 动态绑定会选择最优执行方法, 只要子类重写了父类的方法, 无论在什么地方调用, 都会先找子类
public class Father {
public void method(){
System.out.println("父类method方法");
}
}
public class Son extends Father {
public void method(){
System.out.println("子类method方法");
}
}
public static void main(String[] args) {
Father father = new Son();
father.method();//子类method方法
}
3.静态方法
- 编译看左边(父类),运行看左边(父类)
public class Father {
public static void method(){
System.out.println("父类method方法");
}
}
public class Son extends Father {
public static void method(){
System.out.println("子类method方法");
}
}
public static void main(String[] args) {
Father father = new Son();
father.method();//父类method方法
}
多态转型**
1.向上转型
- 将子类对象看作是父类类型, 也就是我们平时使用的多态的形式
- 这种情况下, 无法调用子类特有的功能
2.向下转型
- 将父类引用指向的子类对象再转回子类类型
- 这种转型是有危险的, 因为是强制性的, 一旦转向的类型跟这个对象不匹配, 就会报错java.lang.ClassCastException (类型转换异常, 属于运行时异常)
public static void main(String[] args) {
Father father = new Son();
//转回子类类型
Son son = (Son)father;
}