java多态的概念_对于Java的多态概念的理解

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

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

多态的作用范围是方法,不是类不是对象,也不是对象里面的属性第二: 多态产生的条件

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

2、有方法的重载,就是相同方法名,但参数不同(个数,类型,顺序)第三:为什么需要多态?

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

需要程序能够分别应对各种情况。即增加了程序的灵活性,来满足客户需求。第四:Java运行时的多态性

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

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

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

向上转换

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

class B extends A{}

A a=new B();  //向上转换...

Java运行时多态性示例1

在这个例子中,我们创建两个类:Bike和Splendar。 Splendar类扩展Bike类并覆盖其run()方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。因为方法调用是由JVM不是编译器决定的,所以它被称为运行时多态性。

AAffA0nNPuCLAAAAAElFTkSuQmCCclass 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();

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

执行上面代码得到以下结果 -running safely with 60km.

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

AAffA0nNPuCLAAAAAElFTkSuQmCCclass 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());

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

上面代码执行结果如下 -SBI Rate of Interest: 8.4ICICI Rate of Interest: 7.3AXIS Rate of Interest: 9.7

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

AAffA0nNPuCLAAAAAElFTkSuQmCCclass 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();

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

上面代码执行结果如下 -drawing rectangle...

drawing circle...

drawing triangle...

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

AAffA0nNPuCLAAAAAElFTkSuQmCCclass 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();

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

上面代码执行结果如下 -eating bread...

eating rat...

eating meat...

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

上面示例中,都是有关方法被覆盖而不是数据成员,因此运行时多态性不能由数据成员实现。

在下面给出的例子中,这两个类都有一个数据成员:speedlimit,通过引用子类对象的父类的

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCCclass 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     }

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

上面代码执行结果如下 -90

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

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

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值