java多态app_【Java基础】Java中的多态
什么是多态
多态是一个对象的多种实现,是建立在继承的基础上的,即对象“人”,有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针。
多态的发生条件
多态发生的前提是:1. 要有继承发生; 2. 要有方法的重写; 3. 要有父类引用指向子类对象。
多态中成员的访问特点
一个类中有成员变量,构造方法,成员方法和静态方法,那在多态中这些成员的访问特点是如何的呢,下面通过代码来总结下。
/*** Created by lili on 15/10/21.*/
classPerson {
String name= "person name";publicPerson() {
System.out.println("person construct");
}public voidshow() {
System.out.println("person show!");
}public static voidplay() {
System.out.println("person play");
}
}class Student extendsPerson {
String name= "Student name";
String nickName= "young boy";publicStudent() {
System.out.println("student construct");
}public voidshow() {
System.out.println("student show!");
}public static voidplay() {
System.out.println("student play");
}public voidstudy() {
System.out.println("student study");
}
}public classPolymorphismTest {public static voidmain(String[] args) {
Person person= newStudent();
System.out.println("***********************************");
System.out.println(person.name);
System.out.println("***********************************");
person.show();
System.out.println("***********************************");
person.play();//System.out.println("***********************************");//person.study();//编译报错,找不到符号//System.out.println(person.nickName);//编译报错,找不到符号
}
}
运行结果如下:
person construct
student construct***********************************person name***********************************student show!
***********************************person play
Process finished with exit code0
对结果进行解释和总结
1. 成员变量
编译看左边,运行看左边。
如果在父类引用总访问子类特有的成员变量则编译报错,例如System.out.println(person.nickName);//编译报错,找不到符号
子类和父类都有的,即子类继承的,不管对子类的成员变量如何做变化,最后显示的该成员变量的结果都是对父类成员变量操作后的结果。
2. 构造方法
这个是继承中的知识,是分层次初始化的,调用默认构造初始化,即虽然是new的Student,但是是先初始化Person,再初始化Student,所以打印顺序是:
person construct
student construct
3. 成员方法
编译看左边,运行看右边。
编译的时候只能调用父类有的成员方法,调用子类特有的成员方法则报错,这是多态的弊端,不能通过分类引用调用子类非继承成员方法。但是可以向下转型实 现这个功能,下文讲述。
运行的时候,由于成员方法重写了,所以运行子类中的该方法的具体实现,这点很有意思!所以person.show()最后打印结果是student show;
4. 静态方法
编译看左边,运行看左边。
静态和类相关,算不上重写,所以,访问还是左边的
多态的好处
多态的好处在于简化了代码,提供了很好的可扩充性。例如有一个“形状”对象,目前有“圆形”,“长方形”,“正方形”三种实现,在画图的测试方法中,方法的传递参数可以是“形状”类型,你传进来的可以是“圆形”,“长方形”,“正方形”对象,最后调用“形状”来画图,执行的是不同对象的画图方法。如果没有多态,则每个对象都需要专门写一个测试方法来测试,而现在只需要一个了。
如何访问多态中子类特有成员方法和成员变量:多态中的向下转型和向上转型
对于子类中的非继承自父类的特有方法和成员变量,例如student中的play方法,肯定有用的,但是如何调用呢?在这里就需要用到向下转型,把父类的引用利用强制类型转换给子类,然后通过这个子类引用去调用。示例程序如下:
/*** Created by lili on 15/10/21.*/
classPerson {
String name= "person name";publicPerson() {
System.out.println("person construct");
}public voidshow() {
System.out.println("person show!");
}public static voidplay() {
System.out.println("person play");
}
}class Student extendsPerson {
String name= "Student name";
String nickName= "young boy";publicStudent() {super.name = "student modified name";
System.out.println("student construct");
}public voidshow() {
System.out.println("student show!");
}public static voidplay() {
System.out.println("student play");
}public voidstudy() {
System.out.println("student study");
}
}class Teacher extendsPerson{
}public classPolymorphismTest {public static voidmain(String[] args) {
Person person= newStudent();
Student student=(Student)person;
student.study();
Teacher teacher= (Teacher)person;
teacher.show();//System.out.println(person.nickName);//编译报错,找不到符号
}
}
运行结果:
person construct
student construct
student study
Exception in thread"main" java.lang.ClassCastException: Student cannot be cast to Teacher
at PolymorphismTest.main(PolymorphismTest.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code1
向下转型的特点
1. 需要用到强制类型转换,将父类强制转型为子类,但是父类指向的对象必须是该子类实例化对象。
2. 向下转型为父类引用指向子类对象相同的引用,可以实现子类特有方法和成员变量的访问。
向上转型的特点
1. 发生在传参或者new子类对象给父类引用的过程中
多态一个有趣的例子
/*** Created by lili on 15/10/21.*/
classPerson {public voidshow() {
play();
}public voidplay() {
System.out.println("person play");
}
}class Student extendsPerson {public voidplay() {
System.out.println("student play");
}
}class Monitor extendsStudent{public voidshow() {super.show();
}public voidplay() {
System.out.println("Monitor play");
}
}public classPolymorphismTest {public static voidmain(String[] args) {
Person person= newStudent();
person.show();//student中没有重写show,所以调用的是person的show()方法,但是show中调用play在student中有重写,所以最后打印student play
System.out.println("------------------");
Student student=(Student) person;
student.show();
System.out.println("------------------");
student= newMonitor();
student.show();//monitor中有重写show,所以调用student.show()方法时(student中的show是继承自person),由于monitor有继承,调用monitor
//的show()方法,但是monitor中show方法是调用super.show(),super中的show是调用play,最后还是打印Monitor的play
}
}
运行结果:
student play------------------student play------------------Monitor play
Process finished with exit code0
java多态app_【Java基础】Java中的多态相关推荐
- java中多态到底是什么_java中的多态是指什么
java中的多态是指什么 发布时间:2020-06-28 09:59:19 来源:亿速云 阅读:119 作者:Leah java中的多态是指什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希 ...
- java无限循环小数_java基础——java无限循环小数判定问题以及BigDecimal详解
java基础--java无限循环小数判定问题以及BigDecimal详解 rtk jmp 目录 big get 无限循环 style 无限 罢谮烈糜讼市智猩昧锥父兹登htt ...
- core java作者_coreJava_Day2(基础Java学习第二天)
目标: 1. 标识符.关键字和类型介绍 2. 如何构建类 1.java代码中的注释 作用:使部分内容只为程序员可见,不为编译器所编译.虚拟机所执行 位置:类声明前后.方法声明前后.属性声明前后.方法体 ...
- java的多态是什么意思_Java中的多态是什么?
不同的行为特征.而造成这一现象的原因在于Java中的变量有两个类型: 编译时类型,由声明变量时的类型决定. 运行时类型,由实际赋值给变量的对象的类型决定,当一个变量的两个类型不一致,就会出现多态. / ...
- java 参数返回_Java基础---Java中带参数返回值方法的使用(四十)
Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 Stri ...
- java replaceall函数_java基础—-String中replace和replaceAll方法
这里面我们分析一下replace与replaceAll方法的差异以及原理. replace各个方法的定义 一.replaceFirst方法 public String replaceFirst(Str ...
- java hashmap 的api_JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)
一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...
- java 泛型参数_[基础]-Java泛型
一.概述 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的 ...
- java抽象类 抽象方法_Java基础 -- Java 抽象类 抽象方法
总结: 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. ...
- Java回炉之语言基础
Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...
最新文章
- 使用VC 2010制作和使用静态库
- 使用dwz框架配合MVC使用
- Kafka 孕育开源 KarelDB
- Pytest入门【2】
- eq相等,smarty 比较操作符!时间戳
- 极光推送小结 - iOS
- 移动端API接口优化的术和结果
- atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
- Android studio基础练习02【监听器实现下拉菜单】
- 【转载】Android 第三方ROM定制之适配谷歌Play Store
- ArcHydroTools 10.5版本的安装与使用(附下载链接与教程)
- 计算机sci四区论文,sci四区发表论文是什么水平
- JS正则验证输入框姓名只能输入中文和英文
- 开发Enterprise JavaBeans
- DVWA——XSS(Reflected)——多种方法实现+详细步骤图解+获取cookie的利用过程演示
- DX11 游戏开发笔记 (二) DX11 基础框架三角形 下
- MATLBA基础图像处理算法之四叉树分割法
- 安卓开发学习之TCP通信
- Linux安装和使用
- C4D模型工具—线性切割
热门文章
- 传感器的使用_手柄_3、ros使用罗技f710无线控制手柄
- “机器学习实战“刻意练习2/8周
- ukulele弹奏模拟器v1.0(待完善)
- win10查看电脑开机时长
- css与mdx,mdx、mdd及css三者关系以及欧路中应如何安装css
- 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号
- mysql常见函数面试题_MySql三到常见面试题,整理总结一下
- 纪念特洛伊英雄 Sinon - SAP UI5 Mock Server 使用步骤和工作原理介绍
- 使用 Git 添加文件时,出现 Warning: LF will be replaced by CRLF in...提示及解决方案
- Chrome 神器面世!谷歌学术搜文章,代码链接自动展示