个性化阅读
专注于IT技术分析

Java多态性

本文概述

多态性在Java是一个概念,我们可以以不同的方式执行一个动作。多态性是来自2希腊词:保利和变种。“聚”这个词意味着许多和“变种”是指形式。所以多态性意味着许多形式。

有两种类型的Java的多态性:多态性编译时和运行时多态。我们可以执行java方法重载和方法重写的多态性。

如果你超载一个静态方法在Java中,这是编译时多态的例子。在这里,我们将集中在java运行时的多态性。


在Java运行时多态

运行时多态或动态方法调度是一个过程,在运行时调用一个覆盖方法解决,而不是编译时。

在这个过程中,通过调用一个覆盖方法引用父类的变量。的确定要调用的方法是基于引用的对象被称为变量。

运行时多态之前我们先了解向上转型。

向上转型

如果父类的引用变量指的是子类的对象,它被称为向上转型。例如:

class A{}
class B extends A{}
A a=new B();//upcasting

向上转型,我们可以使用类类型或接口的引用变量的类型。例如:

interface I{}
class A{}
class B extends A implements I{}

在这里,B类的关系是:

B IS-A A
B IS-A I
B IS-A Object

因为对象是所有类的根类在Java中,我们可以写B是一个对象。


Java运行时多态的例子

在这个例子中,我们创建两个类自行车和辉煌。辉煌类扩展了自行车类并覆盖其运行()方法。我们调用run方法的引用父类的变量。因为它指的是子类对象和子类方法覆盖父类的方法,在运行时调用子类的方法。

因为方法调用是由JVM没有编译器,它被称为运行时多态。

class Bike{
   void run(){System.out.println("running");}
 }
 class Splendor extends Bike{
   void run(){System.out.println("running safely with 60km");}
 
   public static void main(String args[]){
     Bike b = new Splendor();//upcasting
     b.run();
   }
 }

输出:

running safely with 60km.

Java运行时多态的例子:银行

考虑这样一个场景,银行是一个类,它提供了一个方法来得到利率。然而,根据银行利率可能有所不同。

注意:本例中给出的方法覆盖但没有向上转型。

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运行时多态的例子:形状

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运行时多态的例子:动物

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运行时多态与多级继承

让我们看看运行时的多态性与多级继承的简单的例子。

class Animal{
void eat(){System.out.println("eating");}
}
class Dog extends Animal{
void eat(){System.out.println("eating fruits");}
}
class BabyDog extends Dog{
void eat(){System.out.println("drinking milk");}
public static void main(String args[]){
Animal a1,a2,a3;
a1=new Animal();
a2=new Dog();
a3=new BabyDog();
a1.eat();
a2.eat();
a3.eat();
}
}

输出:

eating
eating fruits
drinking Milk

尝试为输出

class Animal{
void eat(){System.out.println("animal is eating...");}
}
class Dog extends Animal{
void eat(){System.out.println("dog is eating...");}
}
class BabyDog1 extends Dog{
public static void main(String args[]){
Animal a=new BabyDog1();
a.eat();
}}

输出:

Dog is eating

以来,BabyDog不是覆盖吃()方法,所以吃狗类的()方法被调用。

赞(0)
未经允许不得转载:srcmini » Java多态性

评论 抢沙发

评论前必须登录!