`

java中静态方法和非静态方法覆盖的区别

阅读更多

首先我们提供两个类,基类为Parent,派生类为Child。在Parent中我们提供两个方法,一个是静态方法staticMethod(),一个是非静态方法nonStaticMethod()。在Child类中我们覆盖着两个方法。

java 代码
  1. class Parent{    
  2.   
  3.  public void nonStaticMethod() {       
  4.        System.out.println("Parent's Non-Static Method is Called");    
  5.  }      
  6.   
  7. public static void staticMethod() {     
  8.               System.out.println("parent's static method is called");     
  9.  }    
  10.   
  11. }    
  12.   
  13. class Child extends Parent{    
  14.   
  15.  public void nonStaticMethod() {     
  16.   
  17.           System.out.println("child's non-static method is called");     
  18.   
  19.  }     
  20.   
  21.  public static void staticMethod() {    
  22.   
  23.                System.out.println("child's static method is called");     
  24.   
  25.      }      
  26.   
  27. }    
  28.   

 

在Test类中我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child() 得到三个实例,并分别调用静态方法和非静态方法,我们来看程序的运行结果 在Test类中我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child()得到三个实例,并分别调用静态方法和非静态方法,我们来看程序的运行结果

 

java 代码
  1. public class Test{    
  2.   
  3.       public static void main(String args[])          {      
  4.   
  5.        Parent p1 = new Parent();      
  6.   
  7.         Parent p2 = new Child();      
  8.   
  9.        Child c = new Child();    
  10.   
  11.      System.out.print("Parent.static: ");    
  12.   
  13.                 Parent.staticMethod();     
  14.   
  15.      System.out.print("p1.static: ");    
  16.   
  17. p1.staticMethod();     
  18.   
  19.          System.out.print("p2.static: ");    
  20.   
  21. p2.staticMethod();    
  22.   
  23.         System.out.print("p1.nonStatic: ");    
  24.   
  25.         p1.nonStaticMethod();    
  26.   
  27.         System.out.print("p2.nonStatic: ");    
  28.   
  29.         p2.nonStaticMethod();    
  30.   
  31.         System.out.print("Child.static: ");    
  32.   
  33. Child.staticMethod();    
  34.   
  35.       System.out.print("c.static: ");    
  36.   
  37.                  c.staticMethod();     
  38.   
  39.          System.out.print("c.nonStatic: ");    
  40.   
  41.         c.nonStaticMethod();     
  42.   
  43.       }    
  44.   
  45. }    
  46.   

程序的运行结果为:

Parent.static: parent's static method is called

p1.static: parent's static method is called

p2.static: parent's static method is called

p1.nonStatic: Parent's Non-Static Method is Calle

p2.nonStatic: child's non-static method is called

Child.static: child's static method is called

c.static: child's static method is called

c.nonStatic: child's non-static method is called

值得注意的是p2实际上是一个Child的类型的引用,然而在调用静态方法的时候,它执行的却是父类的静态方法,而不是Child的静态方法,而调用 p2的非静态方法的时候执行的是Child 的非静态方法,为什么呢?原因是静态方法是在编译的时候把静态方法和类的引用类型进行匹配,而不是在运行的时候和类引用进行匹配。因此我们得出结论:当我们在子类中创建的静态方法,它并不会覆盖父类中相同名字的静态方法。

Test类中我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child() 得到三个实例,并分别调用静态方法和非静态方法,我们来看程序的运行结果 在Test类中我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child()得到三个实例,并分别调用静态方法和非静态方法,我们来看程序的运行结果
分享到:
评论
1 楼 jarwang 2007-07-27  
<quote>因此我们得出结论:当我们在子类中创建的静态方法,它并不会覆盖父类中相同名字的静态方法。
</quote>

这样的结论是有点不正解吧.
1、Parent p2 = new Child();
2、Child c = new Child();

方式1涉及塑型,而静态方法是属于类的,也就是在类初始化就分配了。
方式2是实例化类,实例化后,不管是静态方法,还是非静态方法。当然就是对象的了。

相关推荐

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

    Java 中静态方法和非静态方法的区别 Java 作为一种功能强大、可靠性高、跨平台的编程语言,广泛应用于企业级应用开发、移动应用开发、云计算、大数据处理等领域。了解静态方法和非静态方法的区别是 Java 编程的基础...

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

    ### Java之中的静态变量与静态方法的继承与覆盖问题 #### 静态变量与静态方法的基本概念 在Java编程语言中,静态变量(也称为类变量)和静态方法(也称为类方法)是由`static`关键字修饰的成员变量和成员方法。...

    Java的静态方法调用.pdf

    Java中的方法调用分为两种主要类型:静态方法调用和非静态(实例)方法调用。静态方法调用是指在不创建对象的情况下直接通过类名来调用的方法,它与类相关联,而不是类的实例。这种方式在处理与类相关的属性或不需要...

    Java中的静态绑定和动态绑定Java开发Java经验技巧

    Java中的所有非静态方法(包括实例方法和覆盖的方法)都是动态绑定的。这意味着,即使在编译时我们使用的是父类引用,但在运行时,如果该引用指向的是子类的对象,那么将会调用子类重写的方法。这是多态性的基础,...

    Java方法继承、方法重载、方法覆盖总结

    ### Java方法继承、方法重载、方法覆盖总结 ...综上所述,方法继承、方法重载和方法覆盖是Java面向对象编程中的三个重要概念。正确理解和运用这些概念能够帮助开发者编写出更加灵活、高效和可维护的代码。

    java实例方法被覆盖,静态方法被隐藏Explain(详解)

    实例方法的覆盖发生在子类对父类的非静态方法进行重新定义的情况下。当子类对象调用这个方法时,如果子类有与父类相同名称和参数列表的方法,那么将会调用子类的方法,这就是多态性的一种体现。Java中的方法覆盖有...

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

    此外,静态方法和非静态方法在多线程环境中的表现也不同。静态方法是线程安全的,除非它修改了类的静态变量,否则多个线程同时调用不会引起数据竞争问题。非静态方法则可能涉及到对象的状态,因此在多线程环境下需要...

    java中方法的继承,覆盖.doc

    当一个类(子类)继承另一个类(父类)时,子类会自动获得父类的所有非私有(public和protected)成员,包括字段和方法。这意味着子类可以访问并使用父类中的这些方法,而无需再次定义。这是实现代码复用和多态性的...

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

    为了达到预期的重写效果,需要将静态方法改为非静态方法。这样,调用将基于对象的实际类型,而非编译时的类引用,从而实现动态绑定或晚绑定。例如: ```java class Dog { public void bark() { System.out.print...

    java中final和static的区别

    4. 用 private 修饰的 static 成员变量和成员方法,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很...

    Java 实例 - 方法覆盖源代码-详细教程.zip

    在Java编程语言中,方法覆盖(Method Overriding)是一个核心概念,它允许子类重新定义父类中的非私有方法。这个"Java 实例 - 方法覆盖源代码-详细教程.zip"压缩包文件很可能是为了帮助学习者深入理解这一概念而准备...

    java api中文文档

    Java API中文文档是Java开发者的重要参考资料,它详细阐述了Java平台标准版(Java SE)的各种类库、接口和方法。这两个版本,1.6和1.8,分别代表了Java发展过程中的两个重要里程碑。 首先,让我们关注"java_api_1.6...

    Java 继承和方法重写

    Java 8 开始支持默认方法和静态方法。 **二、方法重写(Override)** 1. **定义**: 方法重写是指子类重新定义父类中的某个方法,保持方法名、参数列表和返回类型不变,但可以修改方法的实现。 2. **重写规则**...

    Java编程中常用修饰词使用方法

    Java 语言中的修饰词可以用来控制成员的访问权限、确保类和方法的不可变性、定义抽象类和抽象方法、调用 native 库、确保浮点计算的精度和可移植性、确保多线程环境中的安全执行等等。正确地使用修饰词可以提高 Java...

    java学习笔记 继承 重载 覆盖

    类方法(静态方法)同样可以被类名直接调用,它无法访问非静态成员,因为静态方法与特定实例无关。 封装是面向对象编程的重要特性,它通过访问控制修饰符(public、protected、default、private)来保护数据并控制...

    使用PowerMock来Mock静态函数

    PowerMock是一个强大的扩展工具,它可以与Mockito、EasyMock等主流Mock框架结合,允许我们模拟静态方法、构造器、final类和方法、删除静态初始化器等。 标题“使用PowerMock来Mock静态函数”指的是如何利用...

    java静态工厂方法详细解析——使用静态工厂方法代替构造器

    在Java中,我们可以为一个类定义多个静态工厂方法,每个方法根据其名称和参数来区别,以创建具有特定状态的对象。例如: ```java class People { String name; int age; int weight; public static People get...

    Java中实现在一个方法中调用另一个方法

    3. 静态方法不能被非静态方法覆盖。 4. 不同类间的非静态方法调用必须通过对象实例进行。 理解这些规则对于编写清晰、可维护的Java代码至关重要。正确使用静态和非静态方法可以帮助优化程序结构,提高代码的复用性...

    Java方法的覆盖与隐藏的区别分析

    Java中的方法覆盖(Override)和隐藏(Hiding)是面向对象编程中的两个重要概念,它们涉及到多态性和运行时类型识别(RTTI)。在Java中,这两种情况在处理继承关系时会产生不同的行为。 1. **方法覆盖(Override)*...

Global site tag (gtag.js) - Google Analytics