如果Person是一个类(在java中)是什么人的人;做?

时间:2011-08-08 09:52:04

标签: java object

Person是一个以Parent为子类的类。

考虑以下两个陈述:

  1. Person person = new Parent();
  2. Parent parent= (Parent)person;
  3. 第二个语句将person对象引用变量强制转换为parent ...这是否意味着它修改(覆盖类型)person变量或者它是否创建了person变量的新副本{1}}引用变量然后进行类型转换?

    例如:

    double x = 10.5; 
    int y = (int)x ;
    

    此处x中的值不受影响,y将等于10。同样的事情适用于parent person示例,还是不同?

5 个答案:

答案 0 :(得分:1)

这是不同的。 double amd int 是原始类型,而Person和Parent是类。

当您向Parent转换内容时,对象不会更改。 Cast只强迫你告诉编译器“我知道我在做什么。我确定这是Parent类型的对象”。

对你而言,这将导致两个变量(父和人)都指向同一个对象。

答案 1 :(得分:1)

personparent都是引用且不同(类型)。底层对象是相同的。

答案 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时,它会创建新变量,当你将一个类转换为其他类而不创建新变量时,你只告诉编译器这个变量可以像其他类一样对待