向上转型:
多态,表示一种事物的不同特征,不同状态;
子类在继承父类的时候,并且子类对父类的成员方法进行了重写(不包括静态方法),在创建对象的时候,可以将父类的引用指针指向子类对象,格式如下:
父类名 fu = new 子类名();
由此,我们就可以利用***fu.方法名***,对子类重写的方法进行调用;
这个过程中,将子类对象转型称为父类,也称为向上转型;也是父类的引用地址指向了子类对象,故而可以调用子类的方法;若访问变量的话,都是父类中的成员变量(fu.成员变量名),编译看左边,运行看右边;访问静态方法,访问的还是父类的静态方法;
举例说明一下:
public class Test {
public static void main(String[] args) {
Teacher teacher = new EnglishTeacher();//向上转型;
System.out.println(teacher.name);
System.out.println(teacher.age);
teacher.teach();
}
}
public class Teacher {
String name="null";
int age=0;
public void teach(){
System.out.println("teach lessons");
}
}
public class EnglishTeacher extends Teacher{
String name="alice";
int age=20;
@Override
public void teach() {
System.out.println("teach English");
}
}
运行结果如下:
向下转型:
我们都知道,不管是子类还是父类,类中的特有成员方法是不能够被父类调用的,于是产生了向下转型,顾名思义,即是将父类向下转型为子类类型,即可调用子类中的特有方法和成员变量;
先看一个例子:
public class Test {
public static void main(String[] args) {
Person person = new Driver();
System.out.println(person.name);
System.out.println(person.age);
person.walk();
System.out.println("-------------------------------------------------");
Driver driver= (Driver) person;//向下转型;
System.out.println(driver.name+"\n"+driver.age);
driver.walk();
}
}
class Person{
String name="null";
int age=100;
public void walk(){
System.out.println("普通人步行");
}
}
class Driver extends Person{
String name="老王";
int age=52;
@Override
public void walk() {
System.out.println("老司机开车");
}
}
执行结果如下: