向上转型:把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。
向上转型也就是多态的使用。
public class UpcastingTest {
public static void main(String[] args) {
Person person = new Person();
Student student =new Student();
Person p = new Student();//把一个子类类型安全地变为父类类型的赋值
}
}
class Person{
String name ="张三";
public void eat(){
System.out.println("人吃饭");
}
}
class Student extends Person{
int id =1001;
public void study(){
System.out.println("学生学习");
}
}向下转型:和向上转型相反,如果把一个父类类型强制转型为子类类型,就是向下转型(downcasting)
public class UpcastingTest {
public static void main(String[] args) {
Person person = new Student();//把一个子类类型安全地变为父类类型的赋值
= "李四"; //可以调用父类中声明的属性
person.eat(); //可以调用父类中声明的方法
//p.study();无法调用子类特有的属性和方法
//有了多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于声明的是父类类型,
// 导致编译时,只能调用父类声明的方法和属性,子类特有的属性和方法无法调用
//如何才能调用子类中特有的属性和方法?
//使用强制类型转换
Student student = (Student) person;//当前的p指向Student()的实例,所以强转为Student类型可以成功
student.study();
student.id = 1002;//现在就可以调用子类所特有的属性和方法了
//继续看下面的代码
Person man = new Person();
Student s1 = (Student) man;//执行会报错,报错原因是ClassCastException类型转换异常
//因为man指向的实例是Person()、将man在强制转换为(Student)就失败了,必须是同类型的才能转换成功!
}
}
class Person{
String name ="张三";
public void eat(){
System.out.println("人吃饭");
}
}
class Student extends Person{
int id =1001;
public void study(){
System.out.println("学生学习");
}
}
















