当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2014-11-18   作者:abc08010051   来源:转载   浏览:
摘要: 首先来看一段代码: public class ExtendDemo { public static void main (String[] args) { SuperClass superClass = new SuperClass(); SuperClass subClass = new SubClass(); superClas

首先来看一段代码:

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 指令调用实例方法,调用实例方法的时候才会根据对象的实际类型来调用具体的方法,才能实现重写

 

  

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
方法的重写: 1、在子类中可以根据需要对从基类中继承来的方法进行重写。 2、重写的方法和被重写的
重写的原则 请看这道题: QUESTION NO: 10 Click the Exhibit button. Which statement is true abo
在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?
第一步:在网站项目涨添加URLRewriter程序集的引用和FormRewriterControlAdapter程序集引用。 注:
该文介绍windows2003下的IIS6是,Asp.net isapi伪静态在web.config文件里配置方法图解和示例。 Inte
1、右键点击 要设置网站的网站 2、属性 ——》主目录 ——》配置——》 3、如右侧窗口,找到 .aspx
  首先,说下equals和hashCode的关系。JDK API中关于Object类的equals和hashCode方法中说过,总结
java 支持方法重载,这种机制为类似功能的方法提供了统一的名称,但可根据参数行的不同而自动调用对
java 支持方法重载,这种机制为类似功能的方法提供了统一的名称,但可根据参数行的不同而自动调用对
很多人只会用Collections中不带比较器Comparator的sort方法完成一些对存储整形Integer的动态数组Arr
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号