黑马程序员技术交流社区

标题: 这个多态怎么不管用? [打印本页]

作者: 黄嵘才    时间: 2013-2-25 16:11
标题: 这个多态怎么不管用?


多态?
父类的引用指向子类的对象。运行时会运行子类覆盖的方法.

我想让多态调用到它的实际类型,sub的方法。但是它却调用了父类的方法,这是为什么?

  1. /**
  2.          */
  3. public class Test {
  4.         public static void main(String args[]) {
  5.                 Super s = new Sub();
  6.                 s.m();
  7.         }
  8. }

  9. class Super {
  10.         public static void m() {
  11.                 System.out.println("super");
  12.         }
  13. }

  14. class Sub extends Super {

  15.         public static void m() {

  16.                 System.out.println("sub");
  17.         }
  18. }
复制代码
结果是:
super

作者: 王钊    时间: 2013-2-25 16:27
这两个方法都是静态方法,静态方法都是与类相关的,
在编译时期,你将s定义为父类Super,那么你调用的静态方法,
在运行是s.m(),就直接找到s在编译时所属的类,调用Super.m()
作者: 李挺    时间: 2013-2-25 16:29
你这个父类和子类里面的方法都是静态的,他们存在于方法区中,不在对象里面
你这个变量是父类型的变量
当然回去读父类的方法
你可以这样理解
这2个方法都不是静态的时候,他会读子类复写的方法
作者: 彭颖    时间: 2013-2-26 01:55


/**
         */
public class Test {
        public static void main(String args[]) {
                Super s = new Sub();

                            //静态方法引用变量所声明的类型(Super类型)的方法绑定               
                s.m();//所以你打印的super类的m方法
        }
}


class Super {
        public static void m() {
                System.out.println("super");
        }
}


class Sub extends Super {


        public static void m() {


                System.out.println("sub");
        }
}

-------------------------------------------------


在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
   1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的

   2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定

   3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2