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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Person{
  2. public static void main(String[] args){
  3.      new Object();
  4.    }
  5. }
复制代码
看了这段简单的代码,你有什么疑问吗?首先 主函数是静态的,而new Object()其实就是去调用Objec类中的空参数构造函数,那么本着静态只能调用静态的原则,是不是构造函数也是静态的呢?求大神解释,谢谢!!!!!!

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

6 个回复

倒序浏览
构造函数不能说动态静态吧,它又不是方法,楼主这里所说的动态静态的区别主要是"这个方法是否是由某个对象调用的"(也就是与某个对象有没有绑定关系,正是因为这个对象是程序中随时的动态的指定的所以这方法才被称为"动态方法"),而构造函数并没有与某个对象产生绑定关系,而是由虚拟机直接根据类的数据结构在堆内创建出来,所以从这个意义上讲你也可以把构造函数理解成是动态的。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
静态调用静态是指调用静态成员,new Object只不过产生一个局部变量,跟这个问题没有关系

没有说静态方法内不能定义变量吧
回复 使用道具 举报
本帖最后由 fantacyleo 于 2014-7-5 15:29 编辑

静态只能访问静态的完整说法应该是:
Person类中的静态方法如果要【直接】访问Person类中的成员,它只能直接访问Person类的静态成员,而不能直接访问Person类的非静态成员。
非静态方法中能【直接】访问类的成员是因为其参数列表中有一个隐式传入的this(JVM规范原文:The reference to this is passed implicitly by the method invocation instructions of the Java virtual machine used to invoke instance methods.)。因此如果Person类中声明了:
int age;
那么你在非静态方法中写age = 3;实际上是在写this.age=3。而静态方法的参数列表中则不含这个隐式传入的this,因而无法访问本类的非静态成员。

回到lz的问题:
1. new Object()是this.new Object()的缩写吗?显然不是!new是一个运算符,不属于任何对象。new运算符能不能写在那里,跟是否处于静态方法没有任何关系。
2. 构造函数是静态成员的吗?不是!首先,Java语言规范明确说了构造函数不是类的成员,不能被继承、覆盖、隐藏(Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.)其次,构造函数的参数列表中也隐含着一个this,你在构造函数中就可以使用这个this。因此构造函数虽不参与多态判定,但不能说是静态成员。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-7-5 15:13
静态只能访问静态的完整说法应该是:
Person类中的静态方法如果要【直接】访问Person类中的成员,它只能直 ...

jvm规范 你在哪找的
回复 使用道具 举报
jvm规范和 java语言规范
回复 使用道具 举报

http://docs.oracle.com/javase/specs/jls/se7/html/index.html http://docs.oracle.com/javase/specs/jvms/se7/html/
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马