java静态方法是否可以被重写

首先来看一段代码:

public class ExtendDemo {
    public static void main (String[] args) {
        SuperClass superClass = new SuperClass();
        SuperClass subClass = new SubClass();
        superClass.find();//根据对象引用类型决定调用父类或子类的方法
        subClass.find(); //根据对象引用类型决定调用父类或子类的方法
        System.out.println("+++++++++++++++++++++++++++++++++");
        superClass.test();
        subClass.test();
        System.out.println("+++++++++++++++++++++++++++++++++");
        SubClass subClass1 = new SubClass();
        superClass.find();//根据对象引用类型决定调用父类或子类的方法
        subClass1.find(); //根据对象引用类型决定调用父类或子类的方法
    }
}

class SuperClass {

    public static void find () {
        System.out.println("find");
    }

    public void test () {
        System.out.println("superclass test method");
    }

}

class SubClass extends SuperClass {

    public static void find () {
        System.out.println("hello");
    }

    @Override
    public void test () {
        System.out.println("subclass test method");
    }
}

   运行结果:

  

find
find
+++++++++++++++++++++++++++++++++
superclass test method
subclass test method
+++++++++++++++++++++++++++++++++
find
hello

    由上面的结果可以看出:静态方法没有被重写;上面的例子总子类中有相同声明的静态方法, 具体调用父类中的方法还是子类中的方法是根据对象引用的类型来决定,如果对象引用类型是父类,就调用父类中的find()方法,如果对象引用是子类,就调用子类的静态方法;这与重写的概念不相符,重写的概念是根据对象实际类型来调用具体的方法

  

   上面main方法的java的字节码:

 

new com/malone/pattern/SuperClass
dup
invokespecial com/malone/pattern/SuperClass/<init>()V
astore_1
new com/malone/pattern/SubClass
dup
invokespecial com/malone/pattern/SubClass/<init>()V
astore_2
aload_1
pop
invokestatic com/malone/pattern/SuperClass/find()V //调用父类的find方法,invokestatic 指令调用静态方法,根据对象引用类型判断调用方法
aload_2
pop
invokestatic com/malone/pattern/SuperClass/find()V //调用父类的find方法,invokestatic 指令调用静态方法,根据对象引用类型判断调用方法
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "+++++++++++++++++++++++++++++++++"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
aload_1
invokevirtual com/malone/pattern/SuperClass/test()V
aload_2
invokevirtual com/malone/pattern/SuperClass/test()V
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "+++++++++++++++++++++++++++++++++"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
new com/malone/pattern/SubClass
dup
invokespecial com/malone/pattern/SubClass/<init>()V
astore_3
aload_1
pop
invokestatic com/malone/pattern/SuperClass/find()V //调用父类的find方法,invokestatic 指令调用静态方法,根据对象引用类型判断调用方法
aload_3
pop
invokestatic com/malone/pattern/SubClass/find()V  //调用子类的find方法,invokestatic 指令调用静态方法,根据对象引用类型判断调用方法
return

    invokevirtual 指令调用实例方法,调用实例方法的时候才会根据对象的实际类型来调用具体的方法,才能实现重写

 

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值