Java面向对象-对象的多态性
Java面向对象-对象的多态性
Java中的多态性表现:
1,方法的重载和重写(覆盖);
2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;
我们先搞个父类Animal:
package com.java1234.chap03.sec13;
public class Animal {
public void say(){
System.out.println("我是一个动物");
}
}
再搞两个子类,分别是Dog和Cat类,重写父类方法say:
package com.java1234.chap03.sec13;
public class Cat extends Animal{
public void say(){
System.out.println("我是一个猫");
}
}
package com.java1234.chap03.sec13;
public class Dog extends Animal{
public void say(){
System.out.println("我是一个狗");
}
}
然后我们写个Test测试类:
package com.java1234.chap03.sec13;
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.say();
Cat cat=new Cat();
cat.say();
}
}
运行输出:
我是一个狗
我是一个猫
这个大家肯定能看明白 简单的子类继承 以及实例化对象 调用方法 ;
下面我来用多态测试,父类引用指向子类具体实现:
package com.java1234.chap03.sec13;
public class Test {
public static void main(String[] args) {
// 父类引用指向Dog子类的具体实现
Animal animal=new Dog();
animal.say();
// 更换实现
animal=new Cat();
animal.say();
}
}
运行输出:
我是一个狗
我是一个猫
对象的转型:
向上转型:子类对象->父类对象 安全
向下转型:父类对象->子类对象 不安全
比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上 Animail animal 转型 是安全的;
向下转型 是父类对象强制转换成子类对象:我们来改下Test类:
package com.java1234.chap03.sec13;
public class Test {
public static void main(String[] args) {
// 父类引用指向Dog子类的具体实现
Animal animal=new Dog();
animal.say();
// 向下转型
Dog dog=(Dog) animal;
dog.say();
// 向下转型 因为animal指向的是Dog具体实现 所以会报错
Cat cat=(Cat)animal;
cat.say();
}
}
运行报错:
我是一个狗
我是一个狗
Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat
at com.java1234.chap03.sec13.Test.main(Test.java:15)
转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;
我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:
我们再写一个实例:
我们先建一个父类接口People:
package com.java1234.chap03.sec13;
public interface People {
public void say();
}
接下来写两个具体实现类,Student Teacher:
package com.java1234.chap03.sec13;
public class Student implements People{
@Override
public void say() {
System.out.println("我是学生");
}
}
package com.java1234.chap03.sec13;
public class Teacher implements People{
@Override
public void say() {
System.out.println("我是老师");
}
}
我们来写一个测试类:
package com.java1234.chap03.sec13;
public class Test2 {
public static void main(String[] args) {
People p1=new Student();
p1.say();
p1=new Teacher();
p1.say();
}
}
运行输出:
我是学生
我是老师
Java面向对象-对象的多态性的更多相关文章
- java面向对象---对象容器
泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...
- java面向对象---对象初始化
在本地变量中,如果定义了一个变量后没有赋值就使用,那么eclipse就会报错:但是在成员变量中,java是会强制给一个没有初始化的变量一个默认的初始值0, 如果是一个boolean类型的变量,那么默认 ...
- JAVA面向对象
JAVA面向对象 对象 我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象 只要是对象--属性和行为(方法) 属性 对象有什么 例如:学生有姓名.学 ...
- Java面向对象设计主要有三大特征:封装性、继承性和多态性
Java面向对象设计主要有三大特征:封装性.继承性和多态性 一 封装性 1.1 概念:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter/setter方法间接访 ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
- Java——面向对象的特征三:多态性
2.5面向对象的特征三:多态性 2.5.1 关于java语言中的向上转型和向下转型 ①向上转型(upcasting) : 子--->父(自动类型转换) ②向下转型(downcasting) : ...
- 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- Java对象的多态性(转型)
多态性在面向对象中主要有两种体现: <1>方法的重载与覆写 <2>对象的多态性 对象的多态性:向上转型:子类对象-->父类对象,向上转型会自动完成 向下转型:父类对象-- ...
- Java面向对象 其他对象
Java面向对象 其他对象 知识概要: (1)可变参数 (2)静态导入 (3)System (4)Runtime (5)Date Calendar (6)Math 本 ...
随机推荐
- iptables(二)iptables实际操作之规则查询
如果你是一个新手,在阅读如下文章时,请坚持读到最后,读的过程中可能会有障碍,但是在读完以后,你会发现你已经明白了. 在进行iptables实验时,请务必在测试机上进行. 之前在iptables的概念中 ...
- docker建立和共享文件(服务器和docker之间的共享)
建立序列号:sudo docker run -it domimiek/deep-base /bin/bash 回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...
- LeetCode OJ:Multiply Strings (字符串乘法)
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- react-redux: async promise
1.the simple sample action: 事实上,只是返回个一个至少包含type的对象{ },用于reducer接收. import {RECEIVE_DATA} from " ...
- Python itertools模块中的product函数
product 用于求多个可迭代对象的笛卡尔积(Cartesian Product),它跟嵌套的 for 循环等价.即: product(A, B) 和 ((x,y) for x in A for y ...
- 无法打开包括文件:“iostream.h”
把#include<iostream.h>改为:#include<iostream>using namespace std; #include<iostream.h> ...
- (五)java进制
进制 整数的表示 十进制: 0-9, 满10进1 八进制: 0-7, 满8进1,以0开头 每三位表示一位,三位数中最大的是111,111是7,7是八进制中最大的基数 十六进制:0-15,满 ...
- MyBatis典型的错误org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
XXXmapper.java(接口) XXXmapper.xml(结果集映射) //此两个文件要在统一包下,且xml中的namespace是唯一的,为了区分须写成 该xml的全路径
- 剑指Offer面试题:11.调整数组顺序使奇数位于偶数前面
一 题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 二 解题思路 如果不考虑时间复杂度 ...
- PS抠图之单色背景图片
PS一直大家比较喜欢的一款图像处理软件,很多朋友对使用基本的功能.最近很多的朋友都在问我关于PS抠图的方法,这些方法也不是一句两句就能说清楚,并且每天都重复的叫他们,不如直接写出来刚刚接触到的朋友一起 ...