上转型对象

上转型对象 :用子类的构造函数给父类的对象赋值

父类 a = new 子类();
父类 a = 子类对象;

一个例子:

父类A
变量
方法
子类B
父类的未被重写变量
父类的未被重写方法
被重写(覆盖)的变量
被重写的方法
新建的方法/变量
A a = new B();
a.子类新建的方法/变量;//错误,不可以调用
a.父子同名的变量;//调用的是父类的变量
a.父子同名的方法;//调用的是子类的重写了的方法
a.父类未被重写的变量/方法//调用的是父类的变量/方法

特点:1.上转型对象调用方法时,当这个方法被重写的时候,调用的是子类重写的方法

2.上转型对象调用变量的时候,即使变量被子类重写了,但是还是调用父类的变量

3.上转型对象不可以调用子类新建的变量和方法

class A{
    void set(){
        System.out.println("我是父类的方法1");
    }
    void setNumber(){
        System.out.println("我是父类的方法2");
    }
    int  number = 100;
    int number2 = 200;
}
class B extends A{
    int number = 120;//重写父类变量
    int num = 110;//新建变量num
    void set(){//重写父类方法
        System.out.println("我是子类重写的方法");
    }
    void set2(){//新建子类方法
        System.out.println("我是子类的新建方法");
    }
}
public class Demo6 {
    public static void main(String[] args) {
        A a = new B();//上转型对象,用子类的构造函数给父类新建对象
        B b = new B();
        //a.set2();//错误,上转型对象不可以调用子类的方法
        //System.out.println(a.num);//上转型对象不可以调用子类的新增的变量
        System.out.println(a.number);//调用的是父类的number
        a.set();//调用的是子类重写的方法,相当于b.set();
        a.setNumber();//父类的方法
        System.out.println(a.number2);//父类的变量
        System.out.println(b.number);//调用的是重写的number
    }
}

结果

100
我是子类重写的方法
我是父类的方法2
200
120
posted on 2021-03-25 22:19  月下伊独舞  阅读(177)  评论(0编辑  收藏  举报