向上转型:
即声明为父类,实际运行时为子类。
若调用对象pet,实例变量是Pet类的。
而调用方法时,运行Dog类重写后的方法,局部变量也是Dog类的。
不能调用父类没有的方法。
//向上转型
Pet pet = new Dog();
//调用变量:
System.out.println(pet.nickname);//小黑
pet.setNickname("小白");
System.out.println(pet.nickname);//小白
//调用方法:
System.out.println(pet.getNickname());//xiaobai
pet.eat();//狗子xiaobai啃骨头
// pet.watchHouse();//不能调用父类没有的方法 watchHouse
向下转型(向上后的逆变换):
调用对象d,实例变量都是Dog子类的。
若get方法没有在子类重写,则父类方法返回的局部变量来自父类。
若get方法已重写,则局部变量来自子类。
若set方法重写了,实例变量才改;否则仍来自Dog子类。
*若pet2运行时非Dog(),则报错ClassCastException
Pet pet2 = new Dog();//多态后
//向下转型
Dog d = (Dog) pet2;
System.out.println(d.nickname);//xiaobai
System.out.println(d.getNickname());//xiaobai 若不重写则小黑
d.setNickname("maomao");
System.out.println(d.nickname);//maomao 若set不重写则xiaobai
System.out.println(d.getNickname());//maomao 若get重写,set不重写,则xiaobai
d.eat();//狗子maomao啃骨头
d.watchHouse();//看家
完整代码:
package test;
class Pet {
public String nickname = "小黑"; //昵称
public String getNickname() {
return this.nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void eat() {
System.out.println(nickname + "吃东西");
}
}
class Dog extends Pet {
//子类重写父类的方法
public String nickname = "xiaobai"; //昵称
@Override
public void eat() {
System.out.println("狗子" + getNickname() + "啃骨头");
}
@Override
public String getNickname() {
return this.nickname;
}
@Override
public void setNickname(String nickname) {
this.nickname = nickname;
}
//子类扩展的方法
public void watchHouse() {
System.out.println("看家");
}
}
public class Test {
public static void main(String[] args) {
//向上转型
Pet pet = new Dog();
//调用变量:
System.out.println(pet.nickname);//小黑
pet.setNickname("小白");
System.out.println(pet.nickname);//小白
//调用方法:
System.out.println(pet.getNickname());//xiaobai
pet.eat();//狗子xiaobai啃骨头
// pet.watchHouse();//不能调用父类没有的方法 watchHouse
System.out.println();
Pet pet2 = new Dog();//多态后
//向下转型
Dog d = (Dog) pet2;
System.out.println(d.nickname);//xiaobai
System.out.println(d.getNickname());//xiaobai 若不重写则小黑
d.setNickname("maomao");
System.out.println(d.nickname);//maomao 若不重写则xiaobai
System.out.println(d.getNickname());//maomao
d.eat();//狗子maomao啃骨头
d.watchHouse();//看家
}
}