我看的书上是这样写的:
对于引用变量,当一个类需要被塑型成更一般的类(父类)或接口时,系统会进行自动塑型。
例如下面的操作是合法的(student1是Student的子类),即可以将student1类型的对象直接赋给Student类的引用变量,系统会进行自动塑型,将此student1对象塑型为Student类。
Student s;
s=new student1();另一段是这样的:
Student s;
s= new student1();
s.Run();
s= new student2();
s.Run();
s= new student3();
s.Run();
按照继承关系,student1,student2,student3属于Student的一种。系统会自动执行类型转换。当调用方法Run时,实际调用的是子类的Run方法。我的问题是:
书上说的“自动执行类型转换”如果是按照开头写的那样转换为父类,
那么父类对象s如何调用子类的Run方法?
对于引用变量,当一个类需要被塑型成更一般的类(父类)或接口时,系统会进行自动塑型。
例如下面的操作是合法的(student1是Student的子类),即可以将student1类型的对象直接赋给Student类的引用变量,系统会进行自动塑型,将此student1对象塑型为Student类。
Student s;
s=new student1();另一段是这样的:
Student s;
s= new student1();
s.Run();
s= new student2();
s.Run();
s= new student3();
s.Run();
按照继承关系,student1,student2,student3属于Student的一种。系统会自动执行类型转换。当调用方法Run时,实际调用的是子类的Run方法。我的问题是:
书上说的“自动执行类型转换”如果是按照开头写的那样转换为父类,
那么父类对象s如何调用子类的Run方法?
我的问题最后一句改为
书上的“当调用方法Run时,实际调用的是子类的Run方法。”是如何实现的?
s= new student2();
s= new student3();如上,当你实例父类对象的时候,其实已经给它框定了是哪个子类的对象。如果在实例化对象时,没有指定子类的类型给该对象,则会执行父类的Run方法
建议你去看下多态
当父类引用指向子类对象;
子类有对父类方法的重写;
就可以实现,这是java挺牛的一个功能。
package org.lxh.zhuanxingdemo;class FuLei {
public void fun1() {
System.out.println("父类中的fun1方法");
}
}class ZiLei extends FuLei {
public void fun2() {
System.out.println("子类中的fun2方法");
}
}public class ZhuanXingDemo01 {
public static void main(String args[]) {
// FuLei fulei = new ZiLei();
// fulei.fun1(); FuLei fulei = new ZiLei();// 向上转型(自动)
ZiLei zilei = (ZiLei) fulei;// 向下转型(强制)
zilei.fun1();
zilei.fun2(); }}
// 同时发生强制向下转型的前提是先向上转型来建立关系
// 如果上面代码改为
// FuLei fulei = new FuLei();
// ZiLei zilei = (ZiLei) fulei;则为错误的因为你没有先进行向上转型来建立关系