多态图解

代码中体现多态性

父类名称 对象名 = new 子类名称();

or

接口名称 对象名 = new 实现类名称();

// 父类
public class Father {
public void method(){
System.out.println("parent class method call");
} public void methodFather(){
System.out.println("parent class specific method"); // 父类特有方法
}
} // 子类
public class Son extends Father{
@Override
public void method(){
System.out.println("sub class method call");
}
} public class DemoMulti{
public static void main(String[] args){
// 使用多态写法,左侧父类的引用,指向了右侧子类的对象(类似于一只狗被当做了一只动物)
Father son = new Son();
son.method(); // sub class method call
son.methodFather(); // parent class specific method
}
}

多态中成员变量的特点

访问成员变量的两种方式:

  1. 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找

  2. 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找

    指的是 Father f = new Son(); 中的等号

口诀:编译看右边,运行还看右边 (成员变量的话, 运行是看左边?)

// 父类
public class Father {
String name = "Father"; public String showName() {
return this.name;
}
} // 子类
public class Son extends Father{
String name = "Son";
int age = 20; @Override
public String showName() {
return this.name;
}
} public class DemoMulti{
public static void main(String[] args){
// 使用多态写法,左侧父类的引用,指向了右侧子类的对象(类似于一只狗被当做了一只动物)
Father f = new Son();
System.out.println(f.name); // Father
// System.out.println(son.age); // 错误写法 // 子类没有覆盖重写,就是父:Father
// 子类有覆盖重写,就是子:Son
System.out.println(f.showName()); // Son
}
}

多态中成员方法的特点

看 new 的是谁,就优先用谁,没有则向上找

口诀:编译看左边,运行看右边

// 父类
public class Father {
public void method(){
System.out.println("parent class method call");
}

public void methodFather(){
System.out.println("parent class specific method"); // 父类特有方法
}
}

// 子类
public class Son extends Father{
@Override
public void method(){
System.out.println("sub class method call");
} public void methodSon(){
System.out.println("son class specific method"); // 子类特有方法
}
}

public class DemoMulti{
public static void main(String[] args){
Father f = new Son(); // 多态
f.method(); // 父子都有,优先用子
f.emthodFather(); // 子类没有,父类有,向上找到父类 // f.methodSon(); // 错误写法
}
}

对象转型图解

对象的向上转型

public abstract class Animal {
public abstract void eat();
}

public class Cat extends Animal{
@Override
public void eat(){
System.out.println("cat eat fish");
}
}

public class DemoTransition {
public static void main(String[] args) {
// 向上转型,就是父类引用 指向 子类对象
Animal cat = new Cat();
cat.eat(); // cat eat fish
}
}

对象的向下转型

向上转型有一个弊端:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容

public abstract class Animal {
public abstract void eat();
}

public class Cat extends Animal{
@Override
public void eat(){
System.out.println("cat eat fish");
} public void catchMouse(){
System.out.println("cat catches mouse");
}
}

public class DemoTransition {
public static void main(String[] args) {
// 对象的向上转型,就是父类引用 指向 子类对象
Animal cat = new Cat();
cat.eat(); // cat eat fish

// cat.catchMouse(); // 错误写法
// 向下转型,进行还原
Cat transitionCat = (Cat) cat;
transitionCat.catchMouse(); // cat catches mouse
}
}

instanceof 关键字进行类型判断(为了避免向下转型异常:ClassCastException)

if (cat instanceof Cat){
Cat transitionCat = (Cat) cat;
}

综合案例(笔记本USB接口)

// 定义 USB 接口

public interface USB {
void enable();
void disable();
}

// 鼠标实现类

// 鼠标是一种 USB 设备
public class Mouse implements USB {
String name = "mouse"; @Override
public void enable() {
System.out.println("enable " + this.name);
} @Override
public void disable() {
System.out.println("disable " + this.name);
} public void click(){
System.out.println("click on the event");
}
}

// 键盘实现类

// 键盘也是一种 USB 设备
public class KeyBoard implements USB {
String name = "key board"; @Override
public void enable() {
System.out.println("enable " + this.name);
} @Override
public void disable() {
System.out.println("disable " + this.name);
} public void tap(){
System.out.println("tap on a event");
}
}

// 电脑类

public class MacBookPro {
public void powerOn() {
System.out.println("powerOn");
} public void powerOff() {
System.out.println("powerOff");
} // 使用 USB 设备的方法,使用接口作为方法的参数
public void useDevice(USB usb) {
usb.enable();
if (usb instanceof Mouse){
// 向下转型
Mouse mouse = (Mouse) usb;
mouse.click();
} else if (usb instanceof KeyBoard){
KeyBoard keyBoard = (KeyBoard) usb;
keyBoard.tap();
}
usb.disable();
}
}

// main()

public class DemoCase {
public static void main(String[] args) {
MacBookPro book = new MacBookPro(); USB mouse = new Mouse(); // 多态写法,向上转型
KeyBoard keyBoard = new KeyBoard(); // 自动发生了向上转型 book.powerOn(); // powerOn
book.useDevice(mouse); // enable mouse, click on the event, disable mouse
// 也可以直接传匿名对象 new KeyBoard()
book.useDevice(keyBoard); // enable key board, tap on a event, disable key board
book.powerOff(); // powerOff
}
}

# 参考廖雪峰教程

Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;

public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
} public static double totalTax(Income... incomes) {
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
} class Income {
protected double income; public Income(double income) {
this.income = income;
} public double getTax() {
return income * 0.1; // 税率10%
}
} class Salary extends Income {
public Salary(double income) {
super(income);
} @Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
} class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
} @Override
public double getTax() {
return 0;
}
}

ending ~

Java 面向对象_多态的更多相关文章

  1. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

  2. Java之旅_面向对象_多态

    参考并摘自:http://www.runoob.com/java/java-polymorphism.html 多态 多态是一个行为具有多个不同表现形式的能力. 多态就是同一个接口,使用不同的实例而执 ...

  3. java面向对象之 多态 Polymorphism

    多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...

  4. Java面向对象的多态

    Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...

  5. Java核心基础第5篇-Java面向对象_类和对象

    Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...

  6. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  7. Java面向对象特性--多态

    Java是一种面向对象的编程语言,面向对象的三大特性就是继承,封装,多态.下面细细说一说多态. 多态的定义:一个事物的多种形态,指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而 ...

  8. JavaSE入门学习18:Java面向对象之多态

    一Java多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现.比方我们说"宠 物"这个对象.它就有非常多不同的表达或实现,比方有小猫.小狗.蜥 ...

  9. Java面向对象_继承——基本概念以及管理化妆品实例分析

    一.继承的基本概念: 1.继承是面向对象三大特征之一 2.被继承的类成为父类(超类),继承父类的类成为子类(派生类) 3.继承是指一个对象直接使用另一个对象的属性和方法 4.通过继承可以实现代码重用 ...

随机推荐

  1. Dart函数方法

    /* 内置方法/函数: print(); 自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } */ void printInfo( ...

  2. JFreechart从入门到放弃

    JFreechart从入门到放弃 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 http://www.jfree.org/jfreechart/ 引言 干嘛用的 使用java画图, ...

  3. 单独配置的nginx mysql 重启

    /usr/local/mysql/bin/mysqld_safe /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx

  4. 【JS新手教程】JS中的split()方法,拆分字符串

    该方法具体如代码和图中的注释,直接在语句后面加注释了.格式:要拆分的字符串.split(拆分依据的字符)例如该文中的例子,拆分人名,电话,地址.该文中用了个文本框,文本框中需要输入的格式是:人名,电话 ...

  5. web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器

    1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...

  6. VS混淆/反编译/远程调试/Spy++的Tools工具

    VS的Tools工具(混淆/反编译/远程调试/Spy++等) https://blog.csdn.net/chunyexiyu/article/details/14445605 参考:http://b ...

  7. autocomplete="off" 在新版chrome中不起作用

    autocomplete="off" 在新版chrome中不起作用,还是自动填充了 用户名和密码,改为 autocomplete="new-password"  ...

  8. IDEA中的,让光标回到上一次停留的地方

    IDEA中的,光标返回到上一次停留的地方ctrl+alt+ ←IDEA中的,光标返回到下一次停留的地方ctrl+alt+ → 不过要小心,笔记本电脑,默认的翻转屏幕的快捷键和这个冲突..我的选择是关闭 ...

  9. 按键板的原理和实现--基于GPIO的按键板

    上篇介绍简单的ADC实现,需要IC提供一个额外的ADC.但出于IC成本的考虑,无法提供这个的ADC时,但提供了多个额外的GPIO(General Purpose Input Output:双向的:可以 ...

  10. mysql 报错ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ ( ...