向上类型转换:将子类对象转为父类对象。此处父类对象可以是接口。
把子类对象给父类赋值这个语句的过程: 1.A a :先产生一个A类的引用,他是一个虚的引用,因为还没有赋值,所以a就是个傀儡,因为对象类型为A,a变量就像被分配了一个能访问A类对象的引用。 2.new B():创建的是对象,这个相当于生成一个B类的引用,它可以引用B类中的所有东西 3.a = new B():第三步才是把B类的引用赋给A类,由于B类是A类的子类,所以才可以这么赋值。 这样赋值之后a可以调用A类的所有方法和属性,虽然给他赋的是B类的引用,不过由于前面限定了A类,所以a只能调用B类中覆盖了A类方法的方法。
(1)向上类型转换时会遗失除与父类对象共有的其他方法
调用的是子类的方法
eg:
package practice3;
class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("bird eatting...");
}
public void fly(){
System.out.println("bird flying...");
}
}
public class Test{
public static void main(String[] args) {
Animal b=new Bird(); //向上转型
b.eat();
//! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法
dosleep(new Male());
dosleep(new Female());
}
public static void dosleep(Human h) {
h.sleep();
}
}
package practice3;
public class Human {
public void sleep() {
System.out.println("Human sleep..");
}
}
class Male extends Human {
@Override
public void sleep() {
System.out.println("Male sleep..");
}
}
class Female extends Human {
@Override
public void sleep() {
System.out.println("Female sleep..");
}
}
输出:
bird eatting...
Male sleep..
Female sleep..
调用父类的成员变量:
package practice3;
class A{
public int data=5;
public void print(){
System.out.println(data);
}
}
class B extends A{
public int data=2;
public void print(){
System.out.println(data);
}
}
public class TestAB{
public static void main(String[] args) {
A a=new B();
a.print();
System.out.println(a.data);
}
}
输出:
2
5
(2)向上类型转换的优点
public static void dosleep(Human h) {
h.sleep();
}
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。