多态-成员变量-成员函数-静态函数 之间的注意点与区别

本文深入探讨了Java中父类与子类的关系,特别是在成员变量、成员函数和静态函数的使用中,展示了不同情况下如何确定调用的具体实现。揭示了‘编译看左边,运行看右边’的原则,并解释了这一原则在不同情况下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.成员变量

package gt;

/**
 * Created by Cronous on 2017/10/30.
 */
public class day02 {
    public static void main(String[] args){
        Fu f = new Zi();
        System.out.println("num = " + f.num);
    }
}

class Fu {
    int num = 2;
}
class Zi extends Fu{
    int num = 3;
}
控制台打印 num = 2 

这里子类对象被提升为父类对象,所以 f.num 为父类对象 num 值,如果父类没有 num 变量则编译失败

也就是编译和运行都参考左边


2.成员函数

package gt;

/**
 * Created by Cronous on 2017/10/30.
 */
public class day02 {
    public static void main(String[] args){
        Fu f = new Zi();
        f.show();
    }
}

class Fu {
    void show(){
        System.out.println("fu show");
    }
}
class Zi extends Fu{
    @Override
    void show() {
        System.out.print("Zi show");
    }
}

控制台打印 Zi show

为什么呢?按照父类提升应该打印 Fu show 的,这就是成员函数的与成员变量的区别

编译时:参考引用型变量所属的类中是否有调用的函数,有编译通过,没有,编译失败

运行时:参考对象所属类中是否有调用的函数

总结:编译看左边,运行看右边


3.静态函数

package gt;

/**
 * Created by Cronous on 2017/10/30.
 */
public class day02 {
    public static void main(String[] args){
        Fu f = new Zi();
        f.method();
    }
}

class Fu {
    void show(){
        System.out.println("fu show");
    }
    static void method(){
        System.out.println("fu static method");
    }
}
class Zi extends Fu{
    @Override
    void show() {
        System.out.print("Zi show");
    }
    static void method(){
        System.out.println("zi static method");
    }
}
da'y
控制台打印

fu static method

static不依赖于对象,类存在它即存在。所以提升父类型 f.method 运行父类静态代码

并且这里的 f.method 调用静态方法其实是没有意义的


结论:除了成员函数编译看左边,运行看右边,其他都只是看左边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值