Java多态的总结
多态
多态是一个对象具有不同表现形态或形式的能力,根据不同的实例执行不同的操作,例如打印机具有打印功能,打印机又有彩色打印机和黑白打印机,彩色打印机的实例打印出来的是彩色,黑白打印机打印出来的是黑色,
一、多态的利弊
多态的好处:
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证) 加强可替换性
多态的弊端
如果不进行向下转型无法使用子类的特有功能
二、多态的必要条件
- 要有方法重写
- 要有继承关系
- 要有父类引用子类对象(向上转型)
格式 父类 对象名 = new 子类()
例如 father f = new son()
三、多态成员的访问特点
成员变量
编译看左边(父类),运行看左边(父类)
成员方法
编译看左边(父类),运行看右边(子类)
(因为子类成员方法存在方法重写,所以运行时用的子类,前提是子类和父类重写了同一方 法,如果一个方法,在父类中有而子类中没有,就会调用父类中的那个方法)
静态方法
编译看左边(父类),运行看左边(父类)
(因为静态是和类相关的,所以算不上重写,所以运行还是用的父类中的)
四、父类引用指向子类对象
4.1理解父类引用指向子类对象
要理解父类引用指向子类对象,首先要理解向上转型,比如,father f = new son()中, 表示定义了一个father类型的引用,指向新建的son类型的对象。由于son是继承自它的父类father,所以father类型的引用是可以指向son类型的对象的,那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以, 父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无法调用的; 同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。 动态绑定是指”在执行期间(而非编译期间)“判断所引用对象的实际类型,根据实际的类型调用其相应的方法。
4.2 向下转型
向下转型: 把已经指向子类对象的父类引用(这里可以理解成已经向上转型过的f)赋给子类引用叫向下转型,
son s= (son) f ,这里要求必须是f是能够转化成son的,即f已经指向了son对象(这个是基本要求),
举个例子:有2个类,father是父类,son类继承自father。
father f1 = new son(); // 这就叫 upcasting (向上转型),现在f1引用指向一个Son对象
son s1 = (son)f1; // 这就叫 downcasting (向下转型),现在f1还是指向Son对象
第2个例子:
Father f2 = new Father();
Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象
因为f1指向一个子类son对象,father f1 = new Son(),子类s1引用可以指向子类对象了。
而f2 被传给了一个Father对象,Father f2 = new Father(),子类s1引用不能指向父类对象
4.3 总结:
- 父类引用指向子类对象,而子类引用不能指向父类对象。
- 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。
如:father f1 = new son(); - 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。
如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 son s1 = (son)f1;
其中f1前面的(Son)必须加上,进行强制转换。
4.4 程序实例
class father{
int num = 10;
int num2 = 55;
public void test() {
System.out.println("父类方法1");
}
public void test2() {
System.out.println("父类方法2");
}
public static void test3() {
System.out.println("父类静态方法");
}
public void te() {
System.out.println("父类特有方法");
}
}
class son extends father{
int num = 20;
int num2 = 99;
int num3 = 66;//num3是子类中特有的变量
public void test() {
System.out.println("子类方法1");
}
public void test2() {
System.out.println("子类方法2");
}
public static void test3() {
System.out.println("子类静态方法");
}
public void metod() {
System.out.println("子类特有方法");
}
}
class Demo
{
public static void main(String[] args)
{
father f = new son();//向上转型,让父类引用指向一个子类对象,使得可以使用被父类定义过的子类的功能(未定义的不能使用)
son s = (son)f;//向下转型,强制类型转换,引用f指向一个son对象,使得可以访问son中未被父类定义过的子类特有的方法和变量
f.test();//调用子类中父类已经定义过的方法
//f.metod();//报错,因为父类中没有该方法,这种方式无法调用
s.metod();//这里不会报错,因为s是强制转换后的子类对象,所以可以访问子类特有方法
f.te();//因为子类中没有te()方法,所以在父类中调用这个方法
f.test3();//因为test3是静态方法,静态方法运行看右边,与类关联,所以这里是父类的静态方法
s.test3();//同上
System.out.println(f.num);//成员变量中运行看右边,所以是父类中的变量
System.out.println(s.num);//访问子类中特有的变量
System.out.println(f.num2);
System.out.println(s.num2);
//System.out.println(f.num3);//因为num3是子类中特有的变量,而变量运行看父类(左边),所以通过这种方式无法访问
System.out.println(s.num3);//因为s指向子类,这种方式可以访问num3不会报错
}
}
输出
子类方法1
子类特有方法
父类特有方法
父类静态方法
子类静态方法
10
20
66
五、总结
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义过的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
Java多态的总结的更多相关文章
- Java 多态——与C++的比较
学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...
- C++和java多态的区别
C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报 转载自:http://www.cnblogs.com/plmnko/archive ...
- 深入理解Java多态机制
从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- Java多态(二)
public class ExtendsTest { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); ...
- 从JVM角度看Java多态
首先,明确一下,Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 package test.xing; class Father{ prot ...
- 关于java多态的理解
要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- 学JAVA第十六 天,JAVA多态
今天老师讲了多态的使用 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 我个 ...
- 对java多态的理解
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...
随机推荐
- Laravel Validator
Controller use Validator; public function Validators(){ $rules = [ 'title' => 'required|max:255', ...
- (草稿)如何判断一名UiPath开发人员是否合格?
一名合格的UiPath开发人员究竟需要具备什么核心技能?业务梳理?沟通技巧?VB.net吗?VBA吗?Python?还是SQL?出于多种原因,关于这一点总是众说纷纭,莫衷一是.尽管这些技术都算沾边,但 ...
- 如何使用python远程操作linux
在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试.这测试可以使用平台自身的noVNC.外部辅助xshell等工具连接到云服务内部进行测试.但是在如此反复的测试操作中,就需要用到自动化测试方 ...
- python从小白到大咖方便查看链接
直通BAT面试题 PyCharm快捷键 一.python基础 01 python基础 02python中基本数据类型以及运算符 03流程控制之if,while,for 04基本数据类型内置方法一 05 ...
- 百度BAE专业版申购SSL证书
这几天开发了一个小程序,本来想放到BAE基础版的,但是基础版现在不能再新增项目了,想了一下,出点血,配了个专业版.但是专业版的SSL证书是需要配的,而小程序必须使用https,所有必须申请一个证书.在 ...
- JS表单内容垂直循环滚动
参考博客:https://blog.csdn.net/yubo_725/article/details/52839493 大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...
- [译]Vulkan教程(04)基础代码
[译]Vulkan教程(04)基础代码 General structure 通用结构 In the previous chapter you've created a Vulkan project w ...
- ReactNative: 使用Touchable触摸类组件
一.简介 在应用程序中,最灵魂的功能就是交互.通过给应用程序的组件添加事件来实现交互,进而提高用户体验.然而,ReactNative并不能像Web开发那样可以给大多数的标签元素绑定click事件,例如 ...
- Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=UTF
今天在使用springboot整合SSM的时候,配置好以后启动项目,报了一个这样的异常 java.sql.SQLNonTransientConnectionException: Cannot load ...
- 使用vue-cli创建工程的时候提示vue-cli Failed to download repo vuejs-templates/webpack-simple:self signed certificate in certificate chain的解决方法
最近在使用 vue-cli 脚手架创建项目的时候,遇到 webpack-simple 模板下载不成功的情况,提示 vue-cli Failed to download repo vuejs-templ ...