4.24向上转型、向下转型
俗话说:基础不牢,地振山摇。同时向上转型和向下转型有特别重要,可以大大减少编码量,因为为了巩固基础特意复习。总结完顿悟
①向上转型:子类对象变为父类对象
子类继承父类,向上转型可以访问子类重写父类的所有方法
public class Animal{ //测试的时候注意这里加public
public void sleep(){
System.out.println("动物都是喜欢睡觉的");
}
public void eat(){
System.out.println("动物都是喜欢吃东西的");
}
}
class Dog extends Animal{
public void sleep(){
System.out.println("狗最喜欢睡觉");
}
public void eat(){
System.out.println("狗喜欢吃骨头");
}
}
class MyTest{ //测试的时候这里不要加public,因为只能有一个类是公共的
public static void main(String[] args){
Animal a = new Dog();//向上转型
a.sleep();//输出结果为 "狗最喜欢睡觉"
}
}
子类是对父类功能的扩充,子类功能更强大,向上转型的时候,父类对子类特有的功能是望尘莫及的。
public class Animal{ //测试的时候注意这里加public
public void sleep(){
System.out.println("动物都是喜欢睡觉的");
}
public void eat(){
System.out.println("动物都是喜欢吃东西的");
}
}
class Dog extends Animal{
public void sleep(){
System.out.println("狗最喜欢睡觉");
}
public void eat(){
System.out.println("狗喜欢吃骨头");
}
public void play(){
System.out.println("狗还喜欢玩耍");
}
}
class MyTest{ //测试的时候这里不要加public,因为只能有一个类是公共的
public static void main(String[] args){
Animal a = new Dog();
a.sleep();
a.play();//这里编译出错 这里可以new子类对象进行访问
}
}
//因为是子类特有的方法,所以向上转型访问不到子类特有的方法
如果子类没有重写父类的方法,
public class Animal{
public void sleep(){
System.out.println("动物都是喜欢睡觉的");
eat();
}
public void eat(){
System.out.println("动物都是喜欢吃东西的");
}
}
class Dog extends Animal{
public void sleep(int i){
System.out.println("狗最喜欢睡觉");
}
public void eat(){
System.out.println("狗喜欢吃骨头");
}
}
class MyTest{ //测试的时候这里不要加public,因为只能有一个类是公共的
public static void main(String[] args){
Animal a = new Dog();//向上转型
//父类特有的直接new父类对象也行,但是不推荐,多态使用
a.sleep();//输出结果为 "动物都是喜欢睡觉的、狗喜欢吃骨头"
}
}
注:如果直接向下转型的话,编译会通过,但是运行会报错。
public class Animal{ //测试的时候注意这里加public
public void sleep(){
System.out.println("动物都是喜欢睡觉的");
}
public void eat(){
System.out.println("动物都是喜欢吃东西的");
}
}
class Dog extends Animal{
public void sleep(){
System.out.println("狗最喜欢睡觉");
}
public void eat(){
System.out.println("狗喜欢吃骨头");
}
}
class MyTest{ //测试的时候这里不要加public,因为只能有一个类是公共的
public static void main(String[] args){
Dog d = (Dog) new Animal();
d.sleep();//编译通过,运行报错
}
}
②向下转型:父类对象变为子类对象
向下转型就是获取由于向上转型丢失的子类特有的方法
总结:
1.定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
2.父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
3.父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
4.对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接
子类中定义而父类中没有的方法,它是无可奈何**的;
3.父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
4.对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接