super是何意思?super只能在constuctor里使用吧?!

解决方案 »

  1.   

    更正:super也可以在其他函数中使用。但是,这不能满足我提出的要求.
      

  2.   

    方法是运行期帮定的
    b不能调用其父类A中的print()
      

  3.   

    To: dickmi(我用心感受世界) 
    没有必要这麽多废话吧,我替你说了吧:dickmi不会回答这个问题。
      

  4.   

    其实题目“打倒Java高手”只是想吸引众位Java高手的眼球,没有打倒的意思,请各位谅解。
    说实话,我也编了3年Java程序了,也算是Java程序员吧。最近,因需要用C++编个软件,猛啃了一阵C++,发现了这个问题,拿出来与大家探讨。究竟是不是像dickmi说的,这样做,根本没有必要???,具体需要这样做的地方,我暂时还真没有想到,想到再告诉大家。
      

  5.   

    我赞成dickmi(我用心感受世界) 说的“完全违反了面向对象的思想”。
    对于java来说,在实际应用中应该不会需要这样的功能,而且我看过的java书籍中都没有提到这个。
      

  6.   

    这个问题有讨论的必要:典型的面向对象问题(继承方面)我只能吧我对java部分的理解说一说:
    首先大家应该知道
    1。java所有的函数都是虚函数,(这个我可以肯定)
    2。变量的声明仅仅是一个指针,变量的创建才会分配资源(希望我没记错:-P)
    所以顶楼兄弟的例子就很好解释了:b指向了一个真实类型为B的实体;
    a=b;语句的结果是:a,b指向了同一片内存。中间还有一次向上造型,是合法的。
    当a.print()执行时,虚函数的特性,使得最终得到执行的,是由这片内存中实体的真正类型决定的,也就是B的print()会被运行,而不是A的print()被运行。
      

  7.   

    我看了一会儿,试了一会儿,我觉得的确如此,至少我是不能用java做出这样的功能,这里不得不说明了C++的灵活,例如范形模板,多种的指针,都是java所不及的,但是我还是认为同时这也使java使用起来更方便,更符合规范,最大的就是更符合面向对象的思想。
      

  8.   

    楼上的兄弟的叙述是对的,但是现在的问题是如何跨过java内部默认的虚函数调用。
      

  9.   

    为什么需要这么做呢???
    赞成这句话:
       你爸是你爸,你是你,你能指望你控制你爸的嘴来填饱你的肚子
    OOP嘛
      

  10.   

    楼上的兄弟的叙述是对的,但是现在的问题是如何跨过java内部默认的虚函数调用。 
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    cherami终于说出了我的心声。
    有没有必要,我也不知道,只是因为碰巧我遇到了这个问题,提出来,大家探讨一番。
      

  11.   

    請問﹕
    import java.io.*;class A {
    public A()
    {
       print();
    }public void print() {
    System.out.println("aaaaa");
    }
    };class B extends A {
    public void print() {
    System.out.println("bbbbb");
    }
    };public class test {
      static void main(String args[])
      {
      B b = new B();
      A a = new A();
      a.print();
      a = b;
      a.print();
      b.print();
      }
    }的結果為什么是如下呢﹖
    bbbbb
    aaaaa
    aaaaa
    bbbbb
    bbbbb
    爾不是﹕
    aaaaa
    aaaaa
    aaaaa
    bbbbb
    bbbbb
      

  12.   

    来两手绝的:-P    class A {
            public String name;
            public void print() {
                System.out.println("aaaaa");
            }
        };    class B extends A {
            public void print(boolean VisualFlg) {
                if( !VisualFlg)
                    super.print();
                else
                    System.out.println("bbbbb");
            }
            public void print() {
                System.out.println("bbbbb");
            }
        };
      

  13.   

    super.print();
    不行么?
    怎么不能满足你的要求...
      

  14.   

    To: ypf990(ypf) 
    这个问题的应该可以用上面vampirelord的话解答。
    B b = new B();
    在调用构造函数时,内存已经存在两个print()。但是由于java所有的函数都是虚函数。所以自动调用B中的print()。
      

  15.   

    ((A)a).print();
    This should invoke A.print().
      

  16.   

    我想帖子的作者的原意是不修改类的定义直接实现它的通过子类的实例调用父类的方法。要是修改类定义,那么方法真是多如牛毛,我想最好的修改定义的方法还是这样的,使用instanceof:
       class A {
            public String name;
            public void print() {
                System.out.println("aaaaa");
            }
        };    class B extends A {
     public void print(){
    if (this instanceof A)
    {
    super.print();
    }
    else {
    System.out.println("bbbb");
    }
    }    };
      

  17.   

    将a = b;
      a.print();
      b.print();
    换成:
    try {    ((A) b.getClass().getSuperClass().newInstance()).print();} catch (IllegalAccessException iae) {    iae.printStackTrace();} catch (InstantiationException ie) {    ie.printStackTrace();}
    这是sun的论坛上一位朋友给的代码。
      

  18.   

    to cherami(cherami):
    你这样会把b的原来状态丢失,那还不如直接构造a。因为java也不支持多重继承,你编程时就已经可以确定它的父类了。这个问题没有什么实际的意义。
    有些事是java做不到或避免做到的,大家何必要使劲在那想让java做它不能或不应该做的事呢?就好像有谁能在java里实现模版的功能?这是根本做不到的。
      

  19.   

    to ypf990(ypf):
    Class A ,Class B的构造器要在Class test构造器运作之前初始化!
      

  20.   

    小衲想不出办法:-)A a=null;
    B b=new B();
    a=b;
    a.print();如果print()是一个非静态方法,则这是一个典型的override/多态例
    子,我想Java就是这么设计的,这时就是要调用B中的print(),
    换句话说,这里就是专门留给多态的,你这样用表明你想在这
    里用多态了 :-)想用多态,又不好好用高司令的胡子气的一撅一撅的
    哈哈哈哈哈同样的代码,如果print)是静态方法,则a.print()会调用A中的print()。
    (hide)
      

  21.   

    java 中所有的对象方法都是虚(相当于c++中的virtue)函数,根本就不支持这种调用。
      

  22.   

    在sun的论坛上的人也是这么说的,java中的对象方法都是虚函数,所以我们只是进行可能性讨论,虽然没有什么太大的实际意义。:)
    这个讨论也许该就此结束了。
      

  23.   

    这种情况下
    应使用重载,而不是在子类的实现上做文章,
    loose couple,easy to understand
    因为只所以调用付类的method 是因为implement 不同,
    调用者清楚的知道何时调用谁的方法