1.什么是多态嘞
Person p1 = new Man();//man和woman都是person的子类
p1.run();
Person p2 = new Woman();
p2.run();
即 person既可以指向man,执行man里的方法,又可以指向womam,执行woman中的方法(person类,man类和woman类在后面会有代码给出,可以下滑到全部代码那去瞅瞅)
2.多态的作用
1等号右边解耦合
Person p1 = new Man();//man和woman都是person的子类
p1.run();
p1.jump();
p1.eat();//以下省略好多好多业务代码
当我们想将p1的业务换成woman而不是man时,仅仅只需改变一行代码,即
Person p1 = new Woman();//只需改变这一行代码
p1.run();
p1.jump();
p1.eat();//以下省略好多好多业务代码
2便于接收对象
public class Test {
public static void main(String[] args) {
System.out.println("lllllllllhello");
Man man = new Man();
die(man);
Woman woman = new Woman();
die(woman);
}
public static void die(Person p){
System.out.println("啊!我死了");
}
}
方法die的形参若为person,则可以接收person的所有子类,否则,举个例子,若形参为man,则woman调用die方法时传入参数将会报错,参见下面
public class Test {
public static void main(String[] args) {
System.out.println("lllllllllhello");
Woman woman = new Woman();
die(woman);
die1(woman);
}
public static void die(Person p){
System.out.println("啊!我死了");
}
public static void die1(Man p){
System.out.println("啊!我又死了,但可能死不了,因为我形参变了,欸嘿嘿,没想到吧,年轻人人!!!");
}
}
运行结果,出错啦,果真没死成
3.多态的缺点即解决
多态不能使用子类独有的方法,即
Person p2 = new Woman();
p2.run();
p2.pregnancy();//会报错,无法调用子类独有的方法
//以下是定义
class Woman extends Person {
@Override
public void run() {
System.out.println("女生跑");
}
public void pregnancy() {
System.out.println("我怀孕了!!!");
}
}
为了解决此问题,就要用强制类型转换
Person p2 = new Woman();
p2.run();
//p2.pregnancy();//会报错,无法调用子类独有的方法
Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
woman.pregnancy();
为了使强制类型转换不出现问题,使用instanceof关键字,下面为介绍
p2 instanceof Woman
判断p2的真实类型是否是Woman或是Woman的子类
所以严格的写法应该是这样的
Person p2 = new Woman();
p2.run();
//p2.pregnancy();//会报错,无法调用子类独有的方法
if(p2 instanceof Woman) {
Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
woman.pregnancy();
}
4.全部代码
public class Test {
public static void main(String[] args) {
System.out.println("lllllllllhello");
Person p1 = new Man();//只需改变这一行代码
p1.run();
Person p2 = new Woman();
p2.run();
// p2.pregnancy();//会报错,无法调用子类独有的方法
if(p2 instanceof Woman) {
Woman woman = (Woman) p2;//强制类型转换之后,就可以正常调用了
woman.pregnancy();
}
Man man = new Man();
die(man);
Woman woman = new Woman();
die(woman);
// die1(woman);
}
public static void die(Person p){
System.out.println("啊!我死了");
}
public static void die1(Man p){
System.out.println("啊!我又死了了,但可能死不了,因为我形参变了,欸嘿嘿,没想到吧,年轻人人!!!");
}
}
class Person {
public void run(){
System.out.println("人跑");
}
}
class Man extends Person {
@Override
public void run() {
System.out.println("男生跑");
}
}
class Woman extends Person {
@Override
public void run() {
System.out.println("女生跑");
}
public void pregnancy() {
System.out.println("我怀孕了!!!");
}
}
运行结果