首先什么是向上转型?
向上转型是JAVA中的一种调用方式,是多态的一种表现。向上转型并非是将B自动向上转型为A的对象,相反它是从另一种角度去理解向上两字的:它是对A的对象的方法的扩充,即A的对象可访问B从A中继承来的和B复写A的方法,其它的方法都不能访问,包括A中的私有成员方法。
比如标题:
1、a实际上指向的是一个子类对象,所以可以访问Dog类从Animal类继承的方法sleep()和重写的方法eat()
2、由于向上转型,a对象会遗失和父类不同的方法,如methods();
在向上转型的过程中,如果子类没有该方法,那么就会调用父类的方法,如果子类有重写该方法,那么会调用子类的方法;
举例说明:
class Animal{
public void sleep(){
System.out.println("Animal sleep");
}
public void eat() {
System.out.println("Animal eat");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("dog eat meat");//重写父类方法
}
//子类定义了自己的新方法
public void methods() {
System.out.println("dog method");
}
}
public class Demo {
public static void main(String[] args) {
Animal a = new Dog();
a.sleep();//Animal sleep
a.eat();//dog eat meat
//a.methods(); /*报错:The method methods() is undefined for the type Animal*/
}
}
接下来看成员变量的访问特点:
因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
在现实生活中的体现:
自己用自己的,儿子有父亲一样的,就用儿子的。省点钱是点。儿子独有的,父亲不会用,所以不能用