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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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();//这里又是怎么使用子类的呢?它的原理和运行方式,请详细解答????
                }
        }

4 个回复

倒序浏览
b.fun1();//这里为嘛调用子类方式     ----- 调用b.fun1(),执行System.out.println(fun2());当调用fun2()时,发现子类覆写了fun1(),所以调用子类方式
回复 使用道具 举报
  a.fun1();    -------原理同上,此题主要是考查你对多态的了解
回复 使用道具 举报
本帖最后由 2666fff 于 2015-6-4 12:07 编辑

a.fun1();//这里又是怎么使用子类的呢?它的原理和运行方式,请详细解答????

这个是因为B继承A是A的子类,父类的引用指向了子类的对象。
根据多态:a这个引用能调用的方法必须是b(子类)类里重写了a(父类)的方法,所以打印出456 而不是A的123
所以B里面你再加一个
                void fun3() {
                         printf(11);
                 }
a是不能调用的。


回复 使用道具 举报
想要理解多态光看毕老师的视频不够的,毕老师视频里面只告诉你结果

实际上,对于类中的方法,非静态的方法都有一个隐式参数this,而非静态方法则没有。

静态方法和域,通过ClassName.func(),ClassName.val就可以直接调用,静态域也称为类域。他们随着类加载进内存就存在了,先于实例对象而生。
我们知道this指向的是实例对象本身,而静态域先于实例对象生成,肯定是不会有this的。

那么如前所述,非静态方法在调用时,this是作为隐式参数的,比如a.func(),实际上func不是无参数,而是有一个this指向a的参数。
那么在调用多态方法时候,this指向的是哪个,调用的就是哪个方法,this指向的是内存中的实例对象,所以多态在调用非静态方法时,调用的是对象实际类型的方法。

而静态方法没有this隐式参数,则调用的是声明的类型的方法。
  B b = new B();
  b.fun1();//这里为嘛调用子类方式
b指向的是new B()创建的B类实例,所以b.fun1()调用的是B类的fun1。

A a = b;
a.fun1();//这里又是怎么使用子类的呢?它的原理和运行方式,请详细解答????
a是声明为A类型的对象变量,a的值是b的值的引用,而b指向的是new B()创建的B类实例。
所以A a是声明为父类,但是指向子类实例对象的。
所以如前所述,a在调用fun1()时,fun1()的隐式参数this,所指向的对象是new B()创建的B类实例,所以fun1()会调用的是B类的fun1()。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马