Java学习笔记11(面向对象四:多态)
多态:
举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person
多态体现为:父类引用变量可以指向子类对象
多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
举例:
public class Fu {
public void show(){
System.out.println("父类的show方法");
}
}
public class Zi extends Fu{
public void show(){
System.out.println("子类重写父类的show方法");
}
}
public class Test {
public static void main(String[] args) {
//利用多态性
//公式:父类类型(接口类型)变量 = new 子类的对象
Fu f = new Zi();
f.show();
}
}
//输出:子类重写父类的show方法
抽象类多态:
public abstract class Person {
public abstract void work();
}
public class Teacher extends Person {
public void work() {
System.out.println("Teacher在工作");
}
}
public class Test {
public static void main(String[] args) {
//抽象类多态
Person p = new Teacher();
p.work();
}
}
//输出:Teacher在工作
接口多态:
public interface Work {
public abstract void work();
}
public class Student implements Work{
public void work(){
System.out.println("Student在工作");
}
}
public class Test {
public static void main(String[] args) {
//接口多态
Work w = new Student();
w.work();
}
}
//输出:Student在工作
多态中成员方法的特点:
public class Fu {
int a = 1;
}
public class Zi extends Fu{
int a = 2;
}
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.a);
}
}
//输出:1
成员变量:
编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败
运行的时候,运行的是父类中的变量值
总结:编译运行全看父类
成员方法:
父类中没有声明或者定义的方法无法调用,
子类如果重写,调用的是子类方法,子类没有重写,调用父类方法
总结:编译看父类,运行看子类
instanceof关键字:
用于比较引用数据类型:
public class Test {
public static void main(String[] args) {
//Person p = new Student();
Person p = new Teacher();
boolean b = p instanceof Student;
System.out.println(b);
}
}
//输出:false
多态转型:
向上转型:
java是一种强制数据类型的语言,参与运算的数据,需要保证类型的统一
如Person p = new Student();
两个数据类型是不同的,但是成功运行
因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的
范围小的,看成是子类,范围大的,看成是父类
这里子类提升到了父类的类型
优点:可以调用子类和父类的共有内容
缺点:无法调用子类的特有内容
如果想调用子类的特有内容:
向下转型(类似以前提到的强制转型):
Student s = (Student)p;
由父类类型强制转回子类的类型
好处:可以调用子类特有的功能
转型的案例:
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫在吃");
}
public void catchMouse(){
System.out.println("猫在抓老鼠");
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗在吃");
}
public void lookHome(){
System.out.println("狗在看家");
}
}
public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.eat();
a2.eat();
//向下转型,调用子类的特有方法
//使用if .instanceof. 为了确保安全性
if(a1 instanceof Cat){
Cat c = (Cat)a1;
c.catchMouse();
}
if(a2 instanceof Dog){
Dog d = (Dog)a2;
d.lookHome();
}
}
}
/*输出:
* 猫在吃
* 狗在吃
* 猫在抓老鼠
* 狗在看家
*/
Java学习笔记11(面向对象四:多态)的更多相关文章
- 疯狂java学习笔记之面向对象(四) - this关键字
Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- Java学习笔记:03面向对象-接口_多态
1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- Java学习笔记(十一)面向对象---多态
多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接受自己的子类对象. 代码体现 abstract class Animal { public abstract void eat(); } ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- Java学习笔记--关于面向对象的思考
1.不可改变的类生成对象以及变量的范围 2. 关键词this的使用 3.用类抽象的思想制作软件 4.通过关系模型建立类 5.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
随机推荐
- C#中StreamReader读取中文时出现乱码问题总结
之前有一篇文章" C#读取及写入配置文件教程"(http://blog.csdn.net/lisenyang/article/details/47291083)当中有一个问题就是在 ...
- Shell编程之文本处理
cut 截取自定列 可以按照某个字符进行分割,然后取出其中的指定列: [root@iz8vbbqbnh4ug2q9so5jflz logs]# --.txt /Dec/::: +] - /Dec/:: ...
- CS:APP3e 深入理解计算机系统_3e Datalab实验
由于http://csapp.cs.cmu.edu/并未完全开放实验,很多附加实验做不了,一些环境也没办法搭建,更没有标准答案.做了这个实验的朋友可以和我对对答案:) 实验内容和要求可在http:// ...
- 前端开发JavaScript清除浏览器缓存的方法
查看和删除浏览器缓存的方法=====>打开 最近在开发项目中发现有时候总要频繁地清除浏览器缓存,不然总是显示的过时的信息 浏览器缓存有利有弊,有些数据需要缓存下来使得页面打开更快提高网站性能,但 ...
- Jquery 改变样式
Jquery简单的操作 Jquery 是一个非常好用JS库,有很多的特殊的操作,为了方便,我们都可以引入Jquery. <script src="dist/js/vendor/jque ...
- 《认知与设计:理解UI设计准则》【PDF】下载
<认知与设计:理解UI设计准则>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382276 内容介绍 <图灵交互设计丛书·认 ...
- 队列queue(2):链表实现队列
基本概念 队列是只允许在一端进行插入操作,另一端进行删除操作的线性表. 我们规定,允许删除的叫做队首"head",允许插入的叫做队尾"tail". 基本操作 我 ...
- Hawk原理:通过IEnumerable实现通用的ETL管道
针对IEnumerable已经有多篇文章,本篇介绍如何使用IEnumerable实现ETL. ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过萃取(ex ...
- php-自动过滤、自动填充、自动验证
最近又学到了一些新技巧,和大家分享下. 第一.当一个表单有很大内容时,我们在表单处理页面接收这些表单的值的时候就会重复 接收,于是就有了自动过滤的解决之法(核心就是把数据表里需要的字段接收) 首先:我 ...
- Java解析word,获取文档中图片位置
前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...