1、运行时多态和编译时多态的区别?
编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态
运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态!
运行时多态,也就是动态绑定,是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断并调用相应的属性和方法.看看下面这个例子:
abstract class Animal {
private String name;
Animal(String name) {this.name = name;}
/*
public void enjoy(){
System.out.println("叫声......");//父类方法,下面的子类对该方法不满意,重写.
}
*/
public abstract void enjoy();//该方法没有实现的必要(所以我们一般声明为静态方法),但有定义的必要.
}
class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {super(n); eyesColor = c;}
public void enjoy() {
System.out.println("猫叫声......");
}
//public abstract void enjoy();//如果不想实现父类静态方法,可将此方法声明为静态的,该类也同时为abstract
}
class Dog extends Animal {
private String furColor;
Dog(String n,String c) {super(n); furColor = c;}
public void enjoy() {
System.out.println("狗叫声......");
}
}
class Bird extends Animal {
Bird() {
super("bird");
}
public void enjoy() {
System.out.println("鸟叫声......");
}
}
class Lady {
private String name;
private Animal pet;
Lady(String name,Animal pet) {
this.name = name; this.pet = pet;
}
public void myPetEnjoy(){pet.enjoy();}
}
public class Test {
public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Bird b = new Bird();
//Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
Lady l3 = new Lady("l3",b);
//l1.myPetEnjoy();
l2.myPetEnjoy();
l3.myPetEnjoy();
}
}
动态绑定的底层实现是指针,我们知道程序中的方法是一段代码,存放在专门的内存区域中(code segment---代码区),当我们在程序执行期间new 出一个对象后调用enjoy方法的时候,JVM动态的把指针指向实际的对象重写的方法,从而实现了动态绑定.
动 态绑定的最大好处就是给我们的程序的可扩展性带来了相当大的提高(上面的例子中我们可以继续添加子类或是在main方法中new lady,),如果没有动态绑定,我们一般情况下的做法是在子类中用instanceof判断一个对象是不是我们需要的当前具体对象,但当我们定义好多个 子类的时候,每次都要判断,现在有了动态绑定,我们不需要再去判断,而是JVM动态给我们指向具体的对象并调用相应的属性和方法.
相关推荐
多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...
在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...
多态有两种形式:编译时多态和运行时多态。编译时多态是指在编译时确定对象的类型,而运行时多态是指在运行时确定对象的类型。 5.4 多态的应用 多态的应用包括: * 方法重写 * 方法重载 * 运算符重载 5.5 构造...
这主要体现在方法的多态和类型的多态上。例如,运算符 "+" 在不同的上下文中有不同的解释,如正数运算、加法运算和字符串连接,这就是多态的一个例子。在Java中,子类可以被视为其父类的一种类型,即子类对象可以...
2. **运行时多态**:通过方法的覆盖和接口实现,子类对象可以通过父类引用调用方法,表现出不同的行为。这是Java中最常见的多态形式,也称为动态绑定。 例如: ```java public class Animal { public void sound...
多态分为编译时多态和运行时多态。编译时多态主要通过方法重载实现,而运行时多态则依赖于方法重写和接口实现。 1. **方法重载(Overloading)**:在同一类中,方法名相同但参数列表不同的方法称为重载方法。Java...
在Java中,多态分为编译时多态和运行时多态。编译时多态主要通过方法重载实现,运行时多态主要通过方法重写(Override)和接口实现实现。 **2. 方法重写** 当子类继承父类并覆盖(Override)父类的某个方法时,这...
在 Java 中,多态可以分为两种:编译时多态和运行时多态。编译时多态是通过方法重载来实现的,方法重载是指在同一个类中可以有多个同名的方法,但这些方法的参数列表不同。在编译时,编译器会根据方法的参数列表来...
多态分为编译时多态和运行时多态。编译时多态主要通过方法的重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于...
在Java中,多态主要分为编译时多态和运行时多态。编译时多态主要是通过方法重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。运行时多态则是通过方法重写(Overriding)来实现,子类可以...
首先,多态性主要体现在两个方面:编译时多态和运行时多态。编译时多态主要是通过方法重载(Overloading)实现,即在一个类中定义多个同名但参数列表不同的方法。运行时多态则依赖于方法重写(Overriding),即子类...
通常,Java程序员将多态视为对象调用正确方法版本的能力,这是由于动态绑定(也称为晚期绑定)机制,即在运行时决定调用哪个方法。 在Java中,多态主要体现在以下几个方面: 1. 子类型多态:这是Java中最常见的...
在Java中,多态性主要体现在两个方面:编译时多态和运行时多态。 编译时多态主要通过方法重载实现,而运行时多态则依赖于继承和接口。例如: ```java public abstract class Vehicle { public abstract void move...
在Java中,多态分为编译时多态和运行时多态。编译时多态主要通过方法重载(Overloading)实现,即在同一类中定义多个同名但参数列表不同的方法。运行时多态则是通过方法重写(Overriding)实现,子类可以重写父类的...
运行时类型识别(RTTI)通过`instanceof`关键字和`getClass()`方法提供了一种检查对象实际类型的方式,从而安全地执行向下类型转换。 #### 八、多态的陷阱:置换私有方法 在多态的场景下,私有方法不参与多态机制,...
在编译器隐式地将参数转换成正确的类型时,会避免类型转换的麻烦,减少编译错误。 例子: ```java 2.0 + 2.0 2.0 + 2 2.0 + "2" ``` 在上面的例子中,编译器隐式地将第二个操作数转换为 double 型,并作 double ...
在Java中,多态主要体现在两个方面:**编译时类型与运行时类型的不同**以及**对象的向上转型和向下转型**。 #### 编译时类型与运行时类型 在Java中,每个引用变量都有两种类型:**编译时类型**和**运行时类型**。...
接着,我们来看多态的两种主要形式:编译时多态和运行时多态。编译时多态通常通过函数重载和运算符重载实现,编译器在编译阶段就能确定调用哪个函数。而运行时多态则是在程序运行时才决定调用哪个函数,这是通过虚...
在Java中,多态有两种形式:编译时多态(方法重载)和运行时多态(方法重写)。这里主要讨论的是运行时多态,通过接口或继承实现。 假设`Employee`类有一个抽象方法`printInfo()`,`Manager`和`Worker`作为`...