【发布时间】:2014-06-30 23:51:02
【问题描述】:
我最近参加了一次采访。面试官问了一个类似
的问题- 什么是静态多态和动态多态???
我在互联网上进行了搜索,但无法找到答案。谁能帮我解决这个问题...
感谢和问候, 阿马尔
【问题讨论】:
-
是专门针对 Java 职位的吗?
-
你用谷歌搜索了吗??
标签: java
我最近参加了一次采访。面试官问了一个类似
的问题我在互联网上进行了搜索,但无法找到答案。谁能帮我解决这个问题...
感谢和问候, 阿马尔
【问题讨论】:
标签: java
多态的类型
1) 静态或编译时多态性
仅在编译时决定调用哪个方法。方法重载就是一个例子。方法重载是一个概念,我们在同一个类中多次使用相同的方法名,但参数不同。根据我们传递的参数,它仅在编译时决定。具有相同参数的相同方法名称是错误的,这是 c# 不允许的方法重复的情况。在静态多态中,决定是在编译时做出的。
public Class StaticDemo
{
public void display(int x)
{
Console.WriteLine(“Area of a Square:”+x*x);
}
public void display(int x, int y)
{
Console.WriteLine(“Area of a Square:”+x*y);
}
public static void main(String args[])
{
StaticDemo spd=new StaticDemo();
Spd.display(5);
Spd.display(10,3);
}
}
2) 动态或运行时多态性。
运行时多态性也称为方法覆盖。在此机制中,如果基类包含被覆盖的方法,则在运行时(而不是在编译时)解决对覆盖函数的调用。方法覆盖意味着拥有两个或多个具有相同名称、相同签名但具有不同实现的方法。在这个过程中,通过超类的引用变量调用被覆盖的方法,调用方法的确定是根据引用变量所引用的对象来确定的。
什么是多态性?聚意味着许多。那么我们如何在 .NET 上下文中采用这个定义。好吧,我们可以将此应用于类共享相同方法(操作)但实现方式不同的能力。
假设我们在一个类中有一个添加数字的方法,
public class calculation
{
public int add(int x, int y)
{
return x+y;
}
}
所以要执行三个数字的加法,我们需要类似的add方法,但参数不同
public class calculation
{
public int add(int x, int y)
{
return x+y;
}
public int add(int x, int y,int z)
{
return x+y+z;
}
}
所以我们可以让该类共享相同的方法(操作),但实现方式不同。
现在这是一个示例,当我们共享方法名称并以不同方式实现它们时,让我们看一个实现在某个派生类中的场景。
例如,假设我们创建了一个名为 Shape 的类,并且该类有一个名为 .Area () 的方法来计算面积。然后我们使用继承创建这个 Shape 类的两个子类。一个叫Square,另一个叫Circle。现在显然正方形和圆形是两种完全不同的形状,但两个类都有 .Area() 方法。当 Square.Area() 方法被调用时,它将计算正方形的面积。当调用 Circle.Area() 方法时,它将计算圆的面积。所以两个类可以使用相同的方法,但实现方式不同。
【讨论】:
运行时多态示例
在这个例子中,我们创建了两个类 Bike 和 Splendar。 Splendar 类扩展了 Bike 类并覆盖了它的 run() 方法。我们通过 Parent 类的引用变量调用 run 方法。由于它引用了子类对象,并且子类方法覆盖了Parent类方法,所以子类方法在运行时被调用。
由于方法调用是由 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();
}
}
Java 运行时多态的真实例子
考虑一个场景,Bank 是一个提供获取利率的方法的类。但是,利率可能因银行而异。例如,SBI、ICICI 和 AXIS 银行可以提供 8%、7% 和 9% 的利率
class Bank{
int getRateOfInterest(){return 0;}
}
class SBI extends Bank{
int getRateOfInterest(){return 8;}
}
class ICICI extends Bank{
int getRateOfInterest(){return 7;}
}
class AXIS extends Bank{
int getRateOfInterest(){return 9;}
}
class Test{
public static void main(String args[]){
Bank b1=new SBI();
Bank b2=new ICICI();
Bank b3=new AXIS();
System.out.println("SBI Rate of Interest: "+b1.getRateOfInterest());
System.out.println("ICICI Rate of Interest: "+b2.getRateOfInterest());
System.out.println("AXIS Rate of Interest: "+b3.getRateOfInterest());
}
}
【讨论】: