多态:

举例:描述一个事物的多种形态,如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(面向对象四:多态)的更多相关文章

  1. 疯狂java学习笔记之面向对象(四) - this关键字

    Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...

  2. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  3. Java学习笔记之面向对象、static关键字

    一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...

  4. Java 学习笔记(4)——面向对象

    现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...

  5. Java学习笔记:03面向对象-接口_多态

    1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...

  6. 疯狂java学习笔记之面向对象(五) - 封装、继承、多态

    一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...

  7. Java学习笔记(十一)面向对象---多态

    多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接受自己的子类对象. 代码体现 abstract class Animal { public abstract void eat(); } ...

  8. 【原】Java学习笔记019 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...

  9. Java学习笔记--关于面向对象的思考

    1.不可改变的类生成对象以及变量的范围 2. 关键词this的使用 3.用类抽象的思想制作软件 4.通过关系模型建立类 5.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...

随机推荐

  1. C++ - 复制容器(container)的元素至还有一个容器

    复制容器(container)的元素至还有一个容器 本文地址: http://blog.csdn.net/caroline_wendy C++复制容器(container)元素, 能够使用标准库(ST ...

  2. cocos2dx中关于Action动作的相关API的具体介绍

     //CCMoveBy  创建一个移动的动作 //參数1:移动到目标坐标所需的时间 //參数2:目标坐标 //支持reverse 能够获取其反向动作 //CCMoveTo  一样的 //CCAct ...

  3. 兔子-ps抠图

    介绍2种方法:1.用高速选择工具 2.用铅笔工具 1.高速选择后.ctrl+c复制,新建空白图片,粘贴进去 2.用钢笔工具在图像的边缘定出若二个点,确定完毕之后按crtl+回车键选择.然后复制,新建空 ...

  4. ABP入门系列(12)——如何升级Abp并调试源码

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 升级Abp 本系列教程是基于Abp V1.0版本,现在Abp版本已经升级至V1.4.2(截至 ...

  5. MyBatis_通过resultMap解决不一致的问题

  6. 聊聊js中的typeof

    内容: 1.typeof 2.值类型和引用类型 3.强制类型转换 typeof 官方文档:typeof 1.作用: 操作符返回一个字符串,指示未经计算的操作数的类型. 2.语法: typeof ope ...

  7. javascript中的异步 macrotask 和 microtask 简介

    javascript中的异步 macrotask 和 microtask 简介 什么是macrotask?什么是microtask?在理解什么是macrotask?什么是microtask之前,我们先 ...

  8. JavaSE项目之聊天室

    引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...

  9. P神的SDFZ考试题 C题

                                                                      探险[问题描述]          探险家小 T 好高兴! X 国要 ...

  10. Ryz的鬼题

    蚂蚁(ant)[题目描述]  小 R 种了一棵苹果树,这棵树上有 n 个节点(标号从 0 到 n-1),有 n-1 条树枝连接这  n 个节点,这 n 个节点相互连通.每条树枝的长度为 1.  苹果树 ...