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.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
随机推荐
- Android中关于JNI 的学习(三)在JNI层訪问Java端对象
前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...
- Asp.net MVC 生成zip并下载
前面有生成Excel或Word的示例,所以就不再重新写了. 这里只提供将指定文件以ZIP的方式下载. 创建一个 Zip工具类 public class ZIPCompressUtil { public ...
- flask中的session,render_template()第二和参数是字典
1. 设置一个secret_key 2.验证登入后加上session,这是最简单,不保险 . 3.注意render_template传的参数是字典
- mybatis 之 占位符#{} 和 ${}
#{}占位符用来设置参数,参数的类型可以有3种,基本类型,自定义类型,map基本类型作为参数,参数与占位符中的名称无关. <select id="findById" para ...
- Cenos 6.5上的subverion的yum配置笔记
Subversion在CenOS 6.5上的安装配置 1.安装 yum install subversion 2.配置 #创建目录 mkdir /opt/svn #创建版本库 svna ...
- SpringBoot学习笔记
SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...
- 【Zookeeper】源码分析之服务器(三)之LeaderZooKeeperServer
一.前言 前面分析了ZooKeeperServer源码,由于QuorumZooKeeperServer的源码相对简单,于是直接分析LeaderZooKeeperServer. 二.LeaderZooK ...
- Qt--自定义Delegate
这是Model/View中的最后一篇了,Qt官方显然弱化了Controller在MVC中的作用,提供了一个简化版的Delegate:甚至在Model/View框架的使用中,提供了默认的委托,让这个控制 ...
- 7.18 DP考试解题报告
今天的考试真的是天崩地裂,写了的三个题全炸...然而谁叫我弱+不注意细节呢???真的要扇耳光... T1:题意:一段区间的高度为这个区间中高度的最小值,给定n个宽度,求每个宽度的期望高度 40% :算 ...
- 串口调试者v2.1------开源c#串口调试工具
第一步:上图 第二步:上代码 >>>>>>>>>>>源代码下载<<<<<<<<< ...