Java——多态
多态的特性
1.可替换性(substitutability)。多态对已存在代码具有可替换性。
例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,
也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的
子类不影响已存在类的多态性、继承性,以及其他特性的运行和操
作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、
半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类
提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高
了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,
尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
一种事物的多种形态|表现形式
-
注意: 使用检查语法时候只会看引用的类型|变量的类型,运行期间计算结果才会获取计算值
-
多态的前提: 类的继承|接口的实现
-
多态的最终体现: 父类引用指向子类对象
-
多态的调用: 父类的引用调用方法的时候,会调用子类重写的方法
-
多态引用对子类新增内容不可见
-
总结多态使用成员:
-
成员变量
-
编译运行看左边|父类
-
成员方法
-
编译看左边,运行看右边
-
编译看类型,运行找对象
-
编译看父类,运行找子类
-
多态可以使程序变的更加灵活,便于后期维护
public class PolyDemo01 {
public static void main(String[] args) {
//Person p=new Person();
//Student s=new Student();
//多态
Person p2=new Student();
p2.sleep();
System.out.println(p2.name);
//p2.haha();
Person p = new Student();
}
void test(Person p) {}
}
class Person{
String name="Person";
void sleep() {
System.out.println("休息...");
}
}
class Student extends Person{
int id;
String name="Student";
void sleep() {
System.out.println("一边学习 一边休息...");
}
void haha() {
System.out.println("我是子类新增方法");
}
}
class Teacher extends Person{
int id=5;
void haha() {
System.out.println("我是子类Teacher新增方法");
}
}
转型
1. 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型
**不用强制转型**。
Father father = new Son();
2. 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),
要**强制转型,要向下转型**,必须先向上转型为了安全可以
用**instanceof**判断。
如father就是一个指向子类对象的父类引用,
把father赋给子类引用son
即
Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
3.upcasting 会丢失子类特有的方法,但是子类overriding
父类的方法,子类方法有效,向上转型只能引用父类对
象的属性,要引用子类对象属性,则要写getter函数。
4.向上转型的作用,减少重复代码,父类为参数,调有
时用子类作为参数,就是利用了向上转型。这样使代码
变得简洁。体现了JAVA的抽象编程思想。
基本数据类型–>类型转换
-
小类型数据-->大范围类型 : 自动类型提升
- double d =1;
- 大类型数据–>小范围类型 : 强制类型转换
- int i = (int)d;
- 引用数据类型–>转型问题
- 大范围 : 父类
- 小范围: 子类
- 小类型数据–>大范围类型 : 向上转型
- Person p =new Student();
- 大类型数据–>小范围类型 : 向下转型
- Student s =(Student)p;
- 多态前提,父类引用只能调用父类中有的内容,对子类新增内容不可见(变量,方法)
- 如果想要调用子类新增内容,需要涉及到向下转型,转为对象真实类型
- 在向下转型常见的异常:
- java.lang.ClassCastException 类型转换异常
- 介绍一个云算符: 引用 instanceof 类型
- 判断前面 的引用是否指向为后面类型的对象,如果是返回true,如果不是返回false
- 总结: 当先要多态引用调用子类独有内容时候,需要向下转型,配合instaceof一起使用,先判断后转型,预防两类型转换异常出现
public class CastDemo02 {
public static void main(String[] args) {
//多态 向上转型
Person p =new Student();
System.out.println(p.name);
p.sleep();
//向下转型
//Student s =(Student)p;
if(p instanceof Teacher) {
Teacher s= (Teacher)p;
//子类独有内容
System.out.println(s.id);
s.haha();
}else if(p instanceof Student) {
Student s =(Student)p;
System.out.println(s.id);
s.haha();
}
}
}