Java 多态、抽象类 笔记
1. Java 多态
多态就是同一个接口,使用不同的实例而执行不同操作.
1.1 多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象(
Parent p = new Child();
)
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。(很重要)
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 对象调用 show 方法show(new Dog()); // 以 Dog 对象调用 show 方法Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eatCat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work} public static void show(Animal a) {a.eat(); // 类型判断if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } }
}abstract class Animal { abstract void eat();
} class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); }
} class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); }
}
执行以上程序,输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠
1.2 虚方法
我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字super。
例子:
- 如果实例中,实例化了两个 Salary 对象:一个使用 Salary 引用 s,另一个使用 Employee 引用 e。
- 当调用 s.mailCheck() 时,编译器在编译时会在 Salary 类中找到 mailCheck(),执行过程 JVM 就调用 Salary 类的 mailCheck()。
- 因为 e 是 Employee 的引用,所以调用 e 的 mailCheck() 方法时,编译器会去 Employee 类查找 mailCheck() 方法 。
- 在编译的时候,编译器使用 Employee 类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Salary 类中的 mailCheck() 方法。
以上整个过程被称为虚拟方法调用,该方法被称为虚拟方法
1.3 多态的实现方式
方式一:重写:
方式二:接口
- 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
- java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
方式三:抽象类和抽象方法
注:类的属性变量是能重写(覆盖)
class Animal{public int age;public void move(){System.out.println("动物可以移动");}
}class Dog extends Animal{public double age;public void move(){age = 10.00;System.out.println("狗可以跑和走");}public void bark(){System.out.println("狗可以吠叫");}
}class Cat extends Animal{public void move(){super.age = 3;System.out.println("猫可以跳");}
}public class TestOverride{public static void main(String args[]){Animal a = new Animal(); // Animal 对象Animal b = new Dog(); // Dog 对象Dog c = new Dog();Cat d = new Cat();a.move();// 执行 Animal 类的方法b.move();//执行 Dog 类的方法c.move();//执行 Dog 类的方法d.move();//执行 Cat 类的方法Object aValue = a.age;Object bValue = b.age;Object cValue = c.age;System.out.println("The type of "+a.age+" is "+(aValue instanceof Double ? "double" : (aValue instanceof Integer ? "int" : "")));System.out.println("The type of "+b.age+" is "+(bValue instanceof Double ? "double" : (bValue instanceof Integer ? "int" : "")));System.out.println("The type of "+c.age+" is "+(cValue instanceof Double ? "double" : (cValue instanceof Integer ? "int" : "")));// 覆盖age属性System.out.println("The age of cat is "+d.age);}
}
编译值:
动物可以移动
狗可以跑和走
狗可以跑和走
猫可以跳
The type of 0 is int
The type of 0 is int
The type of 10.0 is double
The age of cat is 3
注;多态引用时,构造子类对象时的构造方法的调用顺序
1,先调用超类的构造方法,多重超类首先调用最远超类的方法;
2,然后再执行当前子类的构造方法;
调用时需要谨慎处理调用方法
2. Java 抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.1 抽象方法
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
抽象类总结规定:
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
注意:子抽象类继承父抽象类,必须显性调用父抽象类的显性构造器
摘自:
http://www.runoob.com/java/java-abstraction.html
http://www.runoob.com/java/java-polymorphism.html
Java 多态、抽象类 笔记相关推荐
- Java:抽象类笔记
抽象类:类中没有包含足够的信息来描绘一个具体的对象. 为什么要创建抽象类? 为了更好的继承,以后能更好的扩展,减少类与类之间的耦合. 什么时候需要创建一个抽象类? (简单粗暴的理解)某个方法在父类中实 ...
- Java多态学习笔记
面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...
- java读书雷_Java多态学习笔记
java多态学习笔记 概述 多态的格式与使用 /* 代码中体现多态性:父类引用指向子类对象. */ 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称 ...
- java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态
匿名类 Anonymous classes enable you to make your code more concise. They enable you to declare and inst ...
- 0725(016天 多态复习 java中级-抽象类01)
0725(016天 多态复习.java中级-抽象类01) 每日一狗(田园犬西瓜瓜) 主标题 文章目录 0725(016天 多态复习.java中级-抽象类01) 主标题 1. 多态续 1.1 补充知识 ...
- 初始Java Java SE 包,继承,组合,多态,抽象类,接口
目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...
- 笔记1——C++多态与Java多态的异同
最近参加网易笔试遇到一个问题,考察了C++ 多态特性,自己查了相关资料学习了相关用法. 一般程序调用的函数地址是在编译期决定了,但是具有多态特性的函数调用地址是在程序运行期才决定. C++与Java多 ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- 当年我们一起追过的Java,Java SE 个人笔记
目录 JDK的安装和配置运行Java程序 java基本语法 面向对象 异常 多线程l API(Application Programming Interface)各种功能的类说明 集合类 IO输入输出 ...
最新文章
- Centos7下安装MongoDB
- 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南
- mysql数据库出现无法登录(ERROR 1045 ),预防和解决及系列问题解决方法。
- 一道关于回文的笔试题
- 用Numpy手写各种距离度量
- HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面的距离)
- [深度学习] 自然语言处理---Transformer 位置编码介绍
- JavaScript编程规范-有利于效率和可读性
- (算法)从10000个数中找出最大的10个
- Oracle 数据库入门学习
- 【FiddlerScript】利用FiddlerScript抓包保利威下载
- NCBI Genbank核苷酸序列数据库检索基因序列解读
- 腾讯云2022年双11云服务器配置及报价表汇总
- 深度学习自然语言处理模型实现大集合(精简版<100行)
- Android颜色对应的xml色值
- left join和left semi join的联系和区别
- android 9 8 对比,iPhone 8plus在安卓机中相当于什么层次?看看它与小米9的对比吧...
- After Effects Guru: Plugins You Should Know After Effects 大师教程之你必须了解的插件 Lynda课程中文字幕
- android 使用SAF框架操作外置sd卡
- 微信公众号怎么设置下载文件
热门文章
- OpenCV连接的组件Connected Components的实例(附完整代码)
- Qt Creator创建基于Qt Widget的应用程序
- C语言实现Trie字典树 (附完整源码)
- STL的forward_list链表
- C++内存分配方式以及区别
- QT实现Media Player(媒体播放器)
- crash工具解析_IDA反汇编静态调试Android平台C++的so文件Crash入门
- 2020-12-23
- php5.4curl报错,PHP中使用CURL报错解决方案 rip curl php curl开启 curl下
- sql是否包含多个字符串_工作中遇到的99%SQL优化,这里都能给你解决方案