A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Seraphim 于 2014-5-23 21:46 编辑

class A {
                void fun1() {
                      System.out.println(fun2());
                }

                int fun2() {
                        return 123;
                }
        }

         public class B extends A {
                int fun2() {
                         return 456;
                 }

                public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }

这段代码的运行结果及解释……我确实蒙圈了,有大神解释下么

28 个回复

倒序浏览

class A {
    void fun1() {
          System.out.println(fun2());
    }

    int fun2() {
            return 123;
    }
}

public class B extends A {
    int fun2() {
             return 456;
     }

    public static void main(String args[]) {
            B b = new B();
            b.fun1();  // 打印fun2()的结果:456 (B覆盖了A的方法)
            A a = b;   //new B()赋值给a
            a.fun1();  // new B().fun1()的结果:456
    }
}

回复 使用道具 举报 0 1
执行结果都是456.
这段代码表示:类B 继承 类A

第一个结果:
B b = new B(); 这里new了一个B类的对象b
b.fun1();          对象b调用了父类(A)的方法fun1(),就会执行fun1()的代码
void fun1() {
        System.out.println(fun2());
}
                      会执行fun2()的函数。然而B类覆盖了A类的fun2()方法。所以会执行B类的fun2()方法。即456.

第二个结果:
A a = b;   a.fun1();
       创建了父类A的一个对象a,指向子类B的对象b。
       此时调用 a.fun1(); 即也会调用子类覆盖了父类的fun2()方法,结果任是456.

不知我的解释是否正确,还请验证
回复 使用道具 举报
运行结果应该是456,456
因为B类继承A类,B类会把A类的方法继承过来,只是在B类中并没有显示出来,执行b.fun1()方法时,调用了fun()2方法,这时候B类重写了该方法,所以会去执行子类的fun2()方法。
第二个输出的也是456,因为A a= b;程序在编译期是看做A类型的,但是在运行期是看做B类型的,在调用a.fun()1方法时,其实是调用子类的fun1()方法,这时调用了fun2()方法,子类重写了该方法,所以输出为456....
以上只是个人分析,本人菜鸟刚学java.....其他大神们是怎么分析的呢?
回复 使用道具 举报
1.结果:
        456
        456
2.考点:
       ①类继承;②方法调用与重写;③引用赋值及父类子类之间赋值的关系,内存图。
3.解析:
       父类A定义两个方法,fun1和fun2,其中fun1调用fun2,fun1应该输出123(只看父类时);
       子类B覆盖(override)父类方法fun2返回值456(注意:当子类覆盖父类方法时,new出的子类对象调用fun2时应该调用其覆盖的方法,而不是其父类方法,这是理解此题的关键)。
       B类main函数,new出b对象,其调用其子身fun1,结果为456,这个好明白;接着又创建父类A的引用变量a,然后把子类B的对象引用赋值给a(子类可以赋值给父类,但是父类不可赋值给子类变量,如:苹果可以叫水果,但是水果不能叫苹果,因为水果并不一定指苹果,也可能指香蕉或其它),也就是说a最终调用的还是b,所以输出的结果还是456。
       顺便问一下LZ,报的Android还是JavaEE+云,多少期的?
回复 使用道具 举报
长知识啊长知识~
回复 使用道具 举报
AntThinking_toT 发表于 2014-5-23 20:14
1.结果:
        456
        456

报的云10,你呢
回复 使用道具 举报
谢谢楼上各位了~现在明白了,美女老师面试的很全面,大家准备面试的时候一定要认真~
回复 使用道具 举报
More 中级黑马 2014-5-23 21:54:38
9#
属性是静态绑定的,方法是动态绑定, B b = new B();创建出B的实例  b.fun1(); 继承了类A的fun1(),因为方法是动态绑定的  所以b.fun1()调用的是类B中的fun2() // 打印fun2()的结果:456 (B覆盖了A的方法)
A a = b;   //new B()赋值给a,返回的仍是456,这里调用的还是类B中的fun2().
           
         
回复 使用道具 举报
加油加油
回复 使用道具 举报
楼上的解释很好了  为什么我总是做错  一看还都能看得明白……果然还是不够熟练……
回复 使用道具 举报

我准备报云11,学长啊。面试整个过程大概是什么样的,老师会问些什么问题?
回复 使用道具 举报
我在你之前的代码上加了一些测试代码,是为个你给更好的解释,注意看我的注释。我的答案可能会和上面几位哥们说的不一样,理解起来肯能也有些抽象。
class A {
    void fun1() {
            /**注意你的这段代码你之前是没有this的,但是你要知道,其实这里的this是隐藏了
             * 你要知道这个this是代表对象的地址(就是调用者对象的地址),说白了就是谁调用我,
             * 我就执行谁的方法.所以和覆盖没有关系。
             *
             */
          System.out.println(this.fun2());
          //这是个测试为了证明上面说的
          System.out.println(this);//Test.B@150bd4d
    }

    int fun2() {
            return 123;
    }
}

public class B extends A {
    int fun2() {
             return 456;
     }

    public static void main(String args[]) {
            B b = new B();
            b.fun1();//456
           System.out.println(b.fun2());//456
           //为了证明b对象的地址和A类中的fun1()方法里隐藏的this地址是一样的
           System.out.println(b);//Test.B@150bd4d
           //这里是多态(多态里的对象调用的方法是子类父类共有的方法,并且这个方法是调用子类重写父类的方法)
            A a = b;
            a.fun1();//456
            System.out.println(a.fun2());//456
          //为了证明a对象的地址和A类中的fun1()方法里隐藏的this地址是一样的
            System.out.println(a);//Test.B@150bd4d
    }
}
回复 使用道具 举报
有笔试题吗?有几道笔试题?都是什么啊?面试你的是那个老师?
回复 使用道具 举报
继承的知识,运行结果应给是456
回复 使用道具 举报
面试题考察的很基础啊,感觉自己的希望又增大了。
回复 使用道具 举报
帅哥哥 来自手机 高级黑马 2014-5-24 01:45:08
17#
我擦,这是我基础测试的题……
回复 使用道具 举报
jsjchenlong 发表于 2014-5-23 23:15
有笔试题吗?有几道笔试题?都是什么啊?面试你的是那个老师?

有道题让我写个程序,找出数组中的最小值。。。。这个应该很简单吧,别的都是视频里的东西,大家认真看就好
回复 使用道具 举报
看了下解答
回复 使用道具 举报
结果是456  456  b访问fun()1 ,fun1()调用腐女
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马