多态

多态是一个对象具有不同表现形态或形式的能力,根据不同的实例执行不同的操作,例如打印机具有打印功能,打印机又有彩色打印机和黑白打印机,彩色打印机的实例打印出来的是彩色,黑白打印机打印出来的是黑色,

一、多态的利弊

  • 多态的好处:

    提高了代码的维护性(继承保证)

    提高了代码的扩展性(由多态保证)

    ​ 加强可替换性

  • 多态的弊端

    如果不进行向下转型无法使用子类的特有功能

二、多态的必要条件

  • 要有方法重写
  • 要有继承关系
  • 要有父类引用子类对象(向上转型)

    格式 父类 对象名 = 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多态的总结的更多相关文章

  1. Java 多态——与C++的比较

    学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...

  2. C++和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  3. 深入理解Java多态机制

    从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...

  4. Java 多态 父类和子类方法的访问控制权限

    Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...

  5. Java多态(二)

    public class ExtendsTest { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); ...

  6. 从JVM角度看Java多态

    首先,明确一下,Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 package test.xing; class Father{ prot ...

  7. 关于java多态的理解

    要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...

  8. Java经验杂谈(2.对Java多态的理解)

    多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...

  9. 学JAVA第十六 天,JAVA多态

    今天老师讲了多态的使用 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性  3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 我个 ...

  10. 对java多态的理解

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...

随机推荐

  1. IDEA中使用Maven模板创建Servelet项目并使用Tomcat来运行项目

    首先需要正确安装Maven和Tomact,Maven安装和Tomact安装步骤,参见别的文章. 一.创建Maven工作空间 点击Finish按钮后,耐心等待.直到出现BUILD SUCCESS为止. ...

  2. MySql报错(持续更新)

    目录 MySql报错 1. 重复键报错1062- duplicate entry '0' for key 'xxx' 1.1 报错场景 1.2 报错原因 1.3 解决方法 1.4 具体举例 2. VS ...

  3. Mac Electron App 签名后打开闪退

    背景 昨天在测试 Mac Electron App 打包,发现不签名的应用能够正常打开,签了名的打开反而会崩溃. 寻因 首先我怀疑是不是自己代码导致闪退,但是在一番查找后,发现还根本没到执行我的代码就 ...

  4. vue解惑之v-on(事件监听指令)

    一.v-on指令 vue中用v-on指令来监听DOM事件,并触发相应的代码.比如v-on:click,表示监听了点击事件. 二.事件修饰符 在事件处理函数中调用 event.preventDefaul ...

  5. zhy2_rehat6_mysql03 - MHA_搭建.txt

    export LANG=en_US 机器 VPN ip linux 账号/密码manager2 172.28.20.131 10.1.1.11 mysql2 - z(主) 172.28.20.133 ...

  6. Cocos2d-x的坐标系统

    推荐转至此处阅读<Cocos2d-x的坐标系统> Cocos2d-x的坐标系统 一.坐标系 二.Cocos2d-x的坐标系统 1.类别 2.定义 三.屏幕坐标系 & OpenGL坐 ...

  7. Paint.NET软件分享

    date: 2019-07-26 下载链接 官网链接 这是一款类Photoshop的轻量级图片编辑软件,仅有8.7MB.不多说话,直接上链接. 百度网盘链接 提取码:v4b2 软件简介 (百度百科警告 ...

  8. 关于python的中国历年城市天气信息爬取

    一.主题式网络爬虫设计方案(15分)1.主题式网络爬虫名称 关于python的中国城市天气网爬取 2.主题式网络爬虫爬取的内容与数据特征分析 爬取中国天气网各个城市每年各个月份的天气数据, 包括最高城 ...

  9. 基于Casbin实现ABAC

    最近同事在研究Casbin的权限设计,我们主要是考虑使用ABAC基于属性的访问控制,Casbin给的示例不多,于是自己写了几个示例. 首先我们看看提到ABAC时,一般描述如下: ABAC被一些人称为是 ...

  10. Java - IO System类支持和缓冲流

    System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...