继承中子类实例化过程

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

 

在子类实例化过程中,可以参考以下代码进行理解:

class Super

{

      int i = 0;

      public Super(String s)

      {

             i = 1;

}

class Demo extends Super

{

      public Demo(String s )

      {

             i = 2;

}

public static void main(String[] args)

{

      Demo d = new Demo("yes");

      System.out.println(d.i);

}

}

首先这个程序在编译时期就出错了。原因是父类中没有空参数的构造函数super();

子类Demo在继承父类Super时,其实例化过程随程序执行的步骤如下:(本例中父类的函数名就为Super,不要与下面的super语句弄混,不管父类的名称是什么,在子类构造函数的第一行中隐含的都是super()语句,与类名无关)

1, 进入main函数后,new Demo(“yes”) 就回到上面的Demo类进行初始化,但在Demo构造函数中,第一行隐含着super()语句,也就是说要查看父类初始化,那么为什么子类在初始化过程中一定要访问父类中的构造函数呢?

因为在继承中父类中的数据子类是可以直接获取的,那么子类在建立对象时就需要先查看父类是如何对这些对象进行初始化的。

2, 如果上面的父类中有空参数的Super类构造函数或在子类中手动设置super语句就可以编译成功。这两种情况的实例化过程是:

(1)      父类中有空参数的构造函数

class Super

{

      int i = 0;

      Super( ){ }

      public Super(String s)

      {

             i = 1;

}

 

子类初始化先进入父类的空参数构造函数,i = 0,构造函数内无操作,然后进入子类构造函数进行初始化,i = 2,结果System.out.println(d.i);就输出2。(传入的yes并未对其进行操作)。

(2)      子类中有手动设置super语句指定要访问父类中的构造函数

class Demo extends Super

{

      public Demo(String s )

      {

             super("no");//手动设置语句

             i = 2;

}

}

当子类构造函数第一行手动设置super语句后,原来的隐含空参数的super()语句就被替代了,子类同样进入父类中有String参数的构造函数,进入之前同样的是i = 0; 进入后 i = 1;父类中初始化完后就子类自己初始化,i = 2;故输出结果一样还是2。其实子类构造函数的第一行也可以手动的设置this语句来访问本类中的构造函数,由于都要放在构造函数的第一行,所以显然不管是空参数的super语句还是手动设置的有目的参数的super语句亦或是手动的this语句只能存在一个。

当然,子类中的构造函数至少有一个会访问父类中的构造函数。


 

 

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值