对以下代码的运行结果有点疑问,请求帮忙
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();
}
}
程序的运行结果为:
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 的非静态方法,为什么呢?
解决方案 »
- java递归应用??
- 关于打JAR包时的问题
- JSF UploadedFile 中 _file.getName()的到的是什么编码来的,怎么换成中文...?谢谢..
- new Class[]{int.class}是什么意思?
- applet问题!
- 谁能提供一些和华为cc08交换机做接口的资料吗?谢谢
- javah Hello 为什么出错:Class Hello could not be found
- 一个不能正确执行的代码!大家进来看看
- 今天开始学java...做个标记并散分...
- Tomcat问题?
- java 斯坦福大学的一道java编程题(self-avoiding random walk)
- 单元格颜色设置无效
例如:
Super s=
Sub sb=...
如果你s.静态方法名,调用的是Super的静态方法,哪怕是你申明为:s=new Sub(),任然调用Super的静态方法
sb.静态方法名,调用的了Sub的静态方法。
就像private 子类里 看似覆写 实则是新加
基类中的静态方法不能被子类重写,非静态方法可以被子类重写!!!
当你 Parent p2 = new Child(); 的时候创建了一个Persent类型的对象引用P2,并不是Child对象
当用P2调用非静态方法nonStaticMethod() 的时候首先它会检查是否子类对该方法重写了,如果没有重写就返回基类的,如果重写了就返回子类的!!!
当调用静态方法的时候,由于静态方法不能被重写,所以是哪个类型的对象调用的就返回该类型的方法!!!
LZ可以试下这样:
class Parent{
public void nonStaticMethods() { {//我在基类的这个方法后面加了一个s,这样子类的非静态方法就没有重写了,因为两个不是两个相同的方法,你运行下,看结果是不是变了,当你在用P2调用这个方法的时候就是输出这个方法的输出语句,当基类和子类的方法名相同返回类型相同访问权限也相同的时候,子类就重写了基类的非静态方法,就返回子类的输出语句
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();
}
}
由于p2运行时期的类型是Child,故真正调用的Child中定义的nonStaticMethod();.
Gosling的书是我认为讲的最权威和最清楚的书,建议可能的话,多仔细看看.以上仅供你参考
严重批判!
静态方法在多态实现时,只能被隐藏,而不是被覆盖。即取决于你在定义变量时的定义方式。比如:class Parent{
public static void print(){
System.out.println("Parent!");
}
}class Child extends Parent{
public static void print(){
System.out.println("Child!");
}
}如果你定义的时候,使用 SuperClass cls = ...,那么调用静态方式时调用的就是SuperClass中的静态方法,其他则是子类中重写的方法;
如果 ChildClass cls = ...,那么调用的就是子类中的方法。如果你定义了ChildClass cls = ...,还想调用SuperClass中的静态方法,就((SuperClass)cls)转换