(19条消息) 静态数据的初始化_Chen+7的博客-CSDN博客
上篇文章中我提到过程序会先创建static的两个静态对象,再去调用构造器,如果构造器也是static方法,那程序应该先输出Bowl(1),Table(),Bowl(2),代码可以看上面这篇文章,从这里就可以看出其实构造器不是静态方法。
在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
在Java语言规范第三版也提到了 :this只能在实例方法、实例初始值设定项或构造函数的主体中使用,或者用于类的实例变量的初始值设定项中。如果它出现在其他任何位置,则会发生编译时错误。
但是在java编程思想中提到了“即使没有显示地使用static关键字,构造器实际上也是静态方法“。所以我又对此产生了疑问。又从不同的角度去找这个问题的答案。
在java的语言规范中说,类中的静态方法和属性都可以被类名调用,但是想想看构造器真的可以被类名调用么?其次,在java实例构造器中有一个隐式的参数“this”,可以通过“this”访问到正在初始化的对象实例的所有实例成员。
实例构造器无法被隐藏或覆写,不参与多态,因而可以做静态绑定。从这个意义上可以认为实例构造器是“静态”的,但这种用法与Java语言定义的“静态方法”是两码事。
另外需要注意的是,Java语言中,实例构造器只能在new表达式(或别的构造器)中被调用,不能通过方法调用表达式来调用。new表达式作为一个整体保证了对象的创建与初始化是打包在一起进行的,不能分开进行;但实例构造器只负责对象初始化的部分,"创建对象"的部分是由new表达式本身保证的。
静态方法中不能使用this,而构造器中可以使用this关键字。this是指调用当前方法的对象,而静态方法不属于任何对象。
在静态方法中不可以调用非静态方法,但是在构造器中可以调用非静态方法。
参考博客:实例构造器是不是静态方法? - Script Ahead, Code Behind - ITeye博客



