多态的深入理解

对于Java的多态概念的理解

    在学习Java的过程中,我们无论如何也绕不过多态这个东西。它到底是个什么东西呢?

  其实,它就是指调用相同名字的方法,但是得到的结果是不同的。

第一: 对象是方法

  多态的作用范围是方法,不是类不是对象,也不是对象里面的属性

第二: 多态产生的条件

  1、有继承---在子类中有方法重写---在方法的调用中,有指向子类的父类的引用

  2、有方法的重载,就是相同方法名,但参数不同(个数,类型,顺序)

第三:为什么需要多态?

  因为真实世界中的情况是纷繁复杂的,为了应对生活中的种种情况,我们就

需要程序能够分别应对各种情况。即增加了程序的灵活性,来满足客户需求。

第四:Java运行时的多态性

  运行时多态性或动态方法分派是一个过程,它对重写方法的调用在运行时体现而不是编译时。

  在此过程中,通过超类的引用变量调用重写的方法。 要调用的方法基于引用的对象。

  了解运行时多态性之前,让我们先来向上转换。

  向上转换

  当父类的引用变量引用子类的对象时,称为向上转换。 例如:

class A{}
class B extends A{}
A a=new B();  //向上转换...

Java运行时多态性示例1

在这个例子中,我们创建两个类:BikeSplendar。 Splendar类扩展Bike类并覆盖其run()方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。

因为方法调用是由JVM不是编译器决定的,所以它被称为运行时多态性。
class Bike {
    void run() {
        System.out.println("running");
    }
}

class Splender extends Bike {
    void run() {
        System.out.println("running safely with 60km");
    }

    public static void main(String args[]) {
        Bike b = new Splender();// upcasting - 向上转换
        b.run();
    }
}

执行上面代码得到以下结果 -

running safely with 60km.

Java运行时多态性示例2:Bank

考虑一种情况,Bank类是一个提供获得利率的方法的类。 但是,利率可能因银行而异。 例如,SBIICICIAXIS银行分别提供8.4%7.3%9.7%的利率。

  

注意:此示例也在方法覆盖中给出,但没有向上转换。

class Bank {
    float getRateOfInterest() {
        return 0;
    }
}

class SBI extends Bank {
    float getRateOfInterest() {
        return 8.4f;
    }
}

class ICICI extends Bank {
    float getRateOfInterest() {
        return 7.3f;
    }
}

class AXIS extends Bank {
    float getRateOfInterest() {
        return 9.7f;
    }
}

class TestPolymorphism {
    public static void main(String args[]) {
        Bank b;
        b = new SBI();
        System.out.println("SBI Rate of Interest: " + b.getRateOfInterest());
        b = new ICICI();
        System.out.println("ICICI Rate of Interest: " + b.getRateOfInterest());
        b = new AXIS();
        System.out.println("AXIS Rate of Interest: " + b.getRateOfInterest());
    }
}

上面代码执行结果如下 -

SBI Rate of Interest: 8.4
ICICI Rate of Interest: 7.3
AXIS Rate of Interest: 9.7

Java运行时多态性示例3:Shape

class Shape { // 基类(形状)
    void draw() {
        System.out.println("drawing...");
    }
}

class Rectangle extends Shape {
    void draw() {
        System.out.println("drawing rectangle...");
    }
}

class Circle extends Shape {
    void draw() {
        System.out.println("drawing circle...");
    }
}

class Triangle extends Shape {
    void draw() {
        System.out.println("drawing triangle...");
    }
}

class TestPolymorphism2 {
    public static void main(String args[]) {
        Shape s;
        s = new Rectangle();
        s.draw();
        s = new Circle();
        s.draw();
        s = new Triangle();
        s.draw();
    }
}

上面代码执行结果如下 -

drawing rectangle...
drawing circle...
drawing triangle...

Java运行时多态性示例4:Animal

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating bread...");
    }
}

class Cat extends Animal {
    void eat() {
        System.out.println("eating rat...");
    }
}

class Lion extends Animal {
    void eat() {
        System.out.println("eating meat...");
    }
}

class TestPolymorphism3 {
    public static void main(String[] args) {
        Animal a;
        a = new Dog();
        a.eat();
        a = new Cat();
        a.eat();
        a = new Lion();
        a.eat();
    }
}

上面代码执行结果如下 -

eating bread...
eating rat...
eating meat...

Java运行时多态性与数据成员

上面示例中,都是有关方法被覆盖而不是数据成员,因此运行时多态性不能由数据成员实现。
在下面给出的例子中,这两个类都有一个数据成员:speedlimit,通过引用子类对象的父类的

引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问父类的数据成员。

规则: 运行时多态性不能由数据成员实现。

class Bike {
    int speedlimit = 90;
}

class Honda3 extends Bike {
    int speedlimit = 150;

    public static void main(String args[]){
        Bike obj=new Honda3();
        System.out.println(obj.speedlimit);//90
    }
}

上面代码执行结果如下 -

90

总结:在实际使用的时候,我们会定义多个同名的方法,通过方法重载和方法重写的方式。

方法重载: 例如Java自带的println方法,无论是输入数字、字符、字符串,都可以正确的打印出来。   

作为用户,它不关心是怎么实现的,只要拿来就能用,就能完成想要程序去完成的任务,

那么,这个程序就是ok的,就酱紫~

 

原文地址:https://www.cnblogs.com/zjulanjian/p/10269224.html

时间: 2024-10-10 23:10:34

多态的深入理解的相关文章

一个小例子对多态简单的理解

class Parent{ int age; String name; public Parent(String name, int age){ this.name = name; this.age = age; } public void writeWay(){ System.out.println("毛笔!"); } } class Child extends Parent{ int age; String name;//这里只说为了说明一个问题,其实完全可以有父类继承而来. pu

我对多态的的理解以及重载和重写

同一种语句有多重形态,在不同的类型中,有不同的属性和表现方法: 多态原理:多态的是函授指针 多态的实现效果 多态:同样的调用语句有多种不同的表现形态: 多态实现的三个条件  有继承.有virtual重写.有父类指针(引用)指向子类对象. 多态的C++实现 virtual关键字,告诉编译器这个函数要支持多态:不要根据指针类型判断如何调用:而是要根据指针所指向的实际对象类型来判断如何调用 多态的理论基础  动态联编PK静态联编.根据实际的对象类型来判断重写函数的调用. 多态的重要意义  设计模式的基

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

摘录 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做有什么意义呢?因为子类是对父类的一个改进

php类的封装、继承和多态的简单理解

.面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象: 我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性  封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作.  php提供了三种访问控制修饰符  public 表示全局,本类内部,类外部,子类都可以访问  protected 表示受保护的,只有本类或子类可以访问  pr

c++多态的简单理解

基类中有一个抽象函数 很多个子类继承这个基类 要想使用将子类的对象赋值给基类对象,且使用基类对象可以调用到子类对象的方法,那么这个方法必须是在基类中抽象的,子类中实现的.如果基类中这个方法不是抽象方法,只是个普通的成员函数,那么将子类对象赋值给基类对象,基类对象调用这个方法的时候调用的是基类的方法而不是子类的方法,这样就不是多态了. 什么是多态呢? 基类中和子类中必须有同一个方法,且基类中的方法是抽象.这个在子类对象指针赋值给基类对象指针的时候,基类对象指针调用方法的时候才调用的是子类中的方法

对于Java中main函数为虚函数以及多态的一点理解

Question: 1.在Java中,由于main函数的定义为: public static void main(String[] args):那么要想在main函数中调用其余的函数的话,就必须将定义为static.另外,调用其他类编写的成员函数时,却不需要该成员函数为静态的,这是为什么? 分析: 静态方法是属于某一个类所有,而非静态方法是属于某类的对象所有.也就是说,要想调用非静态方法,必须先调用new来得到一个类的对象,系统为其分配内存,然后才能通过该对象访问相应的非静态成员函数.而静态方法

对于多态的个人理解

'''什么事多态?对台就是一个基础的类,可以有很多种形式,就好比下面的例子,人可以分为男人和女人,男人怎么走路,然后女人又是怎么走路的,这样就属于多态了 又好比,同样是人,有的人内向,有的人外向,这两种性格都是属于人,性格这一个大类的多态,花是一个类,但是又,菊花,百合,牡丹,兰花,玫瑰花,等等,这些都是花这一个类的多态''' class person:     def __init__(self,name,walk):         self.name=name         self.w

.Net高级技术:对多态的深入理解

一.C#多态的特性使得设计模式成为可能 二十多种设计模式的都是基于多态 二.多态的表现形式 1.普通类 子类能够继承父类的所有成员(父类的私有成员子类对象不能直接访问到),包括父类实现的接口已经父类继承的其他类的成员. 将方法标记为virtual,表示子类可以重写这个方法(当然也可以不重写): 将方法标记为sealed,表示子类不允许重写这个方法: 特性:隔代继承,子类对象能访问父类所有的非私有成员: 2.抽象类 可以有实现的成员,也可以有非实现的成员: 可以有virtual方法,子类可以重写,

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

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