Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于“调查结果”的问题;静态方法没有后期绑定”;[爪哇]_Java_Oop_Methods_Static_Polymorphism - Fatal编程技术网

Java 关于“调查结果”的问题;静态方法没有后期绑定”;[爪哇]

Java 关于“调查结果”的问题;静态方法没有后期绑定”;[爪哇],java,oop,methods,static,polymorphism,Java,Oop,Methods,Static,Polymorphism,给定父类和子类的代码: class Parent{ public static void classMethod(){ System.out.println("ClassMethod in Parent"); } public void hello(){ System.out.println("Hello from parent, call classMethod"); classMethod()

给定父类和子类的代码:

class Parent{

   public static void classMethod(){
      System.out.println("ClassMethod in Parent"); 
   }

   public void hello(){
      System.out.println("Hello from parent, call classMethod");
      classMethod();
   }
}
如果我在主方法中有此项:

public static void main(String[] arg) {
   Parent D = new Child(); 
   D.hello();
}
为什么会有这样的结果?->

Hello来自父级,调用classMethod
父类中的类方法
因此,父类的子对象调用实例方法,实例方法调用静态方法。
如果hello()也是静态的,我会理解为什么它会从父类调用静态方法,因为对象类型将在编译时定义,并且是父类。但是,因为hello()是一个实例方法,所以必须在运行时解析它,并且在运行时,对象的类型不是实际的类型,也就是子类型吗?因此,在这种情况下,它不会从子对象调用静态方法吗,因为该对象在运行时是子类型的?

注意:这个答案假设
子类
扩展父类
。否则,main方法中的代码只会抛出一个错误

这是上转换和多态性的一个示例。由于它属于
父类
,因此其访问权限仅限于
父类
类。当您调用
hello()
方法时,它将在
父类中被调用。然后,这个方法调用
classMethod()
但是,因为
hello()
是父类中的一个方法,所以它也在
parent
类中调用它,这就是为什么会得到这样的结果。它是静态的这一事实没有什么区别:静态方法总是可以被实例方法调用,但不总是相反

我应该指出的一点是,由于行
Parent D=new Child()
,对象
D
实际上无权访问
Child
中的任何静态方法,即使它是该类型。如果希望
D
能够访问
Parent
Child
中的方法,可以使用
Child D=new Child()


带有
Parent D=new Child(),如果要调用某个方法,则该方法必须在父类中,并且将在父类中运行该方法-除非子类中存在同名的重写实例方法,在这种情况下,它将改为运行此方法。还应注意,重写的方法不能是静态的。当你说访问仅限于父类时,你的意思是完全的吗?因为在我的课堂讲稿中,它说如果调用D.instanceMethod(),即使D被声明为父类,也将是子类中被调用的instanceMethod(),因为实例方法在运行时被解析,在运行时它将是对象的实际类型(子类而不是父类).@HelloWorld对这种情况有一个更简洁的解释:如果调用方法,它必须在父类中,并且将在父类中运行该方法-除非子类中存在同名的重写实例方法,在这种情况下,它将运行该方法。我正在将其编辑到我的回答中,所以,每当一个对象调用一个静态方法时,它总是来自该对象编译时类型的类的静态方法?
public static void main(String[] arg) {
   Parent D = new Child(); 
   D.hello();
}