编译时类型与运行时类型
在Java编程语言中的许多对象都是存在具有父子类型关系的。因为子类也可以理解成另类的一种父类(例如小明是一个学生类 但是他也可以是一个人类)因此在java中是允许父类引用类型指向子类对象的。那么就会出现两种类型。
编译时类型与运行时类型:
例如 Person iu=new Student(); 这里是声明了一个Person类型的变量iu 指向了Student对象。那么他在编译时就是Person类型 运行时就是Student类型。
编译时类型:声明该变量时使用的类型决定。
运行时类型:实际给该变量赋值时的对象决定。
当编译时类型与运行时类型不一致时就会出现所谓的多态
因此java允许把一个子类对象直接赋值给一个父类引用变量(Person iu=new Student()😉,无须任何类型转换,这就是向上转型,由系统自动完成。
当在编译阶段引用变量只能调动编译时类型的方法,因此当Person iu=new Student();一个父类person引用变量想要调用子类Student中没有被重写的子类特有方法时就需要强制转换((Studenr)iu).某方法,就叫向下转型。
代码实例
//person类
public class Person {
String name="person";
}
//student类
public class Student extends Person{
String name="student";
}
//测试类
public static void main(String[] args) {
Person person=new Student();
System.out.println(person.name);//输出为person
System.out.println(((Student)person).name);//输出为student
}
}