java基础系列(十)多态理解
一. 概述
多态是面向对象程序设计的三大特征之一,面向对象的三大特征:封装、继承、多态。
封装给对象提供了隐藏内部特性和行为的能力,保护对象内部的状态,提高了代码的可用性和可维护性。
继承关系使一个子类能继承父类的特征,而不需要再次编写相同的代码,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例。
二. 概念
同一个行为具有多个不同表现形式或形态的能力,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
三. 实现多态条件
1.继承:必须要有子类继承父类的继承关系。
2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。 简单一句话概况:父类对象通过子类实例化
四. 理解
4.1 定义格式
//父类类型 变量名 = new 子类类型();
Father father = new Son();
4.2 成员变量特点
这个对理解多态至关重要
4.2.1 成员变量访问规则
调用成员变量: 编译看左边, 运行也看左边
编译看左边,javac编译的时候,会看左边的父类有没有这个变量: 有编译成功, 无,编译失败
运行看左边 java运行代码的时候,实际获取的就是左边父类中的成员变量(因为它的类型是Father类型)
4.2.2 成员方法访问规则
调用成员方法: 编译看左边, 运行看右边
编译看左边,javac编译的时候,会看左边的父类有没有这个方法 : 有编译成功, 无,编译失败
运行看右边 java运行代码的时候 实际运行的是子类中的方法
五. 示例
package com.duotai;
//多态测试Demo
public class Duo {
public static void main(String[] args) {
//定义格式:
Father father = new Son();
//注意这里打印的父亲的年龄: 60岁
System.out.println(father.age);
//如何理解呢? 我们来回归 4.2.1 节中的 多态中 成员变量的 访问规则
//1. 对于访问成员变量, 编译看左边, 运行也看左边
// father.age 编译的时候,会看 Father类中有没有这个变量? 是有的,就不会报错
// father.age 打印出什么呢? 运行的时候,实际也是获取是父类Father类的age值,也即是 60岁
//如果调用 father.birthplace 编译时就报错,因为 Father类中根本就没有定义这个成员变量
//System.out.println(father.birthplace);
//注意这里打印的是 :儿子名字: son
father.showName();
//如何理解呢?
//对于访问成员方法, 我们来回顾4.2.2中 多态中成员方法的 访问规则
// 2. 对于访问成员方法, 编译看左边, 运行看右边
// father.showName(), 编译的时候, 会看Father类中,有没有showName方法, 是有的,就不报错
// father.showName(), 打印出什么? 运行的时候,这时体现多态特性,因为子类重写了showName方法,所以
// 调用并打印出子类 Son的 showName方法内容
//如果调用father.showSex(),编译时就报错,因为Father类中,根本就没有这个showSex方法
//father.showSex();
}
}
class Father {
//父亲年龄60
int age = 60;
public void showName() {
System.out.println("父亲名字:Father");
}
}
class Son extends Father {
//儿子年龄30
int age = 30;
String birthplace = "中国";
@Override
public void showName() {
System.out.println("儿子名字: son");
}
public void showSex() {
System.out.println("性别:男");
}
}