1.1多态的概述
多态是面向对象的三大特征(封装 继承 多态)之一.
通俗理解:多态就是一种事物的多种形态,例如学生是人的一种,则一个具体的同学张三既是学生又是人,即出现了两种形态.
专业的术语说就是:同一个实现接口,使用不同的实例而执行不同的操作。
1.2多态的定义和使用格式
定义格式:父类的引用变量指向子类对象
父类类型 变量名 = new 子类类型();
变量名.方法名();
普通类多态的定义的格式:
class Fu{}
class Zi extends Fu{ }
Fu fu = new Zi();
抽象类多态的定义的格式:
abstract class Fu{
public abstract void method();
}
class Zi extends Fu{
@Override
public void method() { }
}
Fu fu = new Zi();
接口类多态的定义的格式:
interface Fu{
public abstract void method();
}
class Zi implements Fu{
@Override
public void method() {
System.out.println("重写接口的方法");
}
}
Fu fu = new Zi();
注:当同一个父类的方法被不同子类重写,在调用方法的时候,调用的为各个子类重写后的方法:
Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //调用的是Student类重写后的work方法
p2.work(); //调用的是Teacher类重写后的work方法
1.3多态的成员变量和成员方法
1.3.1成员变量
//父类
class Fu{
int num = 10;
}
//子类
class Zi extends Fu{
int num = 15;
}
//多态成员变量
//第一种:父类和子类中都有同名的变量----结果是:10 结果是:15
//第二种:父类没有的情况---编译未通过
//第三种:子类没有的情况---结果是:10 结果是:10
public class Demo {
public static void main(String[] args) {
//多态的表现 父类的引用指向子类对象
Fu f= new Zi();
System.out.println("结果是:"+f.num);
Zi z = new Zi();
System.out.println("结果是:"+z.num);
}
/*
* 结论:当子父类中出现相同的成员变量时,多态调用该变量的时:
* 编译时期:参考的是引用类型变量所属的类中是否有被调用的成员变量----如果没有,则编译失败
* 运行时期:参考的是子类中的变量
* 简单可记做:编译看左边,运行看右边
*/
}
1.3.2成员方法
//父类
class Fu{
void show(){
System.out.println("运行结果:父类");
}
}
//子类
class Zi extends Fu{
void show() {
System.out.println("运行结果:子类");
}
}
//多态-----成员方法
//第一种:父类和子类中都有同名的方法----运行结果:子类
//第二种:父类没有的情况---编译时报错
//第三种:子类没有的情况---运行结果:父类
public class Demo {
public static void main(String[] args) {
//多态的表现 父类的引用指向子类对象
Fu f= new Zi();
f.show();
}
/*
* 结论:当子父类中出现相同的成员方法时,多态调用该变量的时:
* 编译时期:参考的是引用类型变量所属的类中是否有被调用的成员变量----如果没有,则编译失败
* 运行时期:参考引用对象所指的对象所属的类,并运行对象所属类中多的成员方法;
* 简单可记做:编译看左边,运行看右边
*/
}
1.4instanceof关键字
instanceof关键字的作用: 可以用来判断某个对象是否属于某种数据类型;
格式:Boolean flag = 对象 instanceof 数据类型
class Person{};//人类
class Teacher extends Person{};//老师类
class Student extends Person{};//学生类
public class Demo4 {
public static void main(String[] args) {
Person p1 = new Student();
boolean flag1 = p1 instanceof Student; //true
boolean flag2 = p1 instanceof Teacher; //false
boolean flag3 = p1 instanceof Person; //true
System.out.println(flag1+":"+flag2+":"+flag3);
}
}
1.5多态的转型--向上转型和向下转型
多态的转型分为两种:
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程.
使用格式:父类类型 变量名 = new 子类类型(); 如 Person p = new Student();
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转换为子类引用,
使用格式:子类类型变量名 = (子类类型)父类类型的变量;如 Student stu = (Student)p;
注意:如果是直接创父类对象,则是无法向下转型的;