📜  Java中的向上转换与向下转换

📅  最后修改于: 2022-05-13 01:54:47.429000             🧑  作者: Mango

Java中的向上转换与向下转换

类型转换是最重要的概念之一,它基本上处理隐式或显式将一种数据类型转换为另一种数据类型。在本文中,讨论了对象类型转换的概念。
就像数据类型一样,对象也可以进行类型转换。但是,在对象中,只有两种对象,即父对象和子对象。因此,对象的类型转换基本上意味着一种类型的对象(即)子对象或父对象。有两种类型的类型转换。他们是:

  1. 向上转型:向上转型是将子对象类型转换为父对象。向上转型可以隐式完成。 Upcasting 使我们可以灵活地访问父类成员,但不可能使用此功能访问所有子类成员。我们可以访问子类的一些指定成员,而不是所有成员。例如,我们可以访问被覆盖的方法。
  2. 向下转换类似地,向下转换意味着将父对象类型转换为子对象。向下转换不能是隐式的。

下图说明了向上转换和向下转换的概念:

上转型与下转型

示例:假设有一个父类。父母的孩子可以有很多。让我们考虑其中一个孩子。子继承父的属性。因此,孩子和父母之间存在“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

上述程序的示意图:

上转型与下转型1

从上面的例子我们可以观察到以下几点:

  1. 向上转换的语法:
Parent p = new Child();
  1. 向上转换将在内部完成,由于向上转换,对象只允许访问父类成员和子类指定成员(重写方法等),但不能访问所有成员。
// This variable is not 
// accessible
p.id = 1; 
  1. 向下转换的语法:
Child c = (Child)p;
  1. 向下转换必须在外部完成,并且由于向下转换,子对象可以获得父对象的属性。
c.name = p.name;
i.e., c.name = "GeeksforGeeks"