静态方法可以通过二种形式来调用,一种是类名加方法名,另一种是类引用加方法名.
上述程序中通过第二种方式来调用静态方法,其实质是检查引用的类型来调用静态方法(即类名加方法名的方式).
静态成员(方法和属性)属于类而不是属于对象,静态方法,静态属性,动态属性早在编译期就已经确定(弱弱地说,相关地址数据存储在虚拟机的方法区类数据中).
-------------------------------------------------------------------------
1. 静态方法可以被继承.
程序一:
/**
* 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. 静态方法被隐藏不能被重写.
程序二:
/**
* 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()进行覆盖呢?
难道说这里面的覆盖不是重写的意思,而是隐藏的意思?
分享到:
相关推荐
方法重写则是继承机制中一个关键的特性,允许子类对父类的方法进行定制化,以满足特定需求。 **一、Java 继承** 1. **定义与语法**: Java 中的继承使用 `extends` 关键字实现。例如,如果 `Animal` 是一个类,`...
Java中的静态方法重写是一个常见的误解,因为实际上Java并不支持静态方法的重写(Override),而是支持静态方法的隐藏(Hiding)。这篇文章将深入探讨这个问题,帮助开发者理解静态方法调用的机制以及如何正确实现...
2. 子类覆盖的方法不能是静态的,如果父类方法是静态的,子类中只能隐藏该静态方法,不能覆盖。 3. 子类覆盖的方法的访问权限不能比父类中的被覆盖方法更严格。比如,如果父类中的方法是public,那么子类中覆盖的...
静态方法在Java中属于类级别,而非实例级别,这导致了它们在继承链中不能被重写。 静态方法是与类相关的,而不是与类的实例相关。当一个类的静态方法被调用时,编译器会根据调用时的类类型来确定调用哪个方法,而...
在Java中,当子类继承父类时,它可以重写父类中已存在的方法,以实现不同的功能或者优化原有功能。重写允许子类根据自身的需求对父类的行为进行定制。 1. **基本概念**: - 当子类定义了一个与父类中相同名称、...
在Java编程语言中,"静态方法隐藏"是一个不常见的概念,因为静态方法是与类相关的,而不是类的实例。标题“shadow-static-example:静态方法隐藏的简单展示”可能指的是一个特殊的编程技巧或一种理解静态方法行为的...
静态成员在继承中保持不变,而实例成员可以被重写或隐藏。 接口(Interface)是另一种形式的继承,它定义了一组方法签名,但不提供实现。类可以实现一个或多个接口,以确保它们遵循特定的协议。在C#中,静态类不能...
1. **创建HttpModule**:创建一个继承自`System.Web.IHttpModule`的类,实现`Init`和`Dispose`方法。在`Init`方法中,注册事件处理程序,监听HTTP请求。 2. **重写规则**:在HttpModule中定义重写规则,如根据URL...
在C#中,可以通过 **方法隐藏** 和 **方法重写** 来处理继承后的方法行为。 1. **方法隐藏**:使用 `new` 关键字可以隐藏基类中的方法。这意味着,当从派生类的对象调用该方法时,会调用派生类中同名的方法,而不会...
在解答这些问题之前,首先需要了解Java中几个关键的概念,包括继承、方法重写、静态方法与实例方法、抽象类和抽象方法,以及字符串和基本数据类型的连接问题。 1. 继承与方法重写 继承是面向对象编程的一个基本特性...
在软件开发中,继承和接口设计是面向对象编程的重要概念,用于构建灵活且可扩展的代码...这些知识点涵盖了C#中的继承、接口、虚方法、多态、抽象类以及方法重写和隐藏等核心概念,是理解和使用C#进行软件开发的基础。
在Java中,这种行为被称为方法的隐藏,而不是重写。这意味着在子类实例中,如果直接调用该方法,将执行子类的方法,而不是父类的。但通过`super`关键字,仍然可以在子类内部访问到父类的隐藏方法。 **动态多态...
- **static与非静态**:静态方法不能被重写,只能被隐藏。 - **abstract与非抽象**:只有抽象方法才能被重写,非抽象子类必须实现父类的所有抽象方法。 - **@Override注解**:虽然不是必须的,但使用`@Override`...
如果父类的成员变量或者方法具有 private 访问权限,则这些方法和成员变量虽然被分配了内存空间,但对子类也是隐藏的。即使子类有和父类 private 方法同名,同参数列表的方法,满足“两同两小一大”的要求,也不算...
方法修饰符,如`static`,用来定义静态方法,这些方法属于类本身而非类的实例。使用`static`修饰符的类方法可以直接通过类名调用,无需创建类的实例。`final`修饰符用于标记不可变的变量或防止方法被重写。`abstract...
C#中的多态有两种形式:静态多态(方法重载)和动态多态(方法重写)。 - `virtual` 和 `override` 的组合使得在运行时能够根据对象的实际类型调用正确的方法,这就是动态多态。 9. **接口与继承** - 接口(`...
* (如果是重写即子类将父类的实例方法重写类,则调用子类的,如果是隐藏即方法则父类中声明为静态方法,则调用父类本身的但具体方法中的成员是否被子类修改需要进行分析) —> * 下一层次的父类中重复前一个过程
- 不允许继承静态类,因为静态类不能实例化,没有继承的意义。 通过理解和掌握以上C#继承机制的知识点,开发者可以在设计和实现类结构时更灵活、高效地利用代码复用,同时保证代码的可扩展性和维护性。在实际项目...
子类中定义的静态方法与父类同名时,静态方法不会被覆盖,而是被隐藏。可以通过使用父类名来调用隐藏的静态方法。 - 子类覆盖父类方法时,子类方法的访问级别不能低于父类方法的访问级别。 **方法重载(Overload)*...