Father father=son; 这是一个向上转型注意这可不是C++里的指针,这些都是instances所以father就是Father的实例

解决方案 »

  1.   

    class A { 
    public int getNumber(int a) { 
        return a + 1; 

            } 
     class B extends A { 
    public int getNumber (int a) { 
    return a + 2; 
            } 
     }
    public class TestAB {
    public static void main (String args[])  { 
    A a = new B(); 
     System.out.println(a.getNumber(0)); 
        } 
     }   可为什么输出的结果却是2呢?
      

  2.   

    A a = new B(); 
    为什么就没有向上转型呢?
      

  3.   

    A a = new B(); a实际上是指向B()的一个句柄也就是new的是B,不是A比如  Map m = new HashMap();你说这个m是HashMap还是Map呢?
      

  4.   

    我的例子举的不好,Map是接口我用JB跟踪了一下你的程序,看到son的class是Son而father的class有两层,外层是Son, 而内层是Father
    也就是实际上它还是指向Father的一个句柄不太好解释,我的水平也有限,总之一句话Father f = new Son();对象一定是Son至于
    Son s = new Son();
    Father f = s;就如dzmonkey(dzmonkey)所说,是个上溯造型吧 :)
    继续等高手来解释
      

  5.   

    上溯就是往父类方向转型,比如Object是任何类的基类(基本类型除外),因此你可以这么做:
    String s = "test" ;
    Object obj = s ;
    这是对的,并且是安全的下溯造型就是强制转型,如果你现在有一个Object对象,但你并不知道它真正的类型,这时如果你强制将其任意转型
    Object obj = new Object() ;
    ...
    ...
    String s = (String)obj ;就会出现不定的情况: 
    1.如果...中的代码行恰好将obj指向一个String类型的句柄,那么,你的转型是正确的
    2.如果...中没有如1中将obj指向一个String而是其他类型(Integer, etc..)那么程序在运行时会抛出ClassCastException,也就是我们常说的造型异常.从上面的例子可以看出,上溯造型(Upcasting)是安全的,并且不需要指定转换类型
    而下溯造型(Downcasting)是不安全的,除非你明确知道其类型,否则可能会出错,并且,下溯时需要明确指定转换类型.
    还有一个常用的例子:
    大家在做b/s应用时常用的两个对象request和session,他们都有setAttribute(String,Object);方法,因此我们在使用 request.getAttribute("") 和 session.getAttribute("")方法时是不是都要强制转一下型呢, 如
    String name = (String) session.getAttribute("name") ;
    关于造型Thinking in java中讲的比较详细,可以看看
      

  6.   

    谢谢楼上,可是针对我的第一段程序,
    为什么Father father=son; father.shou("dd")方法调用的是Father的方法呢?
      

  7.   

    通俗点讲
    Son son=new Son();//生成son的实例
    Father father=son;//把son向上转型成father。也就是Father father=(Father)son。类型变了
      

  8.   

    为什么Father father=son; father.shou("dd")方法调用的是Father的方法呢?-----------------看看多态吧你应该认为,并且那一定是, father现在是一个Father对象
      

  9.   

    呵呵,楼上的人都讲错了,没有看仔细这个代码;
    public class Father {public Father() {
    super();}
    public void shout(Object word){ //真正问题是出在这里的参数Object,它不是之类的String;所以实际上,楼主这个程序根本就构不成子类方法覆盖父类方法的多态条件;
    System.out.println("object father shout:"+word);
    }}
    //输出结果为:
    string son shout:hello//在子类对象中,两个shout方法重载中,参数为String的更匹配,所以调用子类中的shout方法;
    object father shout:hello//由于是父类引用,而且不构成多态,所以只能调用父类的shout方法
      

  10.   

    楼主看看这个:java基本概念学习手记(一)——继承与覆写
    http://www.javatx.cn/clubPage.jsp?ccStyle=0&tID=724&ccID=6
      

  11.   

    借光:路过的各位,帮忙看看这几个帖子,看怎么解决;)谢谢啦!关于客户端页面从数据库中读取大量图片的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4816106乱码还原问题!
    http://community.csdn.net/Expert/TopicView3.asp?id=4813786关于javabean反射代理的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4813935
      

  12.   

    Father father=son;
    这条语句能够编译通过,并且执行.因为Father也有那个son有的方法.所以在调用时,是调用Father的方法.如果Father没有son的那个方法.这条语句就会出错.
    只能用
    Father father=(Father)son;
    这样实现