您的位置:程序门 -> java -> j2se / 扩展类



对向下类型绑定的理解


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


对向下类型绑定的理解
发表于:2007-12-05 15:31:39 楼主
在上一篇文章中,已经系统的阐述了向上强制类型转换的原理。近日,苦思向下类型绑定,终于有了自己的理解,拿出来与大家分享,希望大家对我的理解指点一二。
import   java.util.*;
import   static   java.lang.system.out;

class   useful{
    public   void   f(){out.println("useful.f()");}
    public   void   g(){out.println("useful.g()");}
}

class   moreuseful   extends   useful{
    public   void   f(){out.println("moreuseful.f()");}
    public   void   g(){out.println("moreuseful.g()");}
    public   void   u(){out.println("moreuseful.u()");}
    public   void   v(){out.println("moreuseful.v()");}
    public   void   w(){out.println("moreuseful.w()");}
}

public   class   rtti{
      public   static   void   main(string   []   args){
          useful   s   =   new   moreuseful();  
          s.f();
          s.g();
---------------------------------------------------------------------------------------------------------------------
        s.u();
这个操作是不会被jvm接受的。在向上类型转换中能够访问的方法列表源自句柄,也就是对象的声明类型(useful),如果在子类中覆盖了父类中的方法,那么在程序运行时绑定时运行的是对象的实际类型中的方法。我们看到u()方法并没有在父类中进行声明,而是子类特有的。
__________________ok,此时如果想直接访问子类中特有的方法我们应该怎么做呢?-------------------------
((moreuseful)s).u();         //or   moreuseful   m   =   (moreuseful)s;   m.u();
这就是常说的向下类型转换,在这里我认为最应该掌握的一句话就是“强制类型转换是发生在引用上的”,此时我们的句柄变成了moreuseful,注意,此时程序运行时jvm得到的方法列表源自带有u();的moreuseful。
-------------------------------------------------------------------------------------------------------------------------
我在想到这时突然产生了一个疑问(当然对于java经验丰富的老鸟就当看个笑话啦)
我的疑问是为什么还要强转呢,直接moreuseful   m1   =   new   moreuseful();不就一切都搞定了吗?没错。
out.println(s.tostring());             //注意我引入的包,1.5中是可以去掉大小写混在一起的system
out.println(m.tostring());
out.println(m1.tostring());
s、m只是引用上的转换,m1是新建了一个对象。这是我觉得实际中有用的地方,请大家再补充一下向下强制类型转换在实际应用中还有什么其它的作用。
发表于:2007-12-05 15:41:341楼 得分:0
我的疑问是为什么还要强转呢,直接moreuseful       m1       =       new       moreuseful();不就一切都搞定了吗?没错。
////////////////////////////////////////////////////////////////////////////////////////////////
如果你创建了不止一个这个类的子类的时候你就会知道为什么要用声明父类却指向子类对象了!

这和接口的概念是一样的,一个接口可以有任意多个实现,但是每个实现的方式和提供的功能可以都不一样.
如果你在哪个地方想用这个接口时,你可以直接传入接口的引用,而不是传入它的某个实现类的引用,这样就可以用接口引用来传入不同的实现类实例,来实现不同的功能了!
发表于:2007-12-06 12:31:022楼 得分:0
这就是多态设计
当一组子类由一个公共的基类派生时,我们可以将基类看做是一个通用接口,这样就可以不必关心具体的实现
比如说,我现在有个程序是用来从不同的输入流中读取数据
这些流可能是字符流,可能是文件流,也可能是其他任意类型的流
如果说没有接口设计这种办法的话,你势必也对每一种输入流建立一个相应的读取方法,这就造成了大量的代码冗余
相比下,如果我们不关心实际流的情况,只需要知道这些流是基于"输入流"这个接口,这个基类,我们就可以通过这个接口来读取数据,而不必关心这个流具体是什么流


快速检索

最新资讯
热门点击