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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓海涛 中级黑马   /  2012-4-12 10:06  /  3003 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

记得前面学习this关键字的时候说,this关键字调用本类构造函数必须放在构造方法的首行
今天学习super关键字的时候也说,super关键字调用父类构造,必须放在子类构造方法的首行,
那么既然this和super都可以调用构造方法,那么就以为着这两个关键字是不能同时出现的,这样理解有问题吗?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

9 个回复

倒序浏览
构造函数中第一条语句可以调用父类的构造函数或本身的其它构造函数,但只能调用一个;
如果构造函数中没有显性的调用其它构造函数,编译器会在构造函数中默认加上super()。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
是的,一个构造函数中同时只能有一个this()或者super()存在。
子类的所有构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内的第一行都有一句隐式super();
       
当父类中没有空参数的构造函数时,子类必须手动通过super语句来指定访问父类中的构造函数。
       
当然,子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数访问父类中的构造函数。
       

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
嗯,是的因为在java规定中,在执行构造函数之前必须执行父类的构造函数,直到这个类是java.lang.Object类的构造函数。而函数的入口是子类构造函数,因此任何构造函数第一句必须是执行父类构造函数,如果没有添加super关键字,那么编译器会为该构造函数第一句添加一个super()语句。如果有super关键字显示的调用父类构造函数,就是用指定的那个父类构造函数,否则使用默认的无参数构造函数。也有一种情况例外,就是存在this关键字,调用本类其它构造函数,但是按照递归调用,最终还是会调用父类构造函数。如果你继承的父类没有无参数构造函数,那么你这个类第一句必须显示的调用super关键字来调用父类对应的有参数构造函数,否则不能通过编译。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
可以同时曾在,比如:
class A{
    int a = null;

}
回复 使用道具 举报
可以同时曾在,比如:
class A{
     int a = null;
     String att=null;
  class a(int a,String att){
       this.a=a;
      this.att=att;

}

}
class B  extends A{
     String b;
    class B(int a,String att,int b){
    super(a,b);
    this.b=b
}

}
回复 使用道具 举报
记得前面学习this关键字的时候说,this关键字调用本类构造函数必须放在构造方法的首行
今天学习super关键字的时候也说,super关键字调用父类构造,必须放在子类构造方法的首行,
那么既然this和super都可以调用构造方法,那么就以为着这两个关键字是不能同时出现的,这样理解有问题吗?

你可以这样理解,当使用this()调用本类构造函数时,那么被调用的本类构造函数一定会通过某种方式调用父类的构造函数,也就是说此时在子类的某一个构造函数中肯定会使用super()调用父类构造函数.
总结为:this和super可以同时存在于子类中,但是不可以同时存在于同一个子类构造函数中
回复 使用道具 举报
可以同时曾在,比如:
class A{
      int a = null;
      String att=null;
   class A(int a,String att){
        this.a=a;
       this.att=att;

}

}
class B  extends A{
      int a;
      String att;
       int b;
     class B(int a,String att,int b){
     super(a,b);
     this.b=b
}

}
回复 使用道具 举报
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
super()和this()均需放在构造方法内第一行。
尽管可以用this调用一个构造器,但却不能调用两个。
this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
this是一个指向本对象的指针, 然而super是一个Java关键字。
回复 使用道具 举报
黑马-刘昌文 发表于 2012-4-12 10:37
可以同时曾在,比如:
class A{
     int a = null;

你的 this.b=b 是给b初始化 这样是可以
楼主说的意思  是this(参数)  调用本类的构造方法    和super(参数)   调用父类的构造方法
  这两个是不能同时出现的  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马