上转型对象
上转型对象 :用子类的构造函数给父类的对象赋值
父类 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