继承中静态方法不能被重写

本文链接:https://blog.csdn.net/gao_zhennan/article/details/72892946

解释的很清楚

答案很明确:java的静态方法不能被重写。
静态成员(方法或属性)是类的成员存放在栈中,类可以直接调用(是属于类的静态成员,当然对象也可以调用,只是说你可以使用而已);实例成员是对象的成员,存放在堆中,只能被对象调用。
重写的目的在于根据创造对象的所属类型不同而表现出多态。因为静态方法无需创建对象即可使用。没有对象,重写所需要的“对象所属类型” 这一要素不存在,因此无法被重写。

千言万语,不如代码:

class A{
    public static show(){
        System.out.println(" Static Method of A");
    }
}
class B extends A{
    public static show(){
        System.out.println("Static Method of B");

    }
}

结果,很明显了。如果是重写的话,x.show的结果应该是Static Method of B,从运行结果来看show的结果是和对象的应用及所属类有关。所以说静态成员是属于类的。

那么,怎么描述B中的show和A中的show的关系呢?不是重写,其实也不是重载(验证方法参照上面的代码)
其实他们的关系可以成为:重定义!即重新定义类中的成员。
举个例子:
1子类重新定义从超类获得的属性

class A { public int x=5;}
class B extends A{ public boolean x=true;}
A a=new B(); B b=new B();

由于B中重新定义了名为x的属性,从A中继承而来的X就被屏蔽了。但依然存在,可以通过super.x来获得其值
2,子类定义的方法与超类的私有方法或者静态方法同名
对超类的私有方法。由于无法派生给子类,因此子类在定义与该类方法同名的方法时不存在任何前提限制。另外,静态方法不能重写但能重定义!

原文地址:https://www.cnblogs.com/gxlaqj/p/11420726.html

时间: 2024-10-11 13:32:11

继承中静态方法不能被重写的相关文章

Java中静态方法能否被重写

??在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(Override).方法重写又称方法覆盖. public class Test { public static void main(String[] args) { /** * 结论: * 静态方法可以被继承,但是不能被覆盖,即不能重写. * */ Son.staticMethod(); // 运行结果:Father staticMethod

C#继承中的override(重写)与new(覆盖)用法

刚接触C#编程,我也是被override与new搞得晕头转向.于是花了点时间翻资料,看博客,终于算小有领悟,把学习笔记记录于此. 首先声明一个父类Animal类,与继承Animal的两个子类Dog类与Cat类.父类Animal中有一个Say方法,而子类Dog与Cat分别override(重写)与new(覆盖)了Say方法. 让我们通过实例来看一下这两者有什么相同与不同之处. 1 public class Animal 2 { 3 public virtual void Say() 4 { 5 C

类继承中的 隐藏和重写的 区别

我看先看一个例子: public class A{    public int a = 10;    public virtual void Fun1()    {        Console.WriteLine("1");  -------A1    } public virtual void Fun3()    {        Console.WriteLine(this.a); -------A2 }    public void Fun2()    {        Fun

js---17继承中方法属性的重写

function F(){}; var f = new F(); f.name = "cf"; f.hasOwnProperty("name");//true F.prototype.age = 22; f.hasOwnProperty("age");//false,age是原型对象的属性,name是F对象的属性,不是同一个.hasOwnProperty是对象的方法 F.prototype.isPrototypeOf(f);//true //多态

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

java中父类的静态方法不能被重写

Java中父类的静态方法确实不能被重写的,但是有的人可能去做实验发现在子类中去重写父类static方法时,并没什么问题.这里我来具体解释下. public class Parent { public static void add(){   System.out.println("=========Parent");}} public class Children extends Parent { public static void add(){   System.out.print

Java多态机制和继承中重写重载

关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上

在继承中重写方法时抛出异常的问题

要清楚的知道子类重写父类的方法时,当父类抛出异常时,子类抛出的异常需要怎么写,首先必须了解异常的类型. Exception 这种异常分两大类运行时异常和非运行时异常(编译异常). 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常).IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理.这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类

day4(继承、修饰符、方法的重写、super关键词、继承中的构造方法、object类、对象转型)

1.类的继承(extends)通过继承,子类自动拥有父类的所有成员(成员变量和成员发方法)一个子类只能有一个父类,一个父类可以派生多个子类 2.访问修饰符(private 默认 protected public )对于class的权限修饰只可以用public和defaultdefault只能被同一个包内部的类访问 3.方法的重写(override)在子类中可以根据需要对从父类中继承来的方法进行重写重写方法必须和被重写方法具有相同方法名称.参数列表和返回类型重写方法不能使用比被重写方法更严格的访问