(七)java中类的转型问题
-
类的转型是什么?
父类引用指向子类对象。多态的一种体现。 -
什么时候才有转型?
只有在类与类之间有继承关系的时候才会有类型转换。 -
转型的时候需要注意一些问题。 如下例子。
创建一个父类Father
public class Father {
//父类属性
String name="father";
int age;
//父类方法
public void earnmoney() {
System.out.println("father earn money");
}
}
创建一个子类Son继承父类Father
public class Son extends Father{
//子类属性,其中name属性覆盖了父类的name属性
String name="son";
int studentid;
//子类 方法
public void study() {
System.out.println("son must study ");
}
//子类覆盖父类的earnmoney方法
public void earnmoney() {
System.out.println("son earn money");
}
}
创建一个测试类Test
里面的注释就是我在学习的时候的思考过程。
public class Test {
public static void main(String[] args) {
Son s=new Son();
System.out.println(s.name);
s.earnmoney();
s.study();//son中有 father 和 son的 属性和方法
System.out.println("--上面实例化子类son------下面转型:父类对象指向子类实例(向上转型)---------");
Father f=new Son();//这是什么转型? 为什么要这么做?
//f对象只能取到父类的方法
//f可以取父类的属性,以及自己的方法,如果父类方法被子类所覆盖,就调用子类的覆盖的方法!
//father取不到son中的方法,为什么还这么写,为什么不直接写Father father=new Father();
f.earnmoney();//子类中覆盖了父类的earnmoney()方法,父类调用其方法,实际上是调用的子类的方法。
//用父类实例化子类的好处是
//当有多个子类继承父类的时候,如果实例化每一个子类,就需要很多的内存,而且麻烦。
//如果用父类指向实例化的子类,那么就大大节省了空间。
//例子如(十一 几个经典例题)
System.out.println(f.name);
//Son s1=new Father();//err Type mismatch: cannot convert from Father to Son 类型不匹配:无法从父级转换为子级
}
}
运行结果
由上例子可知:
①如果父类方法被子类所覆盖,父类调用的方法就调用子类的覆盖的方法!
②父类指向实例化的子类,可以节省了内存空间。
这个就是我对转型的小小理解。
③是多态的一种体现,以后会经常使用。