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;
注意:如果是直接创父类对象,则是无法向下转型的;