学习过java的人都知道,java语言中存在向上转型和向下转型。向上转型是指从更具体的类型被引用为较抽象的类型,或者是表示范围小的向范围大的转化。如 father f=new son();或是long a=(long)n;后者的理解比较简单,C语言中已经讲的很明白了,重要的是分析前者。
父类引用子类对象的情况,一般是在实现和使用接口中使用,一是为了方便调用接口的方法,二是更好的处理接口实现的类。如下代码中的父类引用子类对象的例子。
上述结果的输出原因是父类引用子类后,由子类构造函数生成的父类引用,产生的实例只能调用父类的域和方法,如果子类覆盖了父类的方法,那调用的是子类的方法。所以引用后的实例不能调用子类自定义的方法。而后的s对象,已经很明了了。
此外java中,调用方法采用的是一种通信机制,即在f.getname()时,先通知相应的类,即父类Father,同时进入父类的空间。这时任何的域与方法都是该类的。
总之,父类引用子类时,只能调用父类的方法和域,不能调用子类的自定义方法。这也是向上转型方法的缺陷。
父类引用子类对象的情况,一般是在实现和使用接口中使用,一是为了方便调用接口的方法,二是更好的处理接口实现的类。如下代码中的父类引用子类对象的例子。
class Father{
public String name="Father";
public Stirng getname(){
System.out.println("这是父类");
return name;
}
public class Son extends Father{
Son()
{ name="Son"; }
public String getname(){
System.out.println("这是子类");
return name;
}
public void setname(String name){
this.name=name;
}
public static void main(String[] args){
Father f=new Son();
System.out.println(f.name);
System.out.println(f.getname());
f.setname("Father);//出错
Son s=new Son();
System.out.println(f.name);
System.out.println(f.getname());
f.setname("Father);//正确
System.out.println(f.name);
}
}
结果输出:
Father
这是子类
Son
Son
这是子类
Father
上述结果的输出原因是父类引用子类后,由子类构造函数生成的父类引用,产生的实例只能调用父类的域和方法,如果子类覆盖了父类的方法,那调用的是子类的方法。所以引用后的实例不能调用子类自定义的方法。而后的s对象,已经很明了了。
此外java中,调用方法采用的是一种通信机制,即在f.getname()时,先通知相应的类,即父类Father,同时进入父类的空间。这时任何的域与方法都是该类的。
总之,父类引用子类时,只能调用父类的方法和域,不能调用子类的自定义方法。这也是向上转型方法的缺陷。