----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
如果说继承,抽象类,接口可以让我们组建一个能够实现复杂功能多层次的继承体系,那么多态就是对这个体系的应用。多态实现了对事物定义和实现的分离,就是说将做什么和怎么做分开。多态降低了类与类直接的耦合性,从而提高了扩展性。
继承体系中的对象,既可以被做为它本身的类型,也可以被当做它的基类。这也是是实现多态的前提。
多态
多态也是面向对象的特征之一。
多态:可以理解为事物存在的多种体现形态
人:男人,女人
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
多态的好处
预先定义的程序可以运行后期程序的内容。
多态的出现大大的提高程序的扩展性。
多态的弊端
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。
不能预先使用子类中定义的特有功能。
多态的应用
package itcast.heima; //为了提高主板功能的扩展性。 //定义了规则。让后期的出现的功能板块, //只要覆盖该规则,就可以被这个主板使用。 interface PCI { public void open(); public void close(); } class MainBoard{ public void run(){ System.out.println("mainboard run"); } public void usePCI(PCI p){ //判断p是否指向实体对象 if(p!=null){ p.open(); p.close(); } } } class NetCard implements PCI{ public void open(){ System.out.println("NetCard open"); } public void close(){ System.out.println("NetCard close"); } } class SoundCard implements PCI{ public void open(){ System.out.println("SoundCard open"); } public void close(){ System.out.println("SoundCard close"); } } public class DuoTaiDemo5 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } }
NetCard和SoundCard都实现了PCI接口,所以可以被当做PCI对象传入usrPCI(PCI p)方法中,即使在后期
我们
在多态中成员函数的特点
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员 函数在多态调用时,编译看左边,运行看右边。
对待静态方法编译和运行都看左边,因为静态方法先于对象已经存在。
package itcast.heima;
class Fu
{
int num = 5;
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
int num = 8;
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
static void method4()
{
System.out.println("zi method_4");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
Fu f = new Zi();
System.out.println(f.num);
f.method4();
Zi z = new Zi();
z.method4();
}
}
打印结果
f.method4()和z.method4()都是调用的的子类的方法。
如果父类中没有此方法,子类中有此方法,将编译失败。
反之将运行失败。
在多态中,成员变量的特点
无论编译和运行,都参考左边(引用型变量所属的类)。
例子来源于thinking in java
package itcast.heima;
class Super {
public int field = 0;
public int getField(){
return field;
}
}
class Sub extends Super {
public int field = 1;
public int getField(){
return field;
}
public int getSuperField(){
return super.field;
}
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub();
System.out.println("sup.field:" + sup.field +
" sup.getField():" + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field:" + sub.field +
" sub.getField():" + sub.getField() +
" sub.getSuperField():" + sub.getSuperField());
}
}
打印结果
可以看出成员变量是跟着引用走的,哪个对象去访问field,就返回哪个对象的field。thing in
java中认为,任何域的访问操作都是有编译器解析的,因此不是多态。在本例中field有两个Super.field和Sub.field。Super只包含Super.field。而Sub两个都包含,但默认默认域Sub.field。
因此才会有以上结果。当去掉Sub.field域后,Sub的中就只有Super.field。这是sub.field和field.getField()都将访问父类的field=0;
涉及到构造函数的多态
package itcast.heima;
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = "
+ radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
这里首先涉及到了继承中的对象初始化,创建一个子类是,会先去调用父类的构造函数,而后运行自己的构造器。但是在调用父类构造函数之前,子类对象会首先给对象赋予默认初始化值。所以radius在被父类构造函数运行之前会被赋值0,父类构造函数运行完后,会给radius显
示初始化radius=5,最后执行子类构造函数。
在这段代码中运行父类构造函数时,它调用了draw()方法,而draw()方法又被子类覆盖,所以父类构造函数运行的是RoundGlyph.draw(),正是这个方法可以访问子类中尚未初始化的数据(显示初
始化和构函数初始化)这会带来意想不到的麻烦,且相当隐蔽,所以尽量不要在父类构造器中访问被子类覆盖的方法。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
相关推荐
面向对象编程是一种编程范式,它基于对象和类的概念,强调模块化、抽象、继承和多态等特点。今天,我们将学习Java基础视频辅导班课堂笔记总结Day08中的面向对象编程相关知识点。 继承是面向对象编程的重要概念,它...
Java基础教学 - 面向对象(4)- 多态 在本文中,我们将讨论Java语言中的一种重要概念 —— 多态(Polymorphism)。多态是面向对象编程(OOP)中的一个核心概念,它允许我们编写更加灵活和可扩展的代码。 一、多态...
java 继承与多态应用 输出员工信息java 继承与多态应用 输出员工信息 代码实例
1、面向对象都有哪些特性以及你对这些特性的理解12 1、 Java 中实现多态的机制是什么 1、 Java 中异常分为哪些种类13 2、 调用下面的方法,得到的
* 多态:掌握多态的概念,以及多态的使用场景。 * 抽象类和接口:掌握抽象类和接口的概念,以及抽象类和接口的使用场景。 通过学习这些知识点,你将掌握Java基础语法、Java开发工具的使用、面向对象编程的思想,并...
java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB“ 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc ...黑马程序员入学Java精华总结.pdf
java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc ...黑马程序员入学Java精华总结.pdf
java面试笔试题库java学习比较开发教程互联网公司面试资料大全合集: 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc ...黑马程序员入学Java精华总结.pdf
类的继承和多态 Ⅲ.Collection集合和Map集合的设计和API使用,以及集合的嵌套 Ⅳ.lambda表达式遍历集合,以及比较器comparator()匿名内部类的使用 V.使用Stream流操纵集合 功能: ①日志框架搭建、系统角色设计 ②...
Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 2. Java基础语法、类型转换、运算符、Scanner 3. 分支结构、循环结构、随机数 4. 数组详解、Debug工具...
面向对象: Java是一种纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的概念。这使得Java编写的代码更加模块化、可维护和可扩展。 多线程支持: Java内置了对多线程的支持,允许程序同时执行多个任务。这...