1. 向上造型(Upcasting)是指将一个子类对象赋值给父类引用变量的过程。通过向上造型,可以将一个子类对象视为其父类类型,实现多态性的体现。
向上造型的特点:
- 子类对象可以赋值给父类引用变量,但是父类对象不能赋值给子类引用变量。
- 向上造型是自动进行的,不需要额外的转换操作。
- 通过向上造型,可以调用父类中声明的方法,但无法调用子类中特有的方法。
向上造型的优势:
- 实现多态性:通过向上造型,可以将不同子类的对象视为父类类型,统一对待,实现多态性的效果。
- 灵活性和扩展性:通过向上造型,可以在不改变父类引用的情况下,使用不同的子类对象,使程序具备更大的灵活性和可扩展性。
示例代码:
- class Person {
- private String name;
- public Person(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void printInfo() {
- System.out.println("Person: " + name);
- }
- }
- class Student extends Person {
- private int studentId;
- public Student(String name, int studentId) {
- super(name);
- this.studentId = studentId;
- }
- public int getStudentId() {
- return studentId;
- }
- public void printInfo() {
- System.out.println("Student: " + getName() + ", Student ID: " + studentId);
- }
- }
- class Teacher extends Person {
- private String subject;
- public Teacher(String name, String subject) {
- super(name);
- this.subject = subject;
- }
- public String getSubject() {
- return subject;
- }
- public void printInfo() {
- System.out.println("Teacher: " + getName() + ", Subject: " + subject);
- }
- }
- public class Main {
- public static void main(String[] args) {
- Person person1 = new Student("Alice", 123);
- Person person2 = new Teacher("Bob", "Math");
- person1.printInfo(); // 输出: Student: Alice, Student ID: 123
- person2.printInfo(); // 输出: Teacher: Bob, Subject: Math
- // 向上造型
- Person person3 = new Student("Carol", 456);
- Person person4 = new Teacher("David", "Science");
- person3.printInfo(); // 输出: Student: Carol, Student ID: 456
- person4.printInfo(); // 输出: Teacher: David, Subject: Science
- }
- }
在上述示例中,Person是一个基类,Student和Teacher是其子类。我们可以将Student和Teacher对象向上造型为Person类型,并将它们赋值给Person引用变量person3和person4。通过向上造型,我们可以使用Person引用变量调用Person类中的方法和属性。在调用printInfo()方法时,由于方法被子类重写,实际上会根据对象的实际类型调用相应的子类方法。
这样做的好处是,我们可以使用统一的Person类型处理不同类型的对象,实现了多态性。通过向上造型,我们可以灵活地处理不同类型的子类对象,使代码更具扩展性和可维护性。
向上造型中有个特性“无法调用子类中特有的方法”,如果调用子类行特有的方法呢?这个就需要使用向下造型了。
2. 向下造型(Downcasting)是指将一个已经向上造型(Upcasting)的对象重新转回其原始的子类类型。它允许我们在需要的时候访问和调用子类特有的方法和属性。
在 Java 中,向下造型需要使用强制类型转换操作符(子类类型)来实现,但在进行向下造型之前,需要先确保对象实际上是指定的子类对象。否则,如果尝试对一个不兼容的对象进行向下造型,将会抛出ClassCastException异常。
以下是一个示例,演示了向下造型的使用:
- /**
- * 演示向下转型
- */
- public class Demo02 {
- public static void main(String[] args) {
- Person person1 = new Student("Alice", 123);
- Person person2 = new Teacher("Bob", "Math");
- // 直接使用类型引用调用子类特有的方法会编译错误
- // person1.getStudentId(); // 编译错误
- // person2.getSubject(); // 编译错误
- // 向下转型
- Student student = (Student) person1;
- Teacher teacher = (Teacher) person2;
- System.out.println(student.getStudentId()); // 输出: 123
- System.out.println(teacher.getSubject()); // 输出: Math
- // 向下转型时,如果类型不匹配,会抛出ClassCastException
- // Teacher teacher2 = (Teacher) person1; // 抛出ClassCastException
- }
- }
需要注意的是,在进行向下造型之前,我们需要确保对象实际上是指定的子类对象。否则,如果尝试对一个不兼容的对象进行向下转型,将会导致运行时异常。
向下转型的使用需要谨慎,应确保转型操作的合法性和正确性。如果不确定对象是否适合进行向下转型,可以使用instanceof运算符进行类型检查,以避免可能的异常。