`
123003473
  • 浏览: 1041518 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

静态方法隐藏、重写、继承

    博客分类:
  • java
 
阅读更多
静态方法可以通过二种形式来调用,一种是类名加方法名,另一种是类引用加方法名.
上述程序中通过第二种方式来调用静态方法,其实质是检查引用的类型来调用静态方法(即类名加方法名的方式).

静态成员(方法和属性)属于类而不是属于对象,静态方法,静态属性,动态属性早在编译期就已经确定(弱弱地说,相关地址数据存储在虚拟机的方法区类数据中).
-------------------------------------------------------------------------
1. 静态方法可以被继承.
程序一:
Java代码  
/** 
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC) 
 * All rights reserved. 
 * Author: Jarg Yee <yeshaoting@gmail.com> 
 * http://jarg.iteye.com/ 
 */  
import static java.lang.System.out;  
  
/** 
  * 静态方法可以被继承 测试程序 - 父类 
  */  
class SuperClass  
{  
    /** static method in the super class. */  
    public static void display()  
    {  
        out.println("in the super class.");  
    }  
}  
  
  
/* 
 * 静态方法可以被继承 测试程序 - 子类 
 */  
public class SubClass extends SuperClass  
{  
    /** for debugging. */  
    public static void main(String[] args)  
    {  
        SubClass sub = new SubClass();  
        sub.display();  // 调用子类继承父类的静态方法  
    }  
}  
 
---------- 运行Java ----------
in the super class.


输出完成 (耗时 0 秒) - 正常终止

根据输出结果: in the super class.可知:
sub.display(); 调用子类继承了父类的静态方法.
由此可见: 子类可以继承父类的静态方法.

2. 静态方法被隐藏不能被重写.
程序二:
Java代码  
/** 
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC) 
 * All rights reserved. 
 * Author: Jarg Yee <yeshaoting@gmail.com> 
 * http://jarg.iteye.com/ 
 */  
import static java.lang.System.out;  
  
/** 
  * 静态方法被隐藏不能被重写 测试程序 - 父类 
  */  
class SuperClass  
{  
    /** static method in the super class. */  
    public static void display()  
    {  
        out.println("in the super class.");  
    }  
}  
  
  
/* 
 * 静态方法被隐藏不能被重写 测试程序 - 子类 
 */  
public class SubClass extends SuperClass  
{  
    /** for debugging. */  
    public static void main(String[] args)  
    {  
        SubClass sub = new SubClass();      // 上转型对象  
        sub.display();  // 调用子类自己的静态方法  
  
        SuperClass sup = new SubClass();    // 子类对象  
        sup.display();  // 用被隐藏的父类静态方法  
    }  
  
    /** static method in the super class. */  
    public static void display()  
    {  
        out.println("in the sub class.");  
    }  
}  
 
---------- 运行Java ----------
in the sub class.
in the super class.

输出完成 (耗时 0 秒) - 正常终止


对于动态方法,上转型对象调用的将会是子类中重写父类的动态方法.
而对于此处的静态方法,父类子类中都含有静态方法display()的情况,上转型对象却调用的父类的静态方法display(),而非子类中定义的静态方法display().
由此可见: 子类并没有重写父类的静态方法,而是将父类的静态方法隐藏,隐藏的父类方法可以通过父类类名在子类中被调用.


当子类中重写的方法也是静态的时候,其实质是将父类的静态方法隐藏,而并非是将其重写.(摘自: Java SE 6.0编程指南 P142)

隐藏和重写的区别在于:
隐藏是根据引用的类型来进行调用.
重写是根据对象的类型来进行调用.
(摘自: Java SE 6.0编程指南 P143)


3. 动态方法不能覆盖静态方法
上述程序二,如果去掉子类方法display()的static修饰,则会报如下错误:

---------- 编译Java ----------
C:\Documents and Settings\Administrator\桌面\test\SubClass.java:38: SubClass 中的 display() 无法覆盖 SuperClass 中的 display();被覆盖的方法为 static
public void display()
            ^
1 错误

输出完成 (耗时 1 秒) - 正常终止

说明: 子类中的动态方法display()无法覆盖父类中的静态方法display().


4. 静态方法不能覆盖动态方法
上述程序二,如果去掉父类方法display()的static修饰,则会报如下错误:

---------- 编译Java ----------
C:\Documents and Settings\Administrator\桌面\test\SubClass.java:38: SubClass 中的 display() 无法覆盖 SuperClass 中的 display();覆盖的方法为静态
public static void display()
                   ^
1 错误

输出完成 (耗时 1 秒) - 正常终止

说明: 子类中的静态方法display()无法覆盖父类中的动态方法display().


疑惑:
动态方法不能覆盖静态方法.
这是否意味着加了static修饰的子类动态方法display()(即静态方法)是在对父类的静态方法display()进行覆盖呢?

难道说这里面的覆盖不是重写的意思,而是隐藏的意思?



1、子类不能用 静态方法 重写 父类的非静态方法。 你犯的就是这个错误。与protected关键字无关

2、同理 子类不能用 非静态方法 重写 父类的静态方法

1、2即是说,子类要重写父类的方法,要么都是静态的,要么都是非静态的
分享到:
评论

相关推荐

    《java面向对象程序设计-继承和多态》教案.doc

    示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此类...

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

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

    word源码java-AndroidInterview--QA:Android面试-QA

    word源码java ...子类继承父类后,用相同的静态方法和非静态方法,这时非静态方法覆盖父类中的方法(即方法重写),父类的该静态方法被隐藏(如果对象是父类则调用该隐藏的方法),另外子类可继承父类的静态与

    C#中多态性的实现

    动态多态性:抽象方法、重写方法、隐藏方法 二:函数重载(overlode) ——函数名必须相同 ——函数参数类型不同 ——函数参数个数不同 ——函数参数顺序不同 三:抽象(abstract) ——包含抽象函数的类,类也必须...

    C++编程思想习题

    1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个...

    【05-面向对象(下)】

    •当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在该 名字的局部变量,就使用该变量,如果不存在,则到该方法所在的内部类中查找是否存在该名字的属性,如果...

    ASP.NET开发实战1200例(第Ⅰ卷)第三章

    实例091 直线、图和正方形的归类(重写) 142 实例092 1=1和“1”=“1”的探讨(重载) 144 实例093 强制多态活动——抽象类和抽象方法 的应用 146 实例094 关于成员隐藏(使用New关键字 实现) 148 3.5 面向对象...

    【04-面向对象(上)】

    •方法的重写要遵循“两同两小一大” 指的是:方法名相同,形参列表相同。返回值类型更小或相同,抛出的异常更  小或相同,访问控制权限要更大。 父类实例的super限定 •通过关键字super 来调用父类的...

    《Java和Android开发实战详解》第6到10章源代码-by 南邮-陈杨

    8.1.3 重写和隐藏父类的方法 145 8.1.4 隐藏父类的成员变量 147 8.1.5 使用父类的构造函数 149 8.2 接口 151 8.2.1 接口简介 151 8.2.2 创建与使用接口 152 8.2.3 在类实现多个接口 154 8.3 接口的...

    javaSE代码实例

    8.5.7 静态方法没有重写 141 8.5.8 通过重写扩展父类方法的功能 143 8.5.9 替代性原理 144 8.6 方法的重载 145 8.6.1 方法重载的规则 145 8.6.2 重载方法的匹配 145 8.6.3 重写与重载的区别 149 8.7 ...

    C#语言规范(4.0版本)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    微软C#语言规范,C#语言教程中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#语言规范4.0

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#_语言规范_4.0_中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#语言规范(2.0,3.0,4.0合集)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    JAVA—面向对象

    隐藏机制: 构造函数和一般函数的不同 构造代码块: 作用: 特点: 构造代码块和构造函数的区别: this: Static关键字 用法: 被修饰的成员具备以下特点: 注意 静态代码块: 特点: 实例变量和类变量的区别: 静态...

    net学习笔记及其他代码应用

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    1.1.2 继承:类型关系 1.1.3 多态性 1.1.4 操作概念:OOP程序像什么 1.2 为什么C++会成功 1.2.1 较好的C 1.2.2 采用渐进的学习方式 1.2.3 运行效率 1.2.4 系统更容易表达和理解 1.2.5 “库”使你事半功倍 ...

    C++ 语言 详细教程电子版

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

Global site tag (gtag.js) - Google Analytics