Java中的向上转换与向下转换
类型转换是最重要的概念之一,它基本上处理隐式或显式将一种数据类型转换为另一种数据类型。在本文中,讨论了对象类型转换的概念。
就像数据类型一样,对象也可以进行类型转换。但是,在对象中,只有两种对象,即父对象和子对象。因此,对象的类型转换基本上意味着一种类型的对象(即)子对象或父对象。有两种类型的类型转换。他们是:
- 向上转型:向上转型是将子对象类型转换为父对象。向上转型可以隐式完成。 Upcasting 使我们可以灵活地访问父类成员,但不可能使用此功能访问所有子类成员。我们可以访问子类的一些指定成员,而不是所有成员。例如,我们可以访问被覆盖的方法。
- 向下转换:类似地,向下转换意味着将父对象类型转换为子对象。向下转换不能是隐式的。
下图说明了向上转换和向下转换的概念:
示例:假设有一个父类。父母的孩子可以有很多。让我们考虑其中一个孩子。子继承父的属性。因此,孩子和父母之间存在“is-a”关系。因此,孩子可以隐式地向上转换给父母。但是,父母可能会或可能不会继承孩子的属性。但是,我们可以强制将 parent 强制转换为 child,这称为downcasting 。在我们明确定义这种类型的转换后,编译器会在后台检查这种类型的转换是否可行。如果不可能,编译器会抛出 ClassCastException。
让我们了解以下代码以了解区别:
Java
// Java program to demonstrate
// Upcasting Vs Downcasting
// Parent class
class Parent {
String name;
// A method which prints the
// signature of the parent class
void method()
{
System.out.println("Method from Parent");
}
}
// Child class
class Child extends Parent {
int id;
// Overriding the parent method
// to print the signature of the
// child class
@Override void method()
{
System.out.println("Method from Child");
}
}
// Demo class to see the difference
// between upcasting and downcasting
public class GFG {
// Driver code
public static void main(String[] args)
{
// Upcasting
Parent p = new Child();
p.name = "GeeksforGeeks";
//Printing the parentclass name
System.out.println(p.name);
//parent class method is overriden method hence this will be executed
p.method();
// Trying to Downcasting Implicitly
// Child c = new Parent(); - > compile time error
// Downcasting Explicitly
Child c = (Child)p;
c.id = 1;
System.out.println(c.name);
System.out.println(c.id);
c.method();
}
}
输出
GeeksforGeeks
Method from Child
GeeksforGeeks
1
Method from Child
上述程序的示意图:
从上面的例子我们可以观察到以下几点:
- 向上转换的语法:
Parent p = new Child();
- 向上转换将在内部完成,由于向上转换,对象只允许访问父类成员和子类指定成员(重写方法等),但不能访问所有成员。
// This variable is not
// accessible
p.id = 1;
- 向下转换的语法:
Child c = (Child)p;
- 向下转换必须在外部完成,并且由于向下转换,子对象可以获得父对象的属性。
c.name = p.name;
i.e., c.name = "GeeksforGeeks"