05_JavaSE之OOP--面向对象(多态)

对象(五)

一、多态的概述(Polymorphism)   

  多态可以理解成,事物具有多种形态,对象可以存在不同的形态。如:

  人可以有男人,女人;也可以分成学生,老师各种职业;

  动物可以有老鼠和猫,大象和狮子。

  多态则是面向对象三大特征之一,接下来我们依次谈谈多态的是什么样的,有什么好处和弊端,好处也就体现了他的作用,为什么会有多态的出现。

二、多态详述

  1. 多态的前提

  首先,必须要有继承

  其次,要有方法的重写

  再者,要有父类引用指向子类对象

  代码01

 1 public class TestPolymorphic {
 2     public static void main(String[] args){
 3         Person p = new Student();   //父类引用指向子类对象
 4         p.playChiJi();
 5     }
 6 }
 7
 8 // 父类
 9 class Person {
10     public void playChiJi(){
11         System.out.println("人在吃鸡");
12     }
13 }
14
15 //子类
16 class Student extends Person {                  //继承
17     public void playChiJi(){                    //重写
18         System.out.println("小学生在吃鸡");
19     }
20 }

  有继承,有方法的重写,有父类引用指向子类对象。那么多态有什么好处呢?

  2. 多态的好处

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

b.提高了代码的可维护性 (多态保证)    

  3. 多态的弊端

不能使用子类的特有属性和行为

  接下来,我们就详细分析,通过案例的形式来谈谈多态。

  4.多态 -- 成员变量访问特点

  a.成员变量:编译时看左边(父类),运行看左边(父类)。也就是说,父类引用指向子类时,访问的依旧是自己的成员变量。如代码02

 1 public class TestPolymorphic {
 2     public static void main(String[] args){
 3         Person p = new Student();   //父类引用指向子类对象
 4         System.out.println(p.num);
 5     }
 6 }
 7
 8 // 父类
 9 class Person {
10     int num = 10;
11     public void playChiJi(){
12         System.out.println("人在吃鸡");
13     }
14 }
15 //子类
16 class Student extends Person {                  //继承
17     int num = 20;
18     public void playChiJi(){                    //重写
19         System.out.println("小学生在吃鸡");
20     }
21 }

  结果是:10

  b.内存图:

   当运行编译的时候,看的是Person,编译看左边(父类),字节码进入方法区内;父类Person p指向的是自己的成员变量,运行时,指向的是super。因此,成员变量输出的结果是:10。

  而Student s = new Student();指向就是自己,this。因此s.num = 20。

  5.多态 -- 成员方法访问特点

  a.成员方法:编译看左边(父类),运行看右边(子类)。接下来,看上面的代码01

   b.解释一下:编译时,会去父类中查看有没有这个方法(playChiJi()),如果没有,那就报错;在运行的时候,执行的是子类的方法,因此也叫动态绑定。 

  小结一下:成员变量,编译看左边(父类),运行看左边(父类)。

        成员方法,编译看左边(父类),运行看右边(子类)。

  

  6.多态应用: 当做参数传递(实用)

 1 public class TestPolymorphic {
 2     public static void main(String[] args){
 3         method(new Student());
 4         method(new Girl());
 5     }
 6
 7     public static void method(Person p){
 8         p.playChiJi();
 9     }
10 }
11
12 // 父类
13 class Person {
14     int num = 10;
15     public void playChiJi(){
16         System.out.println("人在吃鸡");
17     }
18 }
19 //子类
20 class Student extends Person {                  //继承
21     int num = 20;
22     public void playChiJi(){                         //重写
23         System.out.println("小学生在吃鸡");
24     }
25 }
26
27 //子类
28 class Girl extends Person {                     //继承
29     int num = 20;
30     public void playChiJi(){                      //重写
31         System.out.println("美眉在吃鸡");
32     }
33 }

  一般开发中,很少用Person p = new Student(),而是以参数的形式进行传递,这样体现了多态的特性,父类引用指向子类的。可以直接传递这个对象。
  但是,父类不能使用子类的特有的方法和变量。如果,子类特有一个方法,那么就不能访问。
  这个时候又有了向下转型和向上转型。

  Person p = new Student();其实就是向上转型,Student转成Person,向上转型。

  Student s = (Student)p;向下转型。先有父类,才能向下转型。

  后续还有很多需要补充,目前先到这里。

如有错误之处,欢迎指正。

邮箱:[email protected]

原文地址:https://www.cnblogs.com/csiOS/p/8520330.html

时间: 2024-10-28 21:06:42

05_JavaSE之OOP--面向对象(多态)的相关文章

python中的oop面向对象基本编程(类、实例、魔术)

                  OOP面向对象(老师说这玩意蕴含基本哲学哦!!) 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.数据封装.继承和多态是面向对象的三大特点. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把

简单理解OOP——面向对象编程

OOP:面向对象编程 一. 什么是OOP 面向对象编程:Object-oriented Programming,OOP,面向对象程序设计. 面向对象编程是一种计算机编程架构,他的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成. OOP使得程序更有重用性.灵活性和扩展性.OOP的核心思想是:封装.继承.多态(重点是类和对象). 不同于POP(面向过程编程)的以过程为中心的编程思想,面向对象编程的中心思想是通过调用对象来实现想要实现的目的. 面向对象的思想: 是一种更符合我们

OOP 面向对象

我们是怎么思考和解决上面的问题的呢? 答案是:我们自己的思维一直按照步骤来处理这个问题,这是我们常规思维,这就是所谓的面向过程POP编程 二.面向过程POP为什么转换为面向对象OOP 面向过程想的思想步骤越多,变化越多,是无法掌控的,所以有时候非常复杂,就比如我们拿起来手机玩游戏如果按照POP编程则代码如下: namespace OOP { /// <summary> /// OOP 面向对象编程 Object Oriented Programming /// </summary>

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

转:OC面向对象—多态

OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?

OC面向对象-多态

OC面向对象-多态 一.基本概念 1>多态在代码中的体现,即为多种形态,没有继承就没有多态 2>在使用多态时,会进行动态检测,以调用真实的对象方法 3>多态在代码中的体现即父类指针指向子类对象 Animal类的声明 #import <Foundation/Foundation> //声明一个Animal类,该类继承自NSObject @interface Animal : NSObject //在Animal类中声明一个eat的对象方法 -(void) eat; @end A

深入理解OOP(二):多态和继承(继承)

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

面向对象多态之接口

申明下:我也是新手,以下如有不对或不合适的地方望指出,一起交流O(∩_∩)O哈! 好了,转入正题 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Interface 7 { 8 class InterfaceTest 9 { 10 static void Main(string[] args) 11 { 12 #region 测试

黑马程序猿-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或

黑马程序员-面向对象-多态

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一多态的前提:(1)要有继承关系(或