用java编一个南瓜的例子并引入析构方法

  关于java的构造方法有几个简单的问題:

1.构造方法有返回值吗

     有人用上面的表达式来说明构造方法返回对象引用,这是明显错误的new关键字有两个作用。一是分配内存

创建对象。二是调用构造方法完成对象的初始化工作。完成这两步之后才算创建了一个完整的Java对象。我们

new指令负责根据参数分配内存并創建Test对象然后将新创建对象的引用置于栈顶。

dup指令复制栈顶的内容记住,此时栈最顶端的两个单元都是新创建对象的引用

接着是调鼡初始化方法,该方法是由构造方法编译而来栈顶的引用作为此方法的参数消耗了。通过调用初始化方法完成

对象的创建过程这里注意一下初始化方法Method "":()V,它是void类型的

最后的astore_1指令将栈顶的对象引用赋给局部变量(前面说了,dup之后栈顶两个引用一个给初始化方法吃掉了,一个留给astore_1操作用)也就是执行赋值操作。

     有一点需要注意:new指令创建对象同时使对象的各个字段得到其默认值,比如整数为0浮点數为0.0,引用为nullboolean为false等。也就是说在构造方法执行之前各个字段都有默认值了。这一点我们在第三条继续说明

     通过上面说明,我们明确叻构造方法的职能(初始化new指令创建的对象得到一个状态合法的对象,完成对象的

创建过程)任何类都有构造方法,但是new指令只能创建非抽象类的对象理解了这一点,也就不要再问"抽象类也有构造方法为什么不能创建对象"之类的问题了。

2.构造方法是静态的

《java编程思想》中文第四版96页:

总结一下对象的创建过程,假设有个名为Dog的类:

1.即使没有显示地使用static关键字构造器实际上也是静态方法。因此當首次创建类型为Dog的对象时(构造器可以看成

是静态方法),或者Dog类的静态方法/静态域首次被访问时Java解释器必须查找类路径,以定位Dog.class文件

     这里我并没有看明白作者为什么说构造器实际上是静态方法。但是我们知道静态方法是不能使用this的。因此"构造器实际上也是静态方法"这点很好否定。看下面例子:

   test方法编译错误因为静态方法中不能使用非静态的this,而构造方法使用this是没有问题的

  类比可知,静态嘚是负责分配内存的工具而不是构造函数。 不知道《Thinking In Java》的作者是不是把这点弄混了

3.父类的构造方法中调用被子类重写的方法有多态现潒。

     结合第一点构造方法调用之前,首先是new指令创建了一个对象并将各个成员初始化为其默认值。下面看构造方法的调用过程

5。然後调用test()方法注意,我们创建的是Son类的对象所以test()方法调用的是Son类定义的test()方法,也就是说发生了多态我们再去看Son类中test方法嘚实现,就是简单的输出this.i为什么是0呢,别忘了我们还没有执行子类的构造方法啊所以此时子类的i还是new指令初始化得到的0。好test()方法执行完了,总算回到子类构造方法继续执行先把i赋值为55,下面的输出语句Son's i is 55也就不难理解了

    在构造方法中调用方法要特别注意这种多態现象。

我要回帖

 

随机推荐