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.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
随机推荐
- Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 5个步骤,将 storyboard 从 iphone 版转变为 ipad 版
1.将 iPhone 版的 Storyboard 复制为 iPad 的,比如 Main_iPad.storyboard 2.用文本编辑器(不要用 Xcode)打开 Main_iPad.storyboa ...
- 一行代码巧妙实现iOS返回button
一行代码巧妙实现iOS返回button: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[ ...
- jmeter的安装
1.安装jdk和环境变量配置 变量名:[JAVA_HOME] 变量值:[D:\Program Files\Java\jdk1.8.0_92][jdk安装路径] 变量名:[path] 变量值:[ ...
- 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'
在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...
- SpringBoot ( 七 ) :springboot + mybatis 多数据源最简解决方案
说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...
- 采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)
前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来介绍一下,如何使用Opserver监控我们的服务器状态. Opserver的功能其实很强大,他可以 ...
- 【HTML5】Canvas
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ASP.NET Core 系列视频完结,新项目实战课程发布。
今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...
- Ionic2 cordova angular2 打包到Android apk环境搭建
一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...