多态中的成员访问特点之静态成员方法

  • 静态方法

    • 编译看左边(父类),运行看左边(父类)。
    • (静态和类相关,算不上重写,所以,访问还是左边的)
    • 只有非静态的成员方法,编译看左边,运行看右边

      class Demo02_Polymorphic {
          public static void main(String[] args) {
              /*Father f = new Son();                 //父类引用指向子类对象
              System.out.println(f.num);
      
              Son s = new Son();
              System.out.println(s.num);*/
      
              Father f = new Son();
              //f.print();
              f.method();                             //相当于是Father.method()
          }
      }
      /*
      成员变量
      编译看左边(父类),运行看左边(父类)
      成员方法
      编译看左边(父类),运行看右边(子类)。动态绑定
      静态方法
      编译看左边(父类),运行看左边(父类)。
      (静态和类相关,算不上重写,所以,访问还是左边的)
      只有非静态的成员方法,编译看左边,运行看右边 
      */
      class Father {
          int num = 10;
          public void print() {
              System.out.println("father");
          }
      
          public static void method() {
              System.out.println("father static method");
          }
      }
      
      class Son extends Father {
          int num = 20;
      
          public void print() {
              System.out.println("son");
          }
      
          public static void method() {
              System.out.println("son static method");
          }
      }
      

      输出结果:father static method

### 多态成员访问特点总结 #### 成员变量 在多态的情况下,成员变量的访问依赖于 **编译时类型**(即声明变量时使用的类型)。无论实际运行时的对象是什么类型,成员变量始终按照声明类型的定义进行访问。这是因为成员变量不存在重写机制,其值仅取决于声明时的类型。 例如,在 `Parent` 和 `Child` 类的关系中,如果父类有一个成员变量 `int value` 并被子类重新定义,则通过父类引用访问该变量时,返回的是父类版本的值[^2]。 ```java class Parent { int value = 10; } class Child extends Parent { int value = 20; } public class Main { public static void main(String[] args) { Parent obj = new Child(); System.out.println(obj.value); // 输出 10 } } ``` #### 构造方法 子类的构造过程中会隐式调用父类的无参构造函数(如果没有显式指定其他构造器),这是为了确保子类对象能够正确初始化并继承父类的状态。这种行为与多态无关,而是面向对象编程的基础特性之一[^3]。 #### 静态方法 静态方法属于类本身而非具体实例,因此它们不受多态影响。即使通过子类对象调用了某个静态方法,实际上执行的仍然是声明类型所对应的类的方法。换句话说,静态方法的行为完全基于编译时类型决定。 ```java class Parent { static void display() { System.out.println("Parent"); } } class Child extends Parent { static void display() { System.out.println("Child"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); obj.display(); // 输出 "Parent" } } ``` #### 成员方法 对于成员方法而言,多态的核心体现就在于动态绑定——也称为后期绑定或运行时绑定。这意味着当一个方法被重写时,最终调用哪个版本的方法是由运行时的实际对象类型决定的,而不是由声明类型决定[^4]。 继续以上述例子为例: ```java class Parent { void show() { System.out.println("Parent Show"); } } class Child extends Parent { @Override void show() { System.out.println("Child Show"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); obj.show(); // 输出 "Child Show" } } ``` 这里的关键在于,尽管 `obj` 是以 `Parent` 类型声明的,但由于其实例是一个 `Child` 对象,所以在调用 `show()` 方法时选择了子类中的实现。 --- ### 总结表:多态下各部分的访问特点 | 访问目标 | 编译依据 | 运行依据 | 是否支持动态绑定 | |---------------|------------------|--------------------|-------------------| | 成员变量 | 左边(声明类型) | 左边 | 否 | | 构造方法 | 不适用 | 父类到子类链路自动触发 | 不适用 | | 静态方法 | 左边 | 左边 | 否 | | 成员方法 | 左边 | 右边(实际对象类型) | 是 | --- ### 注意事项 - 如果未发生方法重写,则即便处于多态环境中,仍只会调用父类原始定义的方法。 - 使用强制类型转换 (`instanceof`) 可以绕过多态限制,从而直接操作特定子类的功能[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值