父类引用子类对象

学习过java的人都知道,java语言中存在向上转型和向下转型。向上转型是指从更具体的类型被引用为较抽象的类型,或者是表示范围小的向范围大的转化。如 father f=new son();或是long a=(long)n;后者的理解比较简单,C语言中已经讲的很明白了,重要的是分析前者。
父类引用子类对象的情况,一般是在实现和使用接口中使用,一是为了方便调用接口的方法,二是更好的处理接口实现的类。如下代码中的父类引用子类对象的例子。

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,同时进入父类的空间。这时任何的域与方法都是该类的。
总之,父类引用子类时,只能调用父类的方法和域,不能调用子类的自定义方法。这也是向上转型方法的缺陷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值