一、如何得到上转型对象:
例如:
public class A {
public String a = "A类";// 父类A定义的成员变量a
public void teach() {
System.out.println("A类的方法");
}// 父类A定义的teach方法
}
public class B extends A {
public int b = 10;// 子类B新定义的成员变量b
public String a = "B类";// 子类B重新定义成员变量a,即从父类A继承来的a被隐藏
public void eat() {
System.out.println("B类新增的方法");
}// 子类新增的方法
}
public class Test{
public static void main(String[] args){
A n=new B();//a为上转型对象
System.out.println(n.a);//调用被子类B隐藏的变量a
n.teach();//调用继承的方法
}
}
上述例子中,输出为:
A类
A类的方法
上转型对象:调用从父类继承的方法和成员变量或者子类重写的方法和被隐藏的成员变量(子类重新定义一个一模一样的成员变量),上转型对象不能调用子类新增的
方法和属性;
二、强制转换:
格式:子类名 对象名=(子类名)父类对象名
注意:
强制转换不一定成功,只有在父类的对象本身是由子类的对象自动转型过来的,则强制转换就会成功。
例如:
package com.test.exercise_3;
public class Student {
}
package com.test.exercise_3;
public class UnStudent extends Student {
}
package com.test.exercise_3;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Student stu = new Student();// 直接创建父类对象
UnStudent us = (UnStudent) stu;// 强制转换
}
}
会报错:
Exception in thread "main" java.lang.ClassCastException: com.test.exercise_3.Student cannot be cast to com.test.exercise_3.UnStudent
at com.test.exercise_3.Test.main(Test.java:10)
强制转换失败
若将Test类改为:
package com.test.exercise_3;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Student stu = new UnStudent();// 自动转型
UnStudent us = (UnStudent) stu;// 强制转换
}
}
则没有报错