1.什么是多态?

方法的重写、重载与动态连接构成多态性

Java之所以引入多态的概念,原因之一就它在类的继承上的问题和C++不同,后者允许多继承,这确实给其带来了非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,势必在功能上有很大的限制,所以,Java引入多态性的概念以弥补这点不足,此外,抽象类和接口也是解决单继承规定限制的重要手段.同时,多态也是面向对象编程的精髓所在.

2.多态的体现

1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的

2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.

子类覆盖父类实现多态:

如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性,不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了

重写父类方法:

//父类
public class Father{
//父类有一个打孩子方法public void hitChild(){}
}
//子类1
public class Son1 extends Father{
//重写父类打孩子方法public void hitChild(){System.out.println("为什么打我?我做错什么了!");}
}
//子类2
public class Son2 extends Father{
//重写父类打孩子方法public void hitChild(){System.out.println("我知道错了,别打了!");}
}
//子类3
public class Son3 extends Father{
//重写父类打孩子方法public void hitChild(){System.out.println("我跑,你打不着!");}
}//测试类
public class Test{public static void main(String args[]){Father father;father = new Son1();father.hitChild();father = new Son2();father.hitChild();father = new Son3();father.hitChild();}
}
//重写父类打孩子方法public void hitChild(){System.out.println("我跑,你打不着!");}
}//测试类
public class Test{public static void main(String args[]){Father father;father = new Son1();father.hitChild();father = new Son2();father.hitChild();father = new Son3();father.hitChild();}
}

Java里没有多继承,一个类之能有一个父类。而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一样。这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果

都调用了相同的方法,出现了不同的结果!这就是多态的表现!

3.如何理解向上转型?

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat();

实例化一个Cat对象,这个不难理解。但当我这样定义时:

Animal a = new Cat();

这样代表什么意思呢?

很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特:

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

来我们举个栗子:

class Father {public void func1(){func2();} public void func2(){System.out.println("AAA");}
}class Child extends Father{public void func1(int i){System.out.println("BBB");} public void func2(){System.out.println("CCC");}}public class Test {public static void main(String[] args) {Father child = new Child();child.func1();//打印结果将会是什么?}
}

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

经过上面的分析我们可以知道打印的结果是什么呢? 很显然,应该是"CCC"

4.对于多态总结一下

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中       的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父       类中的变量,那么在编译时会报错。

在现实生活中的体现:

自己用自己的,儿子有父亲一样的,就用儿子的。省点钱是点。儿子独有的,父亲不会用,所以不能用

5.站在内存分配的角度分析

1.从对象的内存角度来理解.

假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,里面的变量需要占用0.5M内      存.   
    2.现在通过代码来看看内存的分配情况:

    f = new Father();//系统将分配1M内存.Son s = new Son();//系统将分配1.5M内存
//系统将分配1M内存.Son s = new Son();//系统将分配1.5M内存

因为子类中有一个隐藏的引用super会指向父类实例,所以在实例    化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所以s可以调用   父类的方法.
    3.

    Son s1 = s;//s1指向那1.5M的内存.Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存//s1指向那1.5M的内存.Father f1 = (Father)s;//这时f1会指向那1.5M内存中的1M内存

即是说,f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中).

Son s2 = (Son)f;//这句代码运行时会报ClassCastException.//这句代码运行时会报ClassCastException.

因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.

Son s3 = (Son)f1;//这句可以通过运行,这时s3指向那1.5M的内存.//这句可以通过运行,这时s3指向那1.5M的内存.

由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存.

所以可以实现强转...
    4.static   顾名思义,就是静态的,他是方法的,他属于这个类,由于是类的方法,他可以直接引用类名来引用方法,也可以通过类的对象来引用这个方法,他既不能被子类覆盖,也不能被子类继承。简单的说,他是在编译的时候就和类帮定在一起了,不能被运行时动态加载。

对子类与父类的static问题
    ——没覆盖也没继承,子类存有指向父类的引用

对于private
    ——该方法或属性只能在该类内使用

JAVA父类引用指向子类对象相关推荐

  1. java 父类引用指向子类对象---动态绑定

    知识点: 1.java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法: 2.父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private.非 final 方法),那么这个对 ...

  2. Java多态-如何理解父类引用指向子类对象

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

  3. java父类引用子类_java多态,如何理解父类引用指向子类对象

    要理解多态性,首先要知道什么是"向上转型". 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求 ...

  4. Java多态 父类引用指向子类对象

    原文地址http://www.cnblogs.com/111testing/p/6880831.html Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 ...

  5. Java基础之父类引用指向子类对象

    多态(Polymorphism) 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示, 多态的有点 消除类型之间的耦合关系 可替换性 可扩充 ...

  6. 关于java多态性之父类引用指向子类对象

    在使用多态前,要确保两个类之间是继承关系 public class Animal{}public class Dog extends Animal{} 之后创建对象: Animal animal1 = ...

  7. java 父类引用子类对象_java 父类引用指向子类对象

    1. 无论是泛型还是普通父类引用指向子类对象,父类引用可见范围都是父类自己的变量或函数 2. 说明见注释 代码如下:父类 package com.atguigu.spring.beans; publi ...

  8. java子类引用指向父类对象_Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

  9. java 父类引用子类对象_java多态,如何理解父类引用指向子类对象

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

最新文章

  1. springcloud 之 bus 消息总线
  2. python用途与前景-Python 未来发展前景怎么样?
  3. Python 框架篇
  4. praying,blessing,wishing
  5. spring boot 常用项目文件结构
  6. 【C语言】(for循环嵌套)找出1000以内的水仙花数
  7. Auto Encoder再学习
  8. 基于JavaScript技术完成单击事件完成显示和隐藏
  9. MySQL:Left Join 这个坑,千万别踩!
  10. 火狐浏览器的hoxx附件还能用吗_Haspit
  11. matlab男女声识别,matlab男女声音识别
  12. 单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序
  13. 【MySQL练习案例】
  14. uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?
  15. android自定义水管流动,Android水管工游戏的简单脚本
  16. 台电平板teclast X16HD碎屏拆机更换日志
  17. 电磁场仿真试验【Matlab】电磁波极化仿真
  18. 中国智能制造的务实落地方案
  19. 超级简单易懂的蓝桥杯《成绩统计》解法
  20. mysql1.7(mysql优化,mysql-mmm软件介绍,mysql高可用集群。)

热门文章

  1. 什么是对抗网络,对抗网络能干什么,对抗网络简述。
  2. jQuery $.ajaxSetup方法
  3. 截图翻译哪个比较好?这三个软件推荐给你
  4. Bias 和 Variance的计算
  5. 宁波大学2013 计算机应用基础 高级c语言程序 练习册答案,计算机应用基础A1
  6. Java实现IP地址定位地址信息
  7. 前嗅教程:如何获取精准客源,提高销量
  8. IT职业教育(1) 北大青鸟APTECH 1
  9. 火车票管理系统c++
  10. RK3588电池以及充电