多态的前提必须有子父类关系,或者实现接口关系
多态的定义格式:就是父类的引用变量指向子类对象
A:普通类多态定义的格式
父类 变量名 = new 子类();
如: class Fu {}
class Zi
extends Fu {}
//类的多态使用
Fu f = new Zi();
B:抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
如: abstract
class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
//类的多态使用
Fu fu= new Zi();
C:接口多态定义的格式
接口 变量名 = new 接口实现类();
如: interface Fu {
public abstract void method();
}
class Zi implements Fu {
public void method(){
System.out.println(“重写接口抽象方法”);
}
}
//接口的多态使用
Fu fu = new Zi();
1.1
多态使用场景
我们一般在以下场景当中使用多态:
A: 使用多态为成员变量赋值,局部变量赋值
class Father{
}
class Son extends Father{
Father f=new Son();//使用多态形式为成员变量f赋值
public
void method(){
Father f2=new
Son();//使用多态的形式为局部变量f2赋值
}
}
B: 方法传参使用多态形式(最常用最能体现出多态优点的应用)
class Father{
}
class Son extends Father{
}
class Demo{
public
static void main(String[] args) {
Son s=new Son();
method(s);
}
public
static void method(Father f){//f接收父类对象或者子类对象
}
}
C: 方法返回返回值使用多态形式
class Father{
}
class Son extends Father{
}
class Demo{
public
static void main(String[] args) {
Son s=new Son();
Father f=method();
}
public
static Father method(){
Son s = new
Son();
//由于返回值类型为Father,所以既可以返回父类对象又可以返回子类对象
return s;
}
}
当出现多态后,其调用的方法是类重写后的方法
-
多态的使用场景:
-
为变量赋值时使用多态,达到父类应用指向子类对象的赋值
-
直接为变量赋值
-
调用方法时,为方法参数赋值
-
方法返回值,可以定义父类类型,但是返回子类对象.当该方法被调用时,用父类类型接收.
-
多态的好处:
-
大大提高了程序的扩展性
-
提高了程序的复用性
1.1
多态转型
多态的转型分为向上转型与向下转型两种:
A:向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
B:向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的
使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
父类类型
f = new 子类类型();
-
子类类型 z = (子类类型)f;
instanceof关键字:用来判断对象是否属于某种数据类型
-
某个对象instanceof某个数据类型
-
(note:对象与类型必须拥有子父类关系才可以判断,无关系的两个类型不能判断!)