java 多态环境下对 方法和成员变量的调用

本文介绍了Java中多态的三种应用场景:成员方法调用、静态成员方法调用及成员变量访问。通过具体示例展示了如何在多态环境中正确使用这些特性。

1.多态环境下对成员方法的调用

class  Animal{

           void show() {

             System.out.println(“Anmial");

          }

}

class Cat  extends Animal{

              void show() {

                    System.out.println(“cat");

              }

}

…….

Animal x = new Cat()

   x.show() //调用的是子类中的方法。编译看左边,运行看右边。


*2.多态环境下对静态成员方法的调用

class  Animal{

          static  void show() {

             System.out.println(“Animal");

          }

}

class Cat extends Animal {

             static  void show() {

                    System.out.println(“Cat");

              }

}

…….

Animal x= new Cat()

   x.show() //调用的是动物类中的静态成员方法。编译和运行都看左边


3.多态环境下对成员变量的调用


class Animal{

      int num = 3;

}

class Cat  extends Animal {

      int  num = 4;

}

…….

Animal x = new Cat()

x.num; //调用的是动物类中的成员变量。编译和运行都看等号左边。




### Java多态性中成员变量方法调用的原理及使用方式 #### 1. 成员变量调用机制 在 Java多态性中,**成员变量的访问不具有运行时多态性**。当通过父类引用访问子类对象的成员变量时,Java 编译器根据引用类型决定访问哪个变量,而不是根据实际对象的类型。这意味着成员变量的绑定是**静态绑定**(编译时绑定),而不是动态绑定。 例如: ```java class Animal { String name = "Animal"; } class Dog extends Animal { String name = "Dog"; } public class Test { public static void main(String[] args) { Animal a = new Dog(); System.out.println(a.name); // 输出 "Animal" } } ``` 在这个例子中,尽管 `a` 实际指向的是 `Dog` 类型的对象,但由于 `a` 的引用类型是 `Animal`,因此访问的是 `Animal` 类中的 `name` 变量。这种行为表明成员变量的访问不具有运行时多态性,它由引用类型决定[^1]。 #### 2. 方法调用的机制 与成员变量不同,**方法调用具有运行时多态性**。Java 中的方法调用分为两种绑定方式: - **静态绑定**:包括静态方法、私有方法、构造方法 `final` 方法,它们的调用在编译阶段就已确定。 - **动态绑定**:普通实例方法在运行时根据对象的实际类型决定调用哪个方法,这是多态的核心机制。 当子类重写了父类的方法,通过父类引用调用方法时,JVM 会根据实际对象的类型来决定执行哪个方法。例如: ```java class Animal { void speak() { System.out.println("Animal speaks"); } } class Dog extends Animal { @Override void speak() { System.out.println("Dog barks"); } } public class Test { public static void main(String[] args) { Animal a = new Dog(); a.speak(); // 输出 "Dog barks" } } ``` 在此例中,尽管 `a` 是 `Animal` 类型的引用,但指向的是 `Dog` 实例,因此调用的是 `Dog` 类中的 `speak()` 方法。这种行为体现了 Java 中的**虚拟方法调用**,即运行时根据对象的实际类型决定调用哪个方法[^3]。 #### 3. 多态的使用方式 多态的实现方式主要包括以下三种: - **父类定义,子类构建**:通过父类引用指向子类对象,实现运行时多态。 - **接口定义,实现类构建**:通过接口引用调用实现类的方法。 - **抽象类定义,实体类构建**:通过抽象类引用调用具体子类的实现。 例如: ```java interface Animal { void move(); } class Fish implements Animal { @Override public void move() { System.out.println("Fish swims"); } } class Bird implements Animal { @Override public void move() { System.out.println("Bird flies"); } } public class Test { public static void main(String[] args) { Animal a1 = new Fish(); Animal a2 = new Bird(); a1.move(); // 输出 "Fish swims" a2.move(); // 输出 "Bird flies" } } ``` 在这个例子中,通过接口类型的引用调用 `move()` 方法,JVM 会在运行时根据对象的实际类型选择执行相应的方法,这体现了接口实现类构建的多态性[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值