『踩坑记录』Java中static方法为什么不能被重写

本篇博客来验证一下Java中static方法能不能被重写。

首先,我们先来看一下多态的效果

class People {
    public void buyTicket() {
        System.out.println("成人买票,全价!");
    }
}

class Student extends People {
    @Override
    public void buyTicket() {
        System.out.println("学生买票,半价!");
    }
}

public class Test {
    public static void main(String[] args) {
        People[] peoples = {
                new People(),
                new Student()
        };

        for (People people : peoples) {
            buyTickets(people);
        }
    }

    private static void buyTickets(People people) {
        people.buyTicket();
    }
}

运行结果如下
在这里插入图片描述

下面,我们试着把People和Student中的buyTicket()方法改为静态方法

class People {
    public static void buyTicket() {
        System.out.println("成人买票,全价!");
    }
}

class Student extends People {
    @Override
    public static void buyTicket() {
        System.out.println("学生买票,半价!");
    }
}

public class Test {
    public static void main(String[] args) {
        People[] peoples = {
                new People(),
                new Student()
        };

        for (People people : peoples) {
            buyTickets(people);
        }
    }

    private static void buyTickets(People people) {
        people.buyTicket();
    }
}

我们来编译一下
在这里插入图片描述
可以看到重写父类中的static方法失败了

但其实上述编译失败并不是因为不能重写父类中的static方法。首先我们要知道重写是为了什么?

  • 我们知道重写是实现多态的前提,在Java语法中允许子类出现和父类只有方法体不同其他都一模一样的static方法,但是在父类引用指向子类对象时,通过父类引用调用的依然是父类的static方法,而不是子类的static方法
  • 语法上支持对static方法的重写,但是运行效果上无法达到多态的目的
  • 上述的报错是因为@Override注解检查到buyTicket()方法在逻辑上达不到重写的目的,所以报错了。

我们将@Override注解去掉,看一下运行效果:

class People {
    public static void buyTicket() {
        System.out.println("成人买票,全价!");
    }
}

class Student extends People {
    public static void buyTicket() {
        System.out.println("学生买票,半价!");
    }
}

public class Test {
    public static void main(String[] args) {
        People[] peoples = {
                new People(),
                new Student()
        };

        for (People people : peoples) {
            buyTickets(people);
        }
    }

    private static void buyTickets(People people) {
        people.buyTicket();
    }
}

在这里插入图片描述
可以看到,和我们预期的一样,无法达到多态的效果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值