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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嵘才 中级黑马   /  2013-2-25 16:11  /  1793 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



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

我想让多态调用到它的实际类型,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

3 个回复

倒序浏览
这两个方法都是静态方法,静态方法都是与类相关的,
在编译时期,你将s定义为父类Super,那么你调用的静态方法,
在运行是s.m(),就直接找到s在编译时所属的类,调用Super.m()
回复 使用道具 举报
你这个父类和子类里面的方法都是静态的,他们存在于方法区中,不在对象里面
你这个变量是父类型的变量
当然回去读父类的方法
你可以这样理解
这2个方法都不是静态的时候,他会读子类复写的方法
回复 使用道具 举报


/**
         */
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, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马