`

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

 

  

 

分享到:
评论

相关推荐

    静态(static)方法重写(override)

    综上所述,静态方法不能被重写,只能被隐藏。这是因为静态方法属于类级别,而不是对象级别。在实际应用中,我们应该注意区分静态方法和实例方法的特性及其调用方式,确保正确理解和使用这些特性来满足特定的设计需求...

    静态(static)方法的继承和重写

    虽然这不是真正意义上的重写,因为静态方法在Java中不能被覆盖,但子类可以拥有与父类静态方法相同签名的静态方法。这样做可能会导致命名冲突,因此在设计时需要特别注意。如果在子类中调用同名的静态方法,Java...

    Java 继承和方法重写

    使用 `@Override` 注解可以帮助编译器检查是否真正重写了父类方法,提高代码的可读性和安全性。 4. **方法覆盖与方法隐藏**: - **方法覆盖**:子类中定义了与父类同名、同参数列表的方法,属于重写。 - **方法...

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

    当一个类的静态方法被调用时,编译器会根据调用时的类类型来确定调用哪个方法,而不是根据对象的实际类型。这就是为什么即使在子类中定义了同名的静态方法,也不会发生重写,而是隐藏(Hiding)。隐藏意味着子类的...

    java伪静态URL重写的方法

    总之,Java伪静态URL重写是通过URL重写库和Web应用的配置实现的,它可以使得动态网站以静态URL的形式展现,从而提高网站的可访问性和SEO效果。在实际应用中,可以根据项目需求自定义更复杂的URL重写规则。

    Java中静态方法和非静态方法的区别.docx

    在静态方法中,由于它可以重写任何静态数据成员的值,因此静态方法可以覆盖静态变量的值。非静态方法也可以覆盖静态变量的值,但需要创建类对象。 七、内存分配 静态方法的内存是固定在内存中的,因此,我们不需要...

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

    静态方法可以被子类继承,但是不能被重写。子类可以继承父类的静态方法,但是不能覆盖父类的静态方法。 需要注意的是,静态方法是属于类的,而不是对象的。静态方法可以被子类继承,但是不能被重写。这是 Java 编程...

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

    本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...

    Java重写.docx

    2. @Override注解强制检查重写方法:我们可以使用@Override注解来强制检查方法的重写, 如果我们在子类中定义的方法签名与父类相同,那么编译器将会检查方法的重写是否正确。 需要注意的三点 在方法的重写中,我们...

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

    Java中的静态方法重写是一个常见的误解,因为实际上Java并不支持静态方法的重写(Override),而是支持静态方法的隐藏(Hiding)。这篇文章将深入探讨这个问题,帮助开发者理解静态方法调用的机制以及如何正确实现...

    java 页面静态化

    实现Java页面静态化的常见方法有两种: 1. **预渲染**:在系统启动或者后台定期任务中,根据特定的URL,通过Java代码获取数据并生成HTML文件,存储在文件系统或CDN上。这种方式适用于内容相对固定,更新不频繁的...

    Java方法重载和方法重写的区别.docx

    Java编程语言中,方法的两种重要特性是方法重载(Overloading)和方法重写(Overriding)。这两种机制都是为了实现多态性,但它们在实际应用中有着明显的区别。 **方法重载(Overloading)**: 方法重载发生在同一...

    java中的重载和重写的区别

    在这个例子中,`method`方法被重载了三次,每次的参数列表都不相同。 接着,我们来讨论方法的重写。重写发生在父类和子类之间,当子类继承父类时,如果子类定义了一个与父类中已存在的方法同名、同参数列表的方法,...

    Java中方法重写与方法重载的比较.pdf

    - **final关键字**:如果父类方法被声明为`final`,则子类无法重写该方法。而重载与`final`关键字无关。 - **static与非static**:静态方法不能被重写,但可以重载。非静态方法可以重写和重载。 理解并熟练掌握方法...

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

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

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    静态变量在子类中不是被覆盖而是被重新定义,而静态方法则可以被继承但不能被覆盖。 - 这些特性对于理解Java中的类继承机制非常重要,特别是在处理复杂的类层次结构时。了解这些规则有助于编写更清晰、更易于维护的...

    java代码静态检测规则

    ### Java代码静态检测规则概述 Java作为一种广泛应用的编程语言,在软件开发过程中,为了确保代码的质量、可维护性和安全性,采用代码静态检测工具是至关重要的。本文将详细介绍一系列针对Java代码的静态检测规则,...

    Java 生成静态页

    4. **URL重写**:为了使用户仍然可以通过原有的动态URL访问静态页面,我们需要进行URL重写。这通常通过Apache的mod_rewrite模块或者Java的Filter实现,将请求从动态路径转向静态文件。 5. **缓存策略**:生成的静态...

    java伪静态的实现doc

    Java 伪静态技术是一种优化网站性能和SEO(搜索引擎优化)的方法,它使得动态生成的网页在用户浏览器中显示为静态的URL,从而提供更好的用户体验和搜索引擎友好性。在Java中实现伪静态主要依赖于URL重写技术。 首先...

    java伪静态简单实例

    `urlrewrite`是一个基于Apache Tomcat的URL重写过滤器,它可以方便地实现URL的重写和伪装,包括实现伪静态功能。要使用`urlrewrite`,你需要先将其添加到你的项目依赖中,通常是在`pom.xml`文件中引入对应的Maven...

Global site tag (gtag.js) - Google Analytics