我是Java语言的新手,我正在学习继承。我有个问题要问。
我有两个类:Person
和Student
,如下所示:
public class Person {
private int id;
private String fullName;
private String address;
// getter, setter, constructor, ... will go here
}
public class Student extends Person {
private String grade;
// getter, setter, constructor, ... will go here
}
public class Demo {
public static void main(String[] args){
Person obj = new Student();
obj.setFullName("John"); // I can do this easily
obj.setGrade("6A"); //------> Error
}
}
我只想问一下,我怎样才能为上面的对象obj
设置分数,同时仍然保留声明Person obj = new Student();
希望大家能帮助我!谢谢!
发布于 2019-08-08 03:17:07
您遇到了早期绑定和后期绑定(也分别称为静态绑定和动态绑定)的概念。
简而言之,除非将obj对象(这是一个Person)强制转换为Student对象,否则您不可能完成要做的事情。正如Thomas所说的,这不是一个非常好的想法,但它在这里可以工作,因为您是在一个相当小的程序中自己制作所有对象(但不要养成这样做的习惯)。
更具体地说,当编译器第一次遇到obj对象(早期绑定)时,obj对象被视为Person,因此在obj上调用的所有方法都必须在Person类(或Person的超类)中定义,但是,obj仍然可以被实例化为Person的任何子类。
这种行为向程序员保证,无论其他人在子类中进行的实现或更改,这些方法都将仍然存在。
关于早期绑定和延迟绑定的更多资源:
https://www.techiedelight.com/difference-between-early-late-binding-java/
https://www.geeksforgeeks.org/static-vs-dynamic-binding-in-java/
https://stackoverflow.com/questions/57397530
复制相似问题