Java 对象的下转规则
在Java中,下转是将父类对象转换为子类对象的过程。我们需要显式地进行转换。这与我们在原始类型转换中所做的非常相似。
在本文中,我们将学习有关下转的知识以及在Java中进行下转对象时必须遵循的规则。
Java中的对象下转
之前我们讨论过下转与类型转换有些相似。但是,它们之间也存在一些区别。首先是我们只能对原始数据类型进行类型转换,其次是它是不可逆的操作,即在类型转换中我们直接使用值,如果我们一旦改变了值,就无法恢复。另一方面,在下转过程中,原始对象不会改变,只改变了它的类型。
下转的需求
例如,假设有两个类,一个是超类,另一个是它的子类。在这种情况下,下转就起到了作用,它允许我们从超类访问子类的成员变量和方法。
语法
nameOfSubclass nameOfSubclassObject = (nameOfSubclass) nameOfSuperclassObject;
尽管这个语法看起来很简单,但我们写这个语法时可能会犯错误。此外,我们不能像在下一个示例中要做的那样直接向下转换对象。如果我们这样做,编译器会抛出“ClassCastException”。
示例1
以下示例说明了提供错误的向下转换语法可能的结果。为此,我们将定义两个类,并尝试使用错误的语法向下转换超类的对象。
class Info1 {
// it is the super class
void mesg1() {
System.out.println("Tutorials Point");
}
}
class Info2 extends Info1 {
// inheriting super class
void mesg2() {
System.out.println("Simply Easy Learning");
}
}
public class Down {
public static void main(String[] args) {
Info2 info2 = (Info2) new Info1();
// Wrong syntax of downcasting
// calling both methods using sub class object
info2.mesg1();
info2.mesg2();
}
}
输出
Exception in thread "main" java.lang.ClassCastException: class Info1 cannot be cast to class Info2 (Info1 and Info2 are in unnamed module of loader 'app')
at Down.main(Down.java:13)
示例2
以下示例演示了如何正确执行对象向下转型。为此,我们将创建两个类,然后定义一个引用子类的超类对象。最后,我们使用正确的向下转型语法。
class Info1 {
// it is the super class
void mesg1() {
System.out.println("Tutorials Point");
}
}
class Info2 extends Info1 {
// inheriting super class
void mesg2() {
System.out.println("Simply Easy Learning");
}
}
public class Down {
public static void main(String[] args) {
// object of super class refers to sub class
Info1 info1 = new Info2();
// performing downcasting
Info2 info2 = (Info2) info1;
// calling both methods using object of sub class
info2.mesg1();
info2.mesg2();
}
}
输出
Tutorials Point
Simply Easy Learning
结论
还有一个修改对象的概念叫作Upcasting。在这个过程中,子类的对象被转换为超类对象。它可以隐式地完成。上述两个概念,即向上转型和向下转型,一起被称为对象转型。在本文中,我们通过示例讨论了对象向下转型。