2 zyf4005 zyf4005 于 2016.04.19 10:48 提问

java中子类的静态方法能否覆盖父类的静态方法?请大神们帮忙分析下!

第一题:
class Parent
{

public void nonStaticMethod()
{

System.out.println("Parent's Non-Static Method is Called");

}

public static void staticMethod()

   {     
       System.out.println("parent's static method is called");     
   }    

}

class Child extends Parent
{

public void nonStaticMethod()
{

System.out.println("child's non-static method is called");

}

public static void staticMethod() 
    {    
           System.out.println("child's static method is called");     
    }      

}

public class Test
{

public static void main(String args[])

{

Parent p1 = new Parent();

Parent p2 = new Child();

Child c = new Child();

System.out.print("Parent.static: ");

Parent.staticMethod();

System.out.print("p1.static: ");

p1.staticMethod();

System.out.print("p2.static: ");

p2.staticMethod();

System.out.print("p1.nonStatic: ");

p1.nonStaticMethod();

System.out.print("p2.nonStatic: ");

p2.nonStaticMethod();

System.out.print("Child.static: ");

Child.staticMethod();

System.out.print("c.static: ");

c.staticMethod();

System.out.print("c.nonStatic: ");

c.nonStaticMethod();

}

}

问题1.
//Parent.static:parent's static method is called;
//p1.static:parent's static method is called;
//p2.static:parent's static method is called 结果为啥不是p2.static:child's static method is called;
//p1.nonStatic:Parent's Non-Static Method is Called;
//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;

第二题:

class ExtendDemo2
{
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
}
}

class Fu
{
static void show()
{
System.out.println("123");
}
}

class Zi extends Fu
{
void show()
{
System.out.println("234");
}
}

运行结果为:
D:\延飞>javac ExtendDemo2.java
ExtendDemo2.java:21: 错误: Zi中的show()无法覆盖Fu中的show()
static void show()
^
覆盖的方法为 static
1 个错误

问题2.为啥会有以上错误提示?
问题3.假如我把子类的show()改为void show(); 父类改为static void show();
结果为啥还是:D:\延飞>javac ExtendDemo2.java
ExtendDemo2.java:20: 错误: Zi中的show()无法覆盖Fu中的show()
void show()
^
被覆盖的方法为static
1 个错误

2个回答

w172087242
w172087242   Ds   Rxr 2016.04.19 11:47
已采纳

静态方法是类方法,表示只跟类的引用有关系Parent p2 = new Child()中,这个对象是父类引用,所以会调用父类的静态方法。

一定要记住,静态方法跟对象是毫无关系的,因为静态方法内部能使用的变量也是静态的,静态的所有都是记录类的状态。

希望能帮到你。

zyf4005
zyf4005 谢谢!
大约 2 年之前 回复
hnsywangxin
hnsywangxin   2016.04.19 10:56

静态方法不是属于某个对象的, 是所有对象共享的,父类和子类中不能有这样的方法同名的,一样参数的重写方法

zyf4005
zyf4005 谢谢
大约 2 年之前 回复
zyf4005
zyf4005 //p2.static:parent's static method is called 结果为啥不是p2.static:child's static method is called; 对于这个问题,父类和子类中的静态方法虽然同名,但是功能内容不同,这两个静态方法在内存中是占用同一个内存吗?还是说因为上一句:p1.static:parent's static method is called;这个静态方法已经先被父类加载调用,然后当子类再去创建对象时,子类加载,然后子类中这个静态方法本应也同时加载但是内存中已经有一个这样的静态方法,故子类的静态方法加载不进去,可以这样理解吗?
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
子类能否重写父类的静态方法
今天突然讨论到了子类继承父类的静态方法问题,有人坚持说能写,有人说不能重写,那到底能不能冲写呢?这个问题很简单,测试一下就完了。      先是父类代码: public class Fu { public static void show() { System.out.println("父类的静态方法"); } public void method() { System.out.
JAVA中子类是否可以可以继承、重写父类的静态方法--总结
JAVA中子类是否可以可以继承、重写父类的静态方法–总结今天刷题的时候看到一个问题:JAVA中子类是否可以可以继承父类的静态方法,自己实验了一下,也找了找别人的看法,总结一下吧: 子类可以继承父类的静态方法,意思是可以调用,但前提是父类此方法对子类可见 最重要的一点,一个类中的static修饰的变量或者方法,都默认的会加上final关键字,大家都知道加上final关键字是肯定不能重写的,所以静态方法
关于父类静态方法能不能被子类重写详细
这里首先声明:不能,不能,不能! 这里看了别人的博客,为了方便就直接拷了他的测试代码,并加以修改说明。 首先我们讲一下重写: 子类继承父类后可直接调用父类的方法而不用去自己定义,如父类A有add方法,则子类B没有add方法也可以实例化B b=new B();调用方法b.add().但是子类想要自己重写add方法实现新的功能的话就可以在自己的类中定义add(),这样就算是重写了父类的方法,关于
从JVM角度看为什么子类不能重写父类静态方法
我们要解释的是什么问题呢?public class A extends B{ public static void f() { System.out.println("com.sdkd.A.f()"); } public static void main(String[] args) { A.f(); } }class B { p
父类的静态方法能否被子类重写
父类的静态方法不能被子类重写 代码 Anim public class Anim { public static void test() { System.out.println("Anim test static method!"); } } Dog public class Dog extends Anim { public static void test
静态方法和非静态方法在父类和子类之间的区别
主要通过程序来演示父类与子类分别调用静态方法和非静态方法时的区别。
Java实例方法被覆盖,静态方法被隐藏
封装、继承、多态是面向对象编程中三个比较重要的概念,理解这3个概念对领会JAVA语言至关重要,而搞懂方法的覆盖又是理解继承的关键部分,这里主要看一下静态方法的覆盖。 首先看一段代码:
Java中子类是否可以继承父类的static变量和方法而呈现多态特性
静态方法通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static的方法有以下几条限制: 它们仅能调用其他的static 方法。 它们只能访问static数据。 它们不能以任何方式引用this 或super。 无论是static修饰的变量,还是static修饰的方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个
Java学习笔记(四)修饰符及访问权限
修饰符static: 把对象相关的变成类相关的,它可以修饰属性、方法、代码块和内部类 static修饰属性(类变量): 那么这个属性就可以用" 类名.属性名 "来访问,也就是使这个属性成为本类的类变量,为本类对象所共享。 类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件读入JVM(java虚拟机),这个过程称为类的加载。JVM会通过类路径(
子类继承父类(重写父类的静态方法,子类方法必须也是静态的)
/*static修饰的方法和变量是属于类的,不属于类实例的*/ class test{  public static void main(String args[]){   Father f = new Father();   Father c = new Child();   System.out.println(f.getName());//Father   System.out.