黑马程序员技术交流社区

标题: super 方法调用问题 [打印本页]

作者: 余银桂    时间: 2012-6-21 23:24
标题: super 方法调用问题
本帖最后由 余银桂 于 2012-6-22 00:10 编辑
  1. import java.util.Date;
  2. public  class Test extends Date{
  3.         public static void main(String[] args) {
  4.                 new Test().test();
  5.         }
  6.         
  7.         public void test(){
  8.                 System.out.println(super.getClass().getName());
  9.         }
  10. }
复制代码
输出结果是 Test
为什么没有获取到父类的名称?

作者: 鲍永章    时间: 2012-6-21 23:32
本帖最后由 鲍永章 于 2012-6-21 23:35 编辑

调用super.getClass()和调用this.getClass();是一样的,因为this.getClass()是从父类继承的,是Object类的方法
个人理解,这个方法是获取当前实际对象的类

你从Date继承,Date这个类里应该也没有getClass方法,总之最终是从Object继承来的,这个方法只有一个,所以是不是super都一样,结果肯定是根据实际new的对象类型决定的
作者: 朱志辉    时间: 2012-6-21 23:39
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用super.getClass().getName()方法等效于调用getClass().getName()方法,都是在调用从父类继承的 getClass()方法,所以super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();

super不是超类的引用,而是表示在子类中调用父类的方法或属性而已
  1. class B extends A {
  2.      public void print() {
  3.            System.out.println(super.getClass());//调用A类中的getclass()方法,A是Object的子类,A中的getClass()是Object中的,运行时期的实例是B类,所以输出的依然是Class B
  4.            System.out.println(this.getClass()); //调用B类中的getclass()方法,此方法从A继承的,A从Object继承的,运行时期的实例是B类,所以输出的是Class B
  5. }
复制代码

作者: 杨康    时间: 2012-6-21 23:41
我的理解是因为Test继承了Date,而Date继承自Object,所以Test也就有了getClass方法,而在继承中的规则是子继承父后,如果有同名函数而父类中的函数将会被覆盖,则调用时会运行子类中的方法,所以super.getClass方法调用时是调用的Test类中的getClass方法。
作者: 丁二跃    时间: 2012-6-22 00:03
本帖最后由 丁二跃 于 2012-6-22 00:06 编辑
  1. public class K extends KK{

  2.         public static void main(String[] args) {
  3.                
  4.                 new K().test();
  5.                
  6.         }
  7.         void test(){
  8.                 super.get();//super 是子类调用父类的方法,而不是通过父类去掉用,在这里通过super调用父类get方法,在父类里打印当前对象就可以一目了然,究竟是那个对象调用的。
  9.                
  10.         }

  11. }

  12. class KK{
  13.    void get(){
  14.            System.out.println("father-----"+this);
  15.    }
  16. }
复制代码
实验结果:father-----K@152b6651

可以看出,是k 也就是子类对象调用
作者: 张华廷    时间: 2012-6-22 00:03
在test方法中调用super.getClass().getName()方法等效于调用getClass().getName()方法,都是在调用从父类继承的 getClass()方法,所以super.getClass().getName()方法返回的也应该是Test,
作者: 余银桂    时间: 2012-6-22 00:10
朱志辉 发表于 2012-6-21 23:39
由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在test方法中调用super.getClass(). ...

果然是,谢谢了。




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