Person
是一个以Parent
为子类的类。
考虑以下两个陈述:
Person person = new Parent();
Parent parent= (Parent)person;
第二个语句将person
对象引用变量强制转换为parent
...这是否意味着它修改(覆盖类型)person
变量或者它是否创建了person
变量的新副本{1}}引用变量然后进行类型转换?
例如:
double x = 10.5;
int y = (int)x ;
此处x
中的值不受影响,y
将等于10
。同样的事情适用于parent
person
示例,还是不同?
答案 0 :(得分:1)
这是不同的。 double amd int 是原始类型,而Person和Parent是类。
当您向Parent转换内容时,对象不会更改。 Cast只强迫你告诉编译器“我知道我在做什么。我确定这是Parent类型的对象”。
对你而言,这将导致两个变量(父和人)都指向同一个对象。
答案 1 :(得分:1)
person
和parent
都是引用且不同(类型)。底层对象是相同的。
答案 2 :(得分:1)
没有创建新对象。
强制转换(Parent)
只会强制虚拟机将person
解释为Parent
的实例。如果不是,则会抛出ClassCastException。
你可以这样做:
Person person = new Parent();
由于Person是Parent的超类,因此每个Parent实例也是Person实例。
但是从person
开始,你不能使用Parent中定义的方法。
Parent parent = new Parent();
Person person = parent; // Ok, two instances to the the same object.
parent.setNumberOfSons(2); // Ok
person.setNumberOfSons(2); // Compile error, Person does not have that method (even if the instance is a person).
Parent parent2 = (Parent) person;
parent2.setNumberOfSons(2); // Ok
请注意:
Person person = new Person();
Parent parent = (Parent) person;
将抛出ClassCastException(该对象不是Parent的实例)。
另外,如果Person没有扩展String,那么这个
String myString = new String();
Person person = (Person) myString;
将是一个编译错误(当Person可以是Parent时,String不能是Person,因为一个不扩展另一个)。
答案 3 :(得分:0)
嗯,你基本上做的是,你首先创建一个Person类型的变量,你将一个更特殊的类Parent的实例作为一个变量。这类似于做
之类的事情Set<string,object> mySet = new Hashset<>();
在这里,您将已实现类的实例设置为Interface变量。
在第二步中,您将创建第二个变量,您可以将之前创建的实例设置为该变量。由于编译器无视您创建类Parent实例的事实,因此您必须手动键入强制转换Person类型变量的内容以适合父类型变量。
这实际上没有改变,你只是向编译器承诺事情会好起来的。
答案 4 :(得分:0)
示例(可以帮助理解):
class ClassA {
public int i = 10;
}
class ClassB : ClassA {
}
ClassB b = new ClassB();
ClassA a = (ClassA)b;
a.i += 10;
// now b.i = 20
当你将double转换为int时,它会创建新变量,当你将一个类转换为其他类而不创建新变量时,你只告诉编译器这个变量可以像其他类一样对待