向上转型向下转型


向上转型

语法:父类  父类引用  = 子类对象

1.父类引用不能调用子类特有的方法,但是如果是重写方法,在向下转型后是可以的

public class Test {
    public static void main(String[] args) {
      A a = new B();//当给引用赋值时,是受编译类型的影响
        a.a();//此时要想知道调用的是哪个类中的a方法,则要看父类引用的运行类型,这里运行类型是B,所以调用B的a方法
    }
}
class A {
    int age;
    int num;
    public void a() {
        System.out.println("aaa");
    }
}

class B extends A {
    String name;
    public void a() {
        System.out.println("bbb");
    }
}

同样,父类引用不能调用子类特有的属性,但如果想访问子类和父类的重名属性,则需要用子类的方法

public class Test {
    public static void main(String[] args) {
      A a = new B();
        a.a();//运行结果是1,这条语句调用的a方法也证明了运行类型确实是B,因为这里a方法的age是B类的age
        System.out.println(a.age);//此处运行结果是0
    }
}
class A {
    int age;
    int num;
    public void a() {
        System.out.println("aaa");
    }
}

class B extends A {
    int age = 1;
    String name;
    public void a() {
        System.out.println(age);
    }
}

向下转型

语法:子类   子类引用   =   (子类)父类引用

1.只能强转父类引用,不能强转父类对象。

2.父类引用必须指向的是当前目标类型的对象。如果是当前目标类型的父类对象则不行,虽然写的时候编译器不会报错,但运行时或者调用属性和方法时就会出错了。

ps:如果父类引用指向的是当前目标类型子类的对象,那其实是向上转型。