`

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开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    JAVA面试题最全集

    静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java 面试题 总结

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    疯狂JAVA讲义

    学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 ...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    21天学通Java-由浅入深

    232 11.7 习题 232 第12章 内部类(精彩视频:71分钟) 234 12.1 非静态内部类 234 12.1.1 创建非静态内部类 234 12.1.2 在外部类中访问内部类 235 12.1.3 在外部类外访问内部类 236 12.1.4 在内部类中访问外部类 ...

    Java开发技术大全 电子版

    4.3属性隐藏和方法的覆盖148 4.3.1属性的隐藏148 4.3.2方法的覆盖151 4.4构造方法的继承154 4.5super的使用156 4.5.1用super引用父类的成员156 4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 ...

    杰普学习corejava总结笔记

    调用父类构造器(注意调用父类构造器之前已经给父类的非静态的属性显示赋值,如果有显示赋值的话) 5.父类构造器执行完后,如果自己声明属性的同时有显示的赋值,那么进行显示赋值把默认值覆盖 6.执行匿名代码块 7....

    Java面向对象程序设计笔记

    2.5.方法的覆盖: 11 2.6.各种数据类型之间的相互转换: 12 3.静态成员 13 4. Final关键字: 13 5. 抽象类: 13 6. 接口 14 7. 接口与抽象类的区别: 15 8. 设计模式 15 单一设计模式: 15 策略...

    java编程基础,应用与实例

    5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1...

    java编程练习题

    并调用他们的属性和方法。 7,写Shape类,要求如下: 1.int类型属性x和y,分别表示图形的中心点坐标 2.无参构造器 3.构造器,对x和y进行初始化 4.draw()方法,输出"Shape draw" 写Circle类,继承Shape类,要求...

    实验2 类和继承(4学时)

    掌握静态方法的定义和使用方法; 掌握Object类中equals方法和toString方法的覆盖方法。 二、实验内容 1、设计一个名为figure的图形软件包(package)。包中包含三角形、矩形、圆三个类。要求:(1)每个类都要构造...

    关于JAVA面试的100题及其答案

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    java经典面试2010集锦100题(不看你后悔)

    A) 抽象类的关键字是abstract,在抽象类中可以定义变量和方法。 B) 抽象类中的方法如果可以有实现体,如果没有实现体,则该方法叫做抽象方法必须加关键字abstract修饰该方法。 C) 抽象类中至少需要有一个方法被定义...

Global site tag (gtag.js) - Google Analytics