面向对象的三大特征之三——多态

多态,简单来说就是一种类型表现出多种状态。在Java中多态分为两类。

一、方法多态性——方法的重载和重写。

关于这部分内容已经在前面的内容有过详细的记录,即重复调用的代码块—方法面向对象的特性之二—继承

二、对象的多态性——引用类型转换。

1.向上转型(自动转型)——子类对象自动转换为父类对象。

 1 class Father
 2 {
 3     public void speak()
 4     {
 5         System.out.println("我来自父类Father。");
 6     }
 7 }
 8 class Son extends Father
 9 {
10     public void speak()
11     {
12         System.out.println("我来自子类Son。");
13     }
14 }
15 class Daughter extends Father
16 {
17     public void speak()
18     {
19         System.out.println("我来自子类Daughter。");
20     }
21 }
22 public class T02
23 {
24     public static void main(String[] args)
25     {
26         Father p;
27         Son s = new Son();
28         Daughter d = new Daughter();
29         p=s;//子类对象向上类型转换为Father类型
30         p.speak();
31         p=d;
32         p.speak();
33     }
34 }

输出结果如下:

我来自子类Son。
我来自子类Daughter。

可以看出,第26行声明了一个父类对象p,但没有实例化;第27、28行分别声明子类对象s、d并实例化;经过赋值操作,将子类对象向上转型为Father类型。通过p调用其speak方法,实际输出的是子类对象的speak方法。这里就体现了多态性思想。

需要注意的是:上述父类对象只能调用被子类重写的方法,对于子类自己独有的方法,父类对象是无法访问的。

 1 class Father
 2 {
 3     public void speak()
 4     {
 5         System.out.println("我来自父类Father。");
 6     }
 7 }
 8 class Son extends Father
 9 {
10     public void speak()
11     {
12         System.out.println("我来自子类Son。");
13     }
14     public void print()
15     {
16         System.out.println("我是Tom。");
17     }
18 }
19 public class T02
20 {
21     public static void main(String[] args)
22     {
23         Father p;
24         Son s = new Son();
25         p=s;//子类对象向上类型转换为Father类型
26         p.speak();
27         p.print();//错误的,无法访问
28     }
29 }

那么如果非要调用子类的print()方法,那么就要用到下面的向下强制转型,将父类对象赋值给子类对象。

2.向下转型(强制转型)——父类对象强制转换为子类对象。

 1 class Father
 2 {
 3     public void speak()
 4     {
 5         System.out.println("我来自父类Father。");
 6     }
 7 }
 8 class Son extends Father
 9 {
10     public void speak()
11     {
12         System.out.println("我来自子类Son。");
13     }
14     public void print()
15     {
16         System.out.println("我是Tom。");
17     }
18 }
19 public class T02
20 {
21     public static void main(String[] args)
22     {
23         Father p = new Son();
24         p.speak();//自动类型转换
25         ((Son) p).print();//强制类型转换
26     }
27 }

如果同时存在多个子类,就需要使用instanceof关键字来检测转换的安全性,即在每次转换之前都加上一个if判断语句:

if(p instanceof Son)
{
     Son s1 = (Son)p();
}else
{
     System.out.println("无法转换!");
}

3.隐藏——static无法被重写的特性。

当我们不想调用子类中重写的方法,而希望调用父类中原来的方法时,就可以使用隐藏来实现。

 1 class Father
 2 {
 3     public static void speak()
 4     {
 5         System.out.println("我来自父类Father。");
 6     }
 7 }
 8 class Son extends Father
 9 {
10     public static void speak()
11     {
12         System.out.println("我来自子类Son。");
13     }
14 }
15 public class T02
16 {
17
18     public static void main(String[] args)
19     {
20         Father p = new Son();
21         p.speak();//调用的是父类中的speak()方法
22     }
23 }

输出结果:我来自父类Father。

时间: 2024-11-05 12:15:14

面向对象的三大特征之三——多态的相关文章

Java面向对象编程三大特征 - 多态

Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向子类对象的相关概念,对继承还没有完全明白的同学可进传送门:Java面向对象编程三大特征 - 继承. 一.抽象类 在继承中,我们已经了解了子父类的关系以及如何对子父类进行设计,如果已经存在多个实体类,再去定义父类其实是不断的抽取公共重合部分的过程,如果有需要将会产生多重继承关系.在抽取整理的过程中,除了

面向对象的三大特征——封装、继承、多态

接触过面向对象的人都知道面向对象有三大特征,分别是封装.继承和多态.这三者分别指的是什么,为什么是这哥仨,使用他们有什么好处,我们来梳理一下. 封装 原则:隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: ①将变化隔离. ②便于使用. ③提高重用性. ④提高安全性. Demo1: 比如一个学生类:他具有姓名和年龄两个属性,但是为了提高安全性和重用性,便于使用,我们将其封装起来. public class Student { private String name; private in

面向对象三大特征之多态

面向对象的三大特征:封装.继承.多态.今天重点来看一下"多态". 封装 指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法.将属性或方法进行封装,防止外部程序随机访问,加强代码的安全性. 继承 子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 子类继承父类,使用extends关键字. 子类可以访问父类那些属性和方法? private 本类       默认省略(default) 本类 同包     prote

面向对象的三大特征,封装、继承、多态的个人理解以及代码分析

面向过程:我们以前使用的是面向过程编程,你需要清除每个实现步骤,每个步骤每行代码都要仔仔细细的编写, 不知道过程就找不到结果,找到实现过程就可以得到实现结果. 例如: 我们在外打工租房子,我们需要了解每个每个房屋的出租信息,不然是找不到房子的. 面向对象:对象帮我们做事情,找到对应的对象我们就可以得到想要的结果.    例如: 我们找房子不在如此的繁琐,只要找到中介我们就不怕没有地方住,中介会帮你找房子,你只需支付对应的服务费即可. 面向对象的三大特征给我们带了巨大的好处,下面我们就来讲解一下.

php面向对象的三大特征

1.面向对象的三大特征:封装.继承.多态.(抽象(扩展的))2.00A:分析,OOD:设计,OOP:编程.3.封装:信息隐蔽,封装,所有的函数和方法,类中的属性和行为也是封装. 三个访问修饰符public.protected.private也是封装.4.public 公共的 谁都可以用,也可以修改:protected 受保护的 只有自己和后代可以使用和修改: private 私有的 只有自己可以使用和修改:5.继承: 扩展父类的内容,注意只能继承public和protected修饰的内容,而pr

黑马程序员--Objective-C之--OC面向对象的三大特征

OC面向对象的三大特征是封装.继承和多态. OC语言也支持面向对象的三大特征,OC提供了@private.@package.@protected.@public等访问控制符来实现封装 OC也允许子类来继承父类,并且支持多态. 一.封装 封装指的是將对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法对内部信息的操作和访问. OC的封装特性需要通过使用访问控制符来实现. (一).访问控制符 1.@private:当前类访问权限.如果类的成员变量使用@priva

解析PHP面向对象的三大特征

class BenHang extends Card{ /*构造函数与及构造的继承*/ function __construct($cardno,$pwd, $name,$money){ parent::__construct($cardno,$pwd, $name,$money); } function take($money){ echo "本行取款{$money}没有手续费·····<br>"; } function zhuan($money){ echo "

聊一聊面向对象的三大特征

学习Java语言程序设计也有一段时间了.现在我想对封装.继承和多态,在Java中面向对象的三大特征,总结一下我的理解,不妥当的地方望大家包涵.  封装.给我的感觉封装就是一个包装,一个代码是否健壮,与用不用封装有很大的关系,封装就像是包裹一个礼物,不仅让礼物看起来更加精美,而且还完善了内容.请看代码: class Person {     private String name;     private int age;     public void say() {         Syste

7 面向对象的三大特征

面向对象的三大特征为:封装.继承.多态. 1 封装(encapsulation) 1.1  广义上的封装就是包装,可以将方法看作是对为完成特定功能的代码的封装,可以把类看作对属性和方法的封装.... 狭义上的封装:将属性私有化,然后提供公有的getter和setter方法以供访问. 封装的优点: 1)隐藏了实现细节,简化开发  2)安全  3)提高了代码的可维护性和可扩展性. 步骤: 1)将属性私有化,将修饰符修改private的 2)提供公有的访问方法:getter方法:取值,setter方法