铸造物体 - 它们如何工作?

时间:2017-03-23 05:31:17

标签: java casting

我有一个Person类,而Object类只是Java的Object类。我有一个Student类,它也扩展了Person类。有人可以解释为什么在这些不同的场景中我在投射和一些工作时会出现错误吗?

Person p = (Person) new Object(); // error
Person p = (Person) new Student(“Steve”, 21, 12345); // works
Object o = new Person(“Steve”, 21); // works
Person p = (Person) o; // works

3 个答案:

答案 0 :(得分:2)

施放不会神奇地将对象变成其他东西。 它只是告诉编译器尝试以不同的类型访问一段数据。

在第一个示例中,您创建了一个无法转换为Person的Object。铸造不会神奇地改变事物。

在第二个示例中,您将创建一个Student对象。由于Student继承自Person,您也可以将其视为person类型。

第3行:同样,您创建了一个Person对象,但是您将其保存在object类型的变量中。这并没有改变对象的实际内容,这就是为什么向下转向Person的原因。

答案 1 :(得分:0)

Object类是所有java类的Base Class,这就是为什么Object的引用能够保存任何java类的对象。

但是如果任何类扩展了另一个类,那么子类不直接扩展Object类,在这种情况下,多级继承概念是隐式实现的。

在你的情况下

Person课程是超级

Student类是子类

这意味着学生类获取了Person类的属性,在这种情况下,Casting可以作为墙,因为Student通过Person Class扩展了Object类。

答案 2 :(得分:0)

将子(子)类对象转换为父(超)类是可以的,因为子类已经知道并拥有来自父类继承的所有内容(即变量和方法),但不是相反。

示例:

def remove(root, value, parent):
    if root is None:
        return False
    elif value < root.data and root.left is not None:
        return remove(root.left, value, root)
    elif value > root.data and root.right is not None:
        return remove(root.right, value, root)
    else:
        if value == root.data:
            if root.right is not None:
                removeRoot = root.right
                while(removeRoot.left is not None):
                    parRoot = removeRoot
                    removeRoot = removeRoot.left
                root.data = removeRoot.data
                parRoot.left = None
                del removeRoot
            elif root.left is not None:
                parent.left = root.left
                del root
            else:
                if parent.right is not None and parent.right.data == root.data:
                    parent.right = None
                elif parent.left is not None:
                    parent.left = None
                del root