欢迎光临
我们一直在努力

【从零开始学Java | 第九篇】多态(Polymorphism)

目录

前言

一、认识多态

二、多态中调用成员的特点

1、调用成员变量:编译看左边,运行也看左边。

2、调用成员方法:编译看左边,运行看右边。

3、邪修理解方式


前言

        面向对象的三大特征:封装、继承和多态,实际上,封装、继承和多态是一个层层递进、密不可分的有机整体。今天,我们来学习面向对象特征中的多态。“万事有为应有尽,此身无我自无穷。

一、认识多态

        多态顾名思义,就是同一种行为在不同对象中的不同实现形式

        生活中的多态:比如“按下F1键”这一行为,如果当前在桌面,按下 F1 会弹出 Windows 帮助;如果当前在游戏里,按下 F1 可能是释放技能。同一种操作,作用于不同对象,结果完全不同。

        Java中的多态:建立在继承的基础上。指同一个父类引用,指向不同的子类对象时,调用同一个方法,会执行不同的子类逻辑

场景应用:

Person类:

public class Person {
private String name;
private int age;

public Person() {
}

public Person(int age, String name) {
this.age = age;
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public void show(){
System.out.println(name + ", " + age);
}
}

学生、老师、管理员类:

public class Student extends Person{

@Override
public void show(){
System.out.println("学生的信息为:" + getName() + ", " + getAge());
}
}
public class Teacher extends Person{

@Override
public void show(){
System.out.println("老师的信息为:" + getName() + ", " + getAge());
}
}
public class Administrator extends Person{

@Override
public void show(){
System.out.println("管理员的信息为:" + getName() + ", " + getAge());
}
}

测试类:

public class Test {
public static void main(String[] args) {
Student s = new Student();
Teacher t = new Teacher();
Administrator admin = new Administrator();

s.setName("张三");
s.setAge(20);

t.setName("李四");
t.setAge(30);

admin.setName("王五");
admin.setAge(35);

registor(s);
registor(t);
registor(admin);
}

public static void registor(Person p ){
p.show();
}
}

运行结果:

多态的前提:

  • 有继承/实现关系
  • 有父类引用指向子类对象
  • 有方法的重写

二、多态中调用成员的特点

成员变量调用:编译看左边,运行也看左边。

成员方法调用:编译看左边,运行看右边。

1、调用成员变量:编译看左边,运行也看左边。

场景演示:

public class Test {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.age);
}
}

class Animal{
int age = 5;

}

class Dog extends Animal{
int age = 1;
}

运行结果:

解释说明:

  • 编译看左边:编译器检查 Animal 类里有没有 age?有,编译通过。
  • 运行看左边:实际运行拿到的值,也是 Animal 类里的 5。

2、调用成员方法:编译看左边,运行看右边。

场景演示:

public class Test {
public static void main(String[] args) {
Animal a = new Dog();
a.eat();
// a.watchDoor();
}
}

class Animal{
public void eat(){
System.out.println("动物在吃东西");
}
}

class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗在啃骨头");
}
public void watchDoor(){
System.out.println("狗在看门");
}
}

运行结果:

解释说明:

  • 编译看左边:Animal 里有 eat() 方法吗?有,编译通过。
  • 运行看右边:实际对象是 Dog,Dog 重写了 eat(),执行 Dog 的逻辑。
  • 编译看左边:Animal 里有 watchDoor() 方法吗?没有,直接报错红线!

3、邪修理解方式

成员变量:

       假设 Dog 穿上了 Animal 的制服(向上转型)。这件 Animal 制服的胸口挂着一个名牌(成员变量),上面写着“年龄:5岁”。 当你(编译器/JVM)去读取它的年龄时,你只认制服不认人。你看到制服上写着什么,读出来的就是什么。哪怕里面这只狗实际上只有 1 岁,你也不管。

成员方法:

还是那只穿了 Animal 制服的 Dog。

  • 编译看左边(检查权限): 你命令它:“去吃东西!”。编译器会先看它穿的 Animal 制服手册里有没有“吃东西”这个动作。如果有,允许你下达命令(编译通过)。如果没有,编译器直接报错:“动物制服没这个功能,不许叫它做!”。

  • 运行看右边(实际执行): 命令下达后,真正在执行动作的是制服里面的那只 Dog。狗有自己独特的吃法(啃骨头),所以它会按照狗的方式去吃,而不是用普通动物的方式吃。

赞(0)
未经允许不得转载:171主机测评 » 【从零开始学Java | 第九篇】多态(Polymorphism)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址