黑马程序员技术交流社区

标题: Class的一个问题 [打印本页]

作者: 肖宇宥    时间: 2013-4-28 15:29
标题: Class的一个问题
  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,而不是java.util.Date
作者: cowthan    时间: 2013-4-28 15:48
楼主你好,如果你想打印出,你应该super.getClass().getSuperclass().getName()
这个涉及到两个概念:
1、Java里自动实现虚函数机制,所以调用super.getClass()和this.getClass()效果应该是一样的,都是对当前对象进行操作,而这里的当前对象当然是子类,而不是父类
2、要使用反射机制得到一个类的父类,就是getSuperclass()
作者: surce2012    时间: 2013-4-28 15:53
学习了
super.getClass().getSuperClass().getName();
作者: 肖宇宥    时间: 2013-4-28 15:55
cowthan 发表于 2013-4-28 15:48
楼主你好,如果你想打印出,你应该super.getClass().getSuperclass().getName()
这个涉及到两个概念:
1、J ...

那构造方法里面的super()方法,怎么有用?
作者: cowthan    时间: 2013-4-28 16:03
肖宇宥 发表于 2013-4-28 15:55
那构造方法里面的super()方法,怎么有用?

楼主似乎绕进去了,super()就是用来初始化父类里的成员,但是父类里的成员也被子类继承过来了,所以子类的构造函数里调用super(),这不就相当于初始化自己的成员吗:
——子类调用super():这是调用了父类的构造函数来初始化了自己的成员(只不过这些成员是父类给的,所以用父类的构造方法来帮个忙,就不用自己再写这部分初始化代码了)
——子类调用super.getClass():这是调用了父类的方法来获取了自己的Class属性
道理是一样的吧
作者: 肖宇宥    时间: 2013-4-28 16:50
cowthan 发表于 2013-4-28 16:03
楼主似乎绕进去了,super()就是用来初始化父类里的成员,但是父类里的成员也被子类继承过来了,所以子类 ...

你好,super不是代表父类对象吗?super.xx(),调用的是父类里的方法,那么super.getClass()跟new Date().getClass()应该是一样的吧?麻烦再解释下
作者: 袁梦希    时间: 2013-4-28 17:30
学习了   ~~~~~
作者: 金辉    时间: 2013-4-28 17:53
super不是超类的引用,而是表示在子类中调用父类的方法或属性而已
class B extends A{
       public void print(){
              System.out.println(super.getClass());//调用A类中的getclass()方法,A是Object的子类,A中的getClass()是Object中的,运行时期的实例是B类,所以输出的依然是Class B
              System.out.println(this.getClass()); //调用B类中的getclass()方法,此方法从A继承的,A从Object继承的,运行时期的实例是B类,所以输出的是Class B

              /*上面的super.getClass()和this.getClass()都是调用的Object中的getClass(),而super.getClass()和this.getClass()都是通过实例化B类,调用print(),从而调用这两个方法,运行时期的类都是B,Object中的getClass()返回的是运行时期的类 名,所以输出都是Class B
              */
作者: cowthan    时间: 2013-4-28 19:51
这个问题还真值得好好考虑考虑,super到底是个什么东西
1、不能认为super是子类的成员,否则就相当于:
class Test extends Date{
    private Date super;     //那这样调用super.getClass()就得到Date的Class了
}
2、所以super我觉得就应该单纯的看作是支持面向对象的继承机制的某种单独的存在,
super存在的意义就是把子类和父类连起来,让子类能访问父类的信息。

super存在的意义就是解决在子类中访问父类的信息的途径:
可以举一个例子:

  1. class A{

  2.     private int oneAttr;
  3.     protected void oneFunction(){  
  4.         this.oneAttr = 100;
  5.     }
  6. }

  7. class B extends A{
  8.       private int anotherAttr;
  9.       protected void oneFunction(){  
  10.             /*
  11.                 在这里想初始化父类A的oneAttr怎么办?
  12.                  ——没办法直接访问父类A的私有属性啊
  13.                  ——调用父类oneFunction(),既然B继承了A的oneFunction(),那在这里调用this.oneFunction()吧,但是不行啊,
  14.                  因为这是调用B本身的oneFunction(),不但没法初始化oneAttr,还会造成无穷递归
  15.                  ——所以面向对象的设计者就得考虑提供一种机制让你能够调用父类的oneFunction(),于是苦思冥想之后,super就
  16.                  被发明出来了
  17.              */
  18.                super.oneFunction();
  19.                this.anotherAttr = 200;
  20.      }
  21. }
复制代码
不知道我的理解是不是官方理解,
欢迎大家踊跃对此问题展开讨论啊!
还绕不?楼主

作者: 黄玉昆    时间: 2013-4-30 23:40
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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