您当前的位置: 首页 >  郭梧悠

从一个程序看继承的有关细节及规则(学习马士兵视频的总结)

郭梧悠 发布时间:2010-07-03 23:36:00 ,浏览量:10

第一:子类的构造过程中必须调用其基类的构造方法

第二:如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类

无参数的构造方法

第三:如果子类构造方法中既没有显式调用基类的构造方法,而基类中有没有无参数的构造方法,则编译出错

 

package mashibing;

public class TextSupSub {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  SubClass sc1 = new SubClass();
  SubClass sc2 = new SubClass(400);

 }

}

class SuperClass {
 private int n;
 
 SuperClass() {
  System.out.println("SuperClass()");
  this.n = n;
 }
 
 SuperClass(int n) {
  System.out.println("SuperClass("+n+")");
 }
 
}

class SubClass extends SuperClass {
 private int n;
 
 SubClass(int n) {
  System.out.println("SubClass("+n+")");
 }
 
 SubClass() {
  super(300);//必须写到第一句
  System.out.println("SubClass()");
  
 }
}
 

首先看这个程序main中的SubClass sc1 = new SubClass();很显然其调用了子类SubClass中的SubClass()方法,

注意该方法的第一句就调用了父类SupClass的SupClass(int n)方法;这一点很好理解。但如果把super(300)给注释掉或者去掉,此时运行的结果第一句就是SuperClass(),也就是符合第二条规则。其实此时子类的 

SubClass() {
  super(300);//把这一句去掉
  System.out.println("SubClass()");
  
 }就相当于

 SubClass() {
  super();//调用了基类中无参数的构造方法
  System.out.println("SubClass()");
  
 }

如果去掉此句的同时把基类的SupClass()也给去掉,则就符合第三条规则了,运行一定出错。

同理分析可知子类中的这一方法: 
 SubClass(int n) {
  System.out.println("SubClass("+n+")");
 }
 
就等同于

 
 SubClass(int n) {

  SupClss();
  System.out.println("SubClass("+n+")");
 }
 

另外还有一个有意思的现象就是当把

SuperClass() {
  System.out.println("SuperClass()");

}

此句给去掉时子类中(就本程序而言)的SubClss(int n)方法肯定会报错,因为系统在父类中找不到没有参数的构造方法,

如果在该方法的第一句写super(n);(n代表一个整数)就不会错了。

 

也就是说:如果父类中没有无参数的构造方法,而且子类的构造方法中没有调用父类的其他(有参数的方法,那么就出错了)结合第三条不难理解。
 

关注
打赏
查看更多评论

郭梧悠

暂无认证

  • 10浏览

    0关注

    339博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录