猿教程 Logo

Java 多态

Java中的多态是一个概念,通过它我们可以通过不同的方式执行单个动作。 多态性派生自2个希腊词:多和形态。 词语“poly”意为许多,“morphs”意为形式。 所以多态性意味着许多形式。

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

如果你在Java中重载静态方法,它就是编译时多态性的例子。 这里,我们将关注Java中的运行时多态性。


Java中的运行时多态性

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

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

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

向上转换

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


相关实例:

class A{}
class B extends A{}

相关实例:

A a=new B();//upcasting

Java运行时多态性示例

在这个例子中,我们创建两个类Bike和Splendar。 Splendar类扩展Bike类并覆盖其run()方法。 我们通过Parent类的引用变量调用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();
   }
 }
Output:running safely with 60km.

Java运行时多态性示例:Bank

考虑一种情况,银行是一个提供获得利率的方法的类。 但是,利率可能因银行而异。 例如,SBI,ICICI和AXIS银行正在提供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运行时多态性示例: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运行时多态性示例: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运行时多态性与数据成员

方法被覆盖而不是数据成员,因此运行时多态性不能由数据成员实现。

在下面给出的例子中,这两个类都有一个datamember speedlimit,我们通过引用子类对象的Parent类的引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问Parent类的数据成员。

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

相关实例:

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不会覆盖eat()方法,所以Dog类的eat()方法被调用。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Java/runtime-polymorphism-in-java.html