Java 目标对象在施法后接受什么职业?

Java 目标对象在施法后接受什么职业?,java,inheritance,interface,casting,scjp,Java,Inheritance,Interface,Casting,Scjp,好的,没问题。我正在为SCJP学习,有三个关于对象引用投射错误的问题,似乎都指向了相同的误解。只是想确认正确的洞察力应该是什么。好的,以下是问题: 1. 1.第四类{ 2.公共静态void main(字符串[]args){ 3.c车=新雷克萨斯(); 4.系统输出打印(c.加速比(30)+”); 5.雷克萨斯l=新雷克萨斯(); 6.系统输出打印(l.加速(30,40,50)); 7. } 8. } 9班车{ 10.私人int i=0; 11.整数加速比(整数x){ 12.返回i; 1

好的,没问题。我正在为SCJP学习,有三个关于对象引用投射错误的问题,似乎都指向了相同的误解。只是想确认正确的洞察力应该是什么。好的,以下是问题:

1. 1.第四类{ 2.公共静态void main(字符串[]args){ 3.c车=新雷克萨斯(); 4.系统输出打印(c.加速比(30)+”); 5.雷克萨斯l=新雷克萨斯(); 6.系统输出打印(l.加速(30,40,50)); 7. } 8. } 9班车{ 10.私人int i=0; 11.整数加速比(整数x){ 12.返回i; 13. } 14. } 15雷克萨斯级轿车{ 16.私人int j=1; 17.私人int k=2; 18.整数加速比(整数y){ 19.返回j; 20. } 21.整数加速比(整数…z){ 22.返回k; 23. } 24. } 我认为在3号线之后,c将是一辆汽车,而不是雷克萨斯,因此将调用Car.speedUp方法,而不是Lexus.speedUp方法。结果是后者被称为

2. 1.班级学生问题{ 2.私立int studentId=0; 3.无效设置studentid(int-sid){ 4.学生id=sid; 5.System.out.println(“学生ID已设置为”+sid); 6. } 7.公共静态void main(字符串参数[]){ 8.int i=420; 9.对象ob1; 10.StudentProb st1=新学生prob(); 11.ob1=st1; 12.st1.setStudentID(i); 13. } 14. } 同样的问题。我以为第11行会让st1成为一个对象,而不再是一个学生问题。编译器如何仍然知道在哪里可以找到setStudentID

3. 1.讲师霍尔lh=新讲师霍尔(); 2.a1礼堂; 3.设施f1; 4. 5.f1=左侧; 6.a1=f1; 设施是一个接口。课堂实施设施,礼堂和讲堂是课堂的子类。同一个问题:我想在5号线之后,f1和lh都会被淘汰。但f1仍然是一个设施。那么铸造到底是做什么的呢

谢谢大家


PS:代码格式对我来说不太合适。请随意编辑。

对象始终保持不变。如果将其分配给其他类型的其他变量,则在不将其强制转换回原始类型的情况下,无法访问特殊成员


只能访问所使用变量类型的成员和方法。但是该变量引用的对象可以具有更特殊的类型。对象存储自己的类型,因此运行时能够识别其真实类型。

对象始终保持不变。如果将其分配给其他类型的其他变量,则在不将其强制转换回原始类型的情况下,无法访问特殊成员


只能访问所使用变量类型的成员和方法。但是该变量引用的对象可以具有更特殊的类型。对象存储自己的类型,因此运行时能够识别其真实类型。

对象始终是特定类的实例,您可以使用任何超类引用实例,但实例不会更改。我认为第二个片段最好地说明了这一点,您无法编写
ob1.setStudentID(I)
因为ob1是一个
对象
变量,即使实际的类是
StudentProb


在您的第3个代码段中,第5行无效,因为Facilities是礼堂的超类,因此您可以将礼堂实例分配给Facilities变量,但不能反过来分配。

对象始终是特定类的实例,您可以使用任何超类引用实例,但实例不会更改。我认为第二个片段最好地说明了这一点,您无法编写
ob1.setStudentID(I)
因为ob1是一个
对象
变量,即使实际的类是
StudentProb


在您的第3个代码段中,第5行无效,因为Facilities是礼堂的超类,因此您可以将礼堂实例分配给Facilities变量,但不能反过来分配。

在运行时,每个对象都知道自己的类是什么,也就是说,它实际创建为的类。它可以指定给该类或任何超类的变量。当您执行一个函数时,您将获得该函数的“版本”,该函数用于创建对象的类,而不是用于保存对象引用的变量声明为的类

也就是说,以你的汽车/雷克萨斯为例。如果你写“Lexus mycar=new Lexus();mycar.speedUp();”,执行的是Lexus.speedUp,而不是Car.speedUp。也许这是显而易见的。但是,即使您编写“Car mycar=new Lexus();mycar.speedUp();”执行的仍然是Lexus.speedUp,因为这是实际对象的类。您可以随意将对象重新分配给不同类的不同变量,对象仍然知道其“真实”类

基本上,只需将其视为每个对象都有一个隐藏变量,该变量保存自己的类类型,这就是它用来查找要执行的函数的方法

在编译时,编译器不知道任何给定对象的类。就像你写的:

void speed1(Car somecar)
{
  somecar.speedUp(1);
}
Car car1=new Lexus();
Car car2=new Chrysler(); // assuming you defined this, of course
car1.speedUp(1);  // executes Lexus.speedUp
car2.speedUp(2);  // executes Chrysler.speedUp
编译器不知道这里的车是雷克萨斯还是本田什么的。它只知道它是一辆汽车,因为它不知道在哪里或者如何调用这个函数。直到运行时才知道汽车的实际类型

这意味着,如果你试图写:

void speed1(Object somecar)
{
    somecar.speedUp(1);
}
编译器将在这方面给出一个错误。它无法知道物体是一辆汽车,所以它不知道加速是一个有效的函数

即使你写了:

Object mycar=new Lexus();
mycar.speedUp(1);
你会得到一个错误。作为阅读代码的人,您可以很容易地看到mycar必须是一辆雷克萨斯汽车,因此是一辆汽车,但编译器只看到mycar被声明为一个对象,而对象没有加速功能。(我想,一个足够聪明的编译器可以在这个简单的例子中发现mycar一定是雷克萨斯,但编译器不能在
void speed1(Object somecar)
{
    somecar.speedUp(1);
}
Object mycar=new Lexus();
mycar.speedUp(1);
Car car1=new Lexus();
Car car2=new Chrysler(); // assuming you defined this, of course
car1.speedUp(1);  // executes Lexus.speedUp
car2.speedUp(2);  // executes Chrysler.speedUp
String s=new Object();