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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

毕向东讲的super代表父类对象的引用  这句话是错的
this是当前对象的引用 这句话是对的  this是一个对象    但是super代表父类对象的引用 这句话肯定是错的  如果是引用 就是代表一个对象了   super其实是只是一个关键字  只是让子类的对象去找到父类的一些东西

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

15 个回复

倒序浏览
但是调用父类的一些东西,如果不是静态方法,是不是得用对象来调用呢?
是不就得是父类对象的一个引用来调用呢?
回复 使用道具 举报
leon_hm 发表于 2014-4-12 16:22
但是调用父类的一些东西,如果不是静态方法,是不是得用对象来调用呢?
是不就得是父类对象的一个引用来调 ...

不是 你没理解 super根本不是一个对象  你子类继承了父类的所有东西  那子类怎么使用从父类继承来的东西呢  那就是用super      但是super不是指父类的引用   更不是指父类的一个对象  所以毕向东那视频还是很误导人的
回复 使用道具 举报
super引用父类的成分{:2_32:}这样说就对了吧~~
也就是lz说的引用父类的一些东西~
回复 使用道具 举报
黑马帝提问的问题果然不一样;P
坐等合理的回复,共同进步。
回复 使用道具 举报
子类要使用父类方法或者父类成员时,因为java中在子类中调用父类方法会出现语法错误,所以可以用super来调用父类的方法。
super可以调用父类的方法,也可以访问父类的成员

评分

参与人数 1黑马币 +2 收起 理由
枫儿 + 2 赞一个!

查看全部评分

回复 使用道具 举报
。。super就是指对象;
子类继承父类,并不是子类中有了父类的备份。
而是子类创建对象时,用NEW关键字在堆内存中创建的空间中,有一个this开头的对象,和另一个以super开头的对象;如果你使用父类的东西this开头的对象中没有自动到super开头的对象中去找,找到后使用的就是super对象的内容。(所以多态的父类引用指向子类对象时,成员变量的取值为父类)

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
沙漠里的小鱼 发表于 2014-4-12 16:34
不是 你没理解 super根本不是一个对象  你子类继承了父类的所有东西  那子类怎么使用从父类继承来的东西 ...

在java中不用对象能调用其他类的非静态方法?
回复 使用道具 举报
唐宋元明清 发表于 2014-4-12 18:11
。。super就是指对象;
子类继承父类,并不是子类中有了父类的备份。
而是子类创建对象时,用NEW关键字在堆 ...

我不解释了 你自己认为super指对象就指对象吧    懒的解释了
回复 使用道具 举报
super 本身的确不是 对象
不信的话可以在子类构造函数里试试下边两句
  1.    System.out.println(super.equals(this) );
复制代码

这句话输出是ture;
  1.     System.out.println(this.equals(super) );
复制代码

这句话编译不通过,假设super是父类对象,那么super继承Object,则super可以作为equals的参数,而事实上编译器不接受super作为equals()的参数,这与假设矛盾,所以假设不成立,所以super不是对象的引用

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报 1 0

  1. public class T3 {
  2.     public void testT3(){
  3.         System.out.println("super t3");
  4.     }
  5. }

  6. class T3Child extends T3{
  7.    public  T3Child(){
  8.        System.out.println(super.equals(this) );
  9.        //System.out.println(this.equals(super) );
  10.    }
  11.     public void testT3(){
  12.         System.out.println("child t3");
  13.     }
  14. }

  15. class Main{
  16.     public static void main(String[] args) {
  17.         new T3Child();
  18.     }
  19. }
复制代码
回复 使用道具 举报
而且有一个十分有意思的现象 ,super的hashcode与this的的hashcode相同哦
回复 使用道具 举报
个人理解:
1、super的确不是对象的引用,它是一个关键字
2、一个子类被实例化时,内部只有一个对象引用,那就是this,但是实例化的子类对象包含了父类
的对象成分,他们是一个整体,不是两个对象,那么,既然是一个整体,就必须有一个指向该
整体中子类继承的父类成员的引用,JAVA用了super关键字,通过super.加成员名 来调用。
3、为提高代码的可读性,才有了super.method()或super.父类成员名
回复 使用道具 举报
周建岐 发表于 2014-4-13 19:10
而且有一个十分有意思的现象,super的hashcode与this的的hashcode相同哦

子类实例化时只有一个实体,只不过这个实体包含了父类的成分而已。所以,super.equals(this)是将super.equals()方法所在的实体与this 的哈希值对比,自身与自身对比。。。一个对象只有一个哈希值
回复 使用道具 举报
Royvan 发表于 2014-4-13 19:43
子类实例化时只有一个实体,只不过这个实体包含了父类的成分而已。所以,super.equals(this)是将super. ...

同意,很多问题只有实践才知道,不是老师说得就一定是对的
回复 使用道具 举报
其实楼上说得听清楚了,其实我们也可以用instance of 的关键字
  1.         public void print(){

  2.                 //编译通过,运行可以输出
  3.                 if(this instanceof Object){
  4.                         System.out.println("I'am Object");
  5.                 }  
  6.                 //编译无法通过,会报错
  7.                 if(super instanceof Object){
  8.                         System.out.println("I'am Object");
  9.                 }

  10.         }
复制代码


从上面也可知super不是对象了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马