一、多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
二、优点
1.消除类型之间的耦合关系
2.可替换性
3.可扩充性
4.接口性
5.灵活性
6.简化性
三、条件
1.继承(或实现接口)
2.重写
3.父类引用指向子类对象
四、实例
例1:
//定义父类
public class Father {
//定义方法
public void fun(){
System.out.println("我是父类中的方法!");
}
}
//定义子类,继承父类
class Son extends Father{
//重写父类中的方法
@Override
public void fun() {
System.out.println("我是重写后的方法!");
}
}
//测试类
class Test{
public static void main(String[] args){
//多态体现,父类引用指向子类对象
Father f = new Son();
//调用重写后的方法
f.fun();
}
}
注意:
1.当使用多态方式(父类引用)调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
2.当使用多态方式(父类引用)调用成员变量时,首先检查父类中是否定义了该变量,如果没有,编译错误,如果有,使用父类定义的成员变量。
例2:
//定义父类
public class Father_2 {
//父类中的成员变量
int a = 10;
}
//定义子类,继承父类
class Son_2 extends Father_2{
//子类中的成员变量
int a = 12;
}
//测试类
class Test_2{
public static void main(String[] args){
//多态体现
Father_2 f2 = new Son_2();
//调用成员变量,结果输出的时父类中的成员变量
System.out.println(f2.a);
}
}
五、向上、向下转型
向上转型:
当有子类对象赋值给一个父类引用时,便是向上转型,多态的本身其实就是向上转型的过程。
向下转型:
一个已经向上转型的子类对象,使用强制类型转换,将父类引用转换为子类引用,这个过程称之为向下转型。(直接创建父类对象,无法向下转型)
想要使用子类的成员变量或其特有的方法,需要使用到向下转型。
例:
//定义父类
public class Father_3 {
//父类中的成员变量
int a = 10;
//定义方法
public void fun(){
System.out.println("我是父类中的方法!");
}
}
//定义子类,继承父类
class Son_3 extends Father_3{
//子类中的成员变量
int a = 12;
//重写父类中的方法
@Override
public void fun() {
System.out.println("我是重写后的方法!");
}
//子类特有的方法
public void fun_2(){
System.out.println("我是子类特有的方法!");
}
}
//测试类
class Test_3{
public static void main(String[] args){
//多态体现,此过程为向上转型
Father_3 f3 = new Son_3();
//向下转型,强制转换
Son_3 s3 = (Son_3)f3;
//调用子类特有的成员
s3.fun_2();
System.out.println(s3.a);
}
}
六、instanceof运算符
instanceof是一个比较运算符,它用来判断一个引用类型是否属于某个类型(要有继承和实现关系)的对象。
例:
//定义“人”类
public class Person {
public void eat(){
System.out.println("人都要吃饭!");
}
}
//定义“我” 类,继承“人”类
class My extends Person{
public void eat(){
System.out.println("我是人,我也要吃饭!");
}
}
//定义测试类
class Test_4{
public static void main(String[] args) {
//多态体现
Person p = new My();
//判断p 是否属于Person类型
if (p instanceof Person) {
System.out.println(true);
}
//判断p 是否属于 My 类型
if (p instanceof My) {
System.out.println(true);
}
}
}