`

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

 

  

 

分享到:
评论

相关推荐

    java伪静态URL重写的方法

    伪静态URL重写实际就是以静态地址(如:http://127.0.0.1:8080/pro/index.html)访问地态网页的方法(如:http://127.0.0.1:8080/pro/index.jsp)。 伪静态URL重写是通过微软公司封装好了的一个URL重写组件...

    Java中的静态方法能否被重写?

    * 非静态方法属于类的实例,是可以被子类重写,从而达到多态的效果;  静态方法属于类,是不能被重写,故而也不能实现多态。 *  下面是具体的验证过程  首先,定义一个超类A,里边定义一个静态方法和一个非...

    Java中方法重载与重写的区别

    1、重载  方法的重载是同一个类中多态性的一种表现。  方法重载须遵循如下两条规则  (1)方法名相同。  (2)参数列表不同。  注意:方法的返回值类型不能用来区分重载的方法。...  (5)静态方法不存在重

    浅谈java中静态方法的重写问题详解

    本篇文章是对java中静态方法的重写问题进行了详细的分析介绍,需要的朋友参考下

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    重载与覆写/重写的区别

     如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。  在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。  但有时子类并不想原封不动地继承父类的方法,...

    伪静态(url重写)

    伪静态(url重写)伪静态(url重写)伪静态(url重写)

    InterfaceTest.java 这段代码用于理解接口静态、默认(可重写)、接口中的方法、多实现、多继承知识点

    这段代码用于学习接口时,更加深刻理解接口静态、默认(可重写)、接口中的方法、多实现、多继承等知识点。

    Java编程子类能否重写父类的静态方法探索

    关于子类能否重写父类的静态方法,对像我这种初级的编程爱好者来说仍是值得讨论的一件事,下面我们通过具体实例,对此问题进行简单的探索。

    java Thread

    创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.创建主方法调用类 里面有源码,导入myeclipse执行

    Java经典面试题.pdf

    静态关键字用于修饰类的成员(方法、变量、代码块),使其在类加载时被初始化,并且可以通过类名直接访问。静态成员属于类本身,而不是类的实例。静态方法无法访问非静态成员。 4.什么是Java的final关键字? final...

    IOS 静态方法与动态方法详解

    IOS 静态方法与动态方法详解 ... 从根本来说,c++、objective-c、java都发源于c语言,因此这些语言实际上可以理解了经过封装的c语言,所以它们更加方便使用但效率不如c语言。  因此,对象的底层实际上就是结构体

    Java面试题超级全.zip

    抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized? ``` 都不能。 1.抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。 2.本地...

    java面试真题整理

    4.Java多态的体现方式方法的重载,重写,对象的多态性 1.编译时的多态:方法重载(个数、类型、顺序) 2.运行时多态:重写,对象的多态性(父类的引用指向子类的实例) 5.CSDN 1.泛型的好处 保护类型安全 避免...

    Java复习大纲面试题.doc

    一、简答题 1.编译java程序使用什么命令?运行java使用什么命令?...区别:方法重载没有继承、属于一种静态联编技术。 方法重写有继承、属于动态联编技术。 10.什么是抽象类?什么是接口?抽象类与接口的区别?

    浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    主要介绍了浅谈Java中的重载,重写,多态,静态绑定、动态绑定,具有一定借鉴价值

    Java面试题.docx

    8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因? 9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用 10、string 转换成 integer的方式及原理 11-20题: 11、哪些...

    urlrewrite重写demo

    urlrewrite重写demo,伪静态技术实现

    java 基础 类对象创建实例化过程 实例解析

    * (如果是重写即子类将父类的实例方法重写类,则调用子类的,如果是隐藏即方法则父类中声明为静态方法,则调用父类本身的但具体方法中的成员是否被子类修改需要进行分析) —&gt; * 下一层次的父类中重复前一个过程

    JAVA 实现URL重写工具 UrlRewriter Java v2.0 RC1-urlrewriterjava

    幸运的是,现在有专门的开源框架可以简化URL重写的任务。本文将重点介绍UrlRewriter框架,该框架配置简单,使用方便。 首先,我们来探讨使用URL重写为网站带来的几大好处: 1. **提升搜索引擎优化(SEO)**:考虑到...

Global site tag (gtag.js) - Google Analytics