java三大特性-----------------------多态

Java三大特性之多态

多态的定义:指允许不同类的对象对同一个消息做出响应,即同一消息可以根据发送对象的不同采用多种行为方式。

就我个人经历来说,对一个新人一开始就理解这个定义还是有一点难度的(可能是我比较蠢)。我觉的还是用java的方式来理解可能会简单一点:

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

举个大家都熟悉的例子,《木兰诗》中有一句“双兔傍地走,安能辨我是雌雄”;雌兔(A)和雄兔(B)都是兔子(rabbit)的子类,但是双兔傍地走的时候你是分不出的,只有抓起来看看眼睛才能区别(雄兔脚扑朔,雌兔眼迷离)。下面我们可以用java代码来表示“双兔 ”:

Rabbit a = 雌兔;

Rabbit b= 雄兔;

在这里表现的就是多态,雌兔和雄兔都是兔子的子类,我们通过父类可以引用不同的子类-------我们只有在运行的时候才会直到引用类型所指向的具体实例对象

A a= new A();

这很容易理解,无非就是实例化了一个雌兔对象,但是你看下面这样呢???

Rabbit  r= new A();

我们可以这样理解,这里定义了一个Rabbit r,它指向了 A 对象实例。由于A与Rabbit是继承关系,所以A可以向上转型成Rabbit,所以r是可以指向A的实例对象的。。。这样做有一个非常非常好的好处:在上一次继承中我们讲了,子类是父类的扩展,它可以提供比父类更为强大的功能,如果我们定义了一个指向子类的父类引用类型,那么他除了能引用父类的共性外,还可以使用子类强大的功能。

但是向上转型存在一些缺陷,就是它必然会导致一些方法属性的丢失,使我们不能够获取他们:所以就有:父类类型引用可以调用父类中定义的方法和属性,但是对于子类中的方法和属性就望尘莫及了

我们来看一下代码:

public  class Rabbit{

public void fun1(){

System.out.println(" ------------------->Rabbit的fun1()")

public void fun2(){

System.out.println("----------Rabbit的fun2()")

}

}

}

public class  A(){

/*

* 子类重载父类的方法,父类中不存在该方法,父类是不能引用该方法

*/

public void fun1(String a){

System.out.println("------------->A的fun1()")

}

/*

* 子类重写父类方法,指向子类的父类引用调用fun2()的时候必然会调用子类中的*fun2()

*/

public void fun2(){

System.out.println("----------->A的fun2()")

}

}

我们测试一下:

public class Test{

public static  void  main(String args[]){

Rabbit r = new A();

r.fun1();

r.fun2();

}

}

______________________________________________________________________

Output:

------------------------->Rabbit的fun1()

-------------------------->A的fun2()

所以对于多态我们可以初步总结如下:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)

多态经典案例:

public class A {  
    public String show(D obj) {  
        return ("A and D");  
    }  
 
    public String show(A obj) {  
        return ("A and A");  
    }   
 
}  
 
public class B extends A{  
    public String show(B obj){  
        return ("B and B");  
    }  
      
    public String show(A obj){  
        return ("B and A");  
    }   
}  
 
public class C extends B{  
 
}  
 
public class D extends B{  
 
}  
 
public class Test {  
    public static void main(String[] args) {  
        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();  
        D d = new D();

// 优先级由高到低依次为:  
        // this.clarify(O)、super.clarify(O)、this.clarify((super)O)、super.clarify((super)
        // a2.clarify(b),a2是一个引用变量,类别为A,则this为a2,  
        // b是B的一个的举例,于是它到类A里面找clarify(B obj),没有找到,  
        // 于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.clarify((super)O),  
        // this仍然是a2,那里O为B,(super)O即(super)B即A,因此它到类A里面找clarify(A obj),  
        // 类A有那个窍门,但是由于a2引用的是类B的一个的对象,B覆盖了A的clarify(A  
        // obj)窍门,因此最终锁定到类B的clarify(A obj),输出为"B and A”
          
        System.out.println("1--" + a1.show(b));  
        System.out.println("2--" + a1.show(c));  
        System.out.println("3--" + a1.show(d));  
        System.out.println("4--" + a2.show(b));  
        System.out.println("5--" + a2.show(c));  
        System.out.println("6--" + a2.show(d));  
        System.out.println("7--" + b.show(b));  
        System.out.println("8--" + b.show(c));  
        System.out.println("9--" + b.show(d));        
    }  
}

总结:

、多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

2、指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)

3、在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。即先查this对象的父类,没有就重头再查参数的父类

希望能给各位帮助~~~~(>_<)~~~~ !!!!!

时间: 2024-12-16 01:47:39

java三大特性-----------------------多态的相关文章

三、java三大特性--多态

面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是为了重用父类代码.两个类若存在IS-A的关系就可以使用继承,同时继承也为实现多态做了铺垫.那么什么是多态呢?多态的实现机制又是什么? 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

浅谈Java三大特性

Java三大特性想必大家都不陌生:封装.继承以及多态.很多刚接触Java的小伙伴都会想,它们到底有什么了不得之处,又赋予Java这门编程语言什么魔力呢?今天我们来探讨一下吧~~ 首先,名词解释: 封装,即是隐藏一切可隐藏的东西,对外界只提供最简单的编程接口.比如,在一个类中,把数据和操作方法绑定起来,对数据的访问只能通过这些 get/set 方法(又称为接口)来实现. 为什么封装?比如,我是一个厨师,我有一本食谱,你今天想吃肉,让我帮忙露两手.具体加了多少盐,放了多少醋你不需要关心(隐藏具体实现

跟王老师学Java三大特性(一):案例 QuickHit:需求分析

项目案例:QuickHit:需求分析 主讲教师:王少华   QQ群号:483773664 学习目标 学会用面向对象思想来进行需求分析 一.需求 根据输入速率和正确率将玩家分为不同级别 级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高 规定时间内完成规定次数的输入,正确率达到规定要求,则升级 玩家最高级别为6级.初始级别一律为1级 用户错误输入一次,游戏结束 二.面向对象分析 (一) 发现类 玩家(Player)类 游戏(Game)类 级别(Level)类 (二)发现类的属性 1.玩家

java三大特性之封装

1.封装 封装概述:是指隐藏对象的属性和实现细节,仅仅对外提供公共访问方式. 好处: 隐藏实现细节,提供公共的访问方式 提高了代码的复用性 提高了安全性 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性隐藏,提供公共方法对其访问. 2.private关键字 private关键字是一个权限修饰分,可以修饰成员变量和成员方法,被private修饰的成员变量或成员方法只能在本类中使用. private最常见的应用:1.把成员变量用private修饰 2.提供对应的setter和getter方法.

跟王老师学Java三大特性(三):案例 QuickHit:确认输入并输出结果

案例 QuickHit:确认输入并输出结果 主讲教师:王少华   QQ群号:483773664 学习目标 完成Game类中的printResult方法的编写 一.需求说明 确认用户输入并输出结果 二.思路分析 确认玩家输入是否正确 如果输入不正确,则直接输出错误信息并退出程序 如果输入正确 如果超时,则直接输出错误信息并退出程序 如果不超时 计算玩家当前积分 计算 玩家已用的时间 输出当前玩家的级别.当前积分.已用时间: 判断用户是已经闯过最后一关并处理 三.参考代码 1 2 3 4 5 6 7

Golang-面向对象编程三大特性-多态

Golang-面向对象编程三大特性-多态 基本介绍 变量(实例)具有多种形态.面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的.可以按照统一的接口来调用不同的实现.这时接口变量就呈现不同的形态. 快速入门 在前面的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态特性.[点明] 接口体现多态的两种形式 多态参数 在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态.

理解java三大特性之多态

---恢复内容开始--- 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是为了重用父类代码.两个类若存在IS-A的关系就可以使用继承.,同时继承也为实现多态做了铺垫.那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间

【转】java提高篇之理解java的三大特性——多态

面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是为了重用父类代码.两个类若存在IS-A的关系就可以使用继承.,同时继承也为实现多态做了铺垫.那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底