书本第146页最下面的批注:
构造器也是static方法,尽管static关键字并没有显示地写出来。不知道哪位高手对于这句话有没有其他资料来支持,java的老爸也没有这么说
构造器也是static方法,尽管static关键字并没有显示地写出来。不知道哪位高手对于这句话有没有其他资料来支持,java的老爸也没有这么说
解决方案 »
- 一个关于String[] args的问题 进来看看
- 求解pdf转换tif方法
- 项目启动时报错:java.lang.ClassNotFoundException: org.apache.log4j.LogManager
- 关于异常处理的问题
- 怎么获得整首个的歌词!
- 大虾们帮我看看这个JPanel为什么显示出来
- 请教一个很简单的问题?
- 窗口布局(按钮)
- eclipse 和 websphere 区别大吗? 请高手指教
- getScreenSize()获取的屏幕分辨率与实际不符
- JAVA+MYSQL的库存余量判断,求思路~
- 问大家一下,既然有了可视化编程,学swt jframe 还用那么认真吗? 大家编gui时是都用可视化编程工具吗??
static方法里不能使用this,构造方法用一下this就ok了。
自己运行
javap -c java.lang.String | grep init
javap -c java.lang.String | grep static
就可以验证了。
A specific instance initialization method (§3.9) may have at most one of its ACC_PRIVATE, ACC_PROTECTED, and ACC_PUBLIC flags set and may also have its ACC_STRICT flag set, but may not have any of the other flags in Table 4.5 set.
但是在介绍invokespecial指令的时候,你会感觉它又像是static的
不过我认为当你new的时候应该就可以看出来了
2. 构造函数,用来初始化变量,只是附初值,并不包括分配内存;
3. this关键字,指向对象内存的一个指针;
4. static关键字,可以理解为是一个标识,没有static的变量,方法,实例对象可以引用到,如果加了的话只能通过类引用。对于Class a = new a(),这样的语句,实际执行的是就是开辟一段内存空间,然后对空间的变量附一个初值,new 后面的a指明开辟内存的大小,内存中变量的类型,后面的括号指明对变量的初值是什么,然后将this指向这块内存。ps:对于this(a,b)这样类似指针函数的功能,上面说明无法解释,希望高手来说明一下。
3.看上下文。非static方法和构造器中,用this访问成员时,可以这样理解。this()调用其他构造器例外,语法而已。
4.static的也可以通过实例引用。Class a = new A();看字节码的话是
0: new #2; //class A
3: dup
4: invokespecial #3; //Method "<init>":()V
7: astore_1new指令分配内存,得到的引用在栈顶,dup一份,栈顶上的引用作为构造器变体<init>方法的第一个参数this。<init>负责初始化。这里的new指令可以认为是static的,但说构造方法是static就扯了。
当然指令new并不同于语法中的new。如果学过C++,理解operator new的话就容易理解了,语言的new操作符导致operator new的调用,然后调用构造函数。而operator new是可重载的,是static的。
而构造函数是用于创建对象的,创建对象的方法成员会是属于对象自己的?而且可以想象,在对象被创建之前,构造方法肯定已经被加载到内存当中,这时候都没有对象的啊还有,你能想象一个对象拥有一份自己的构造方法么?而且一个对象被创建了,他还拥有构造函数干嘛呢?所以构造函数肯定是属于类的。但至于属于类的函数是不是就是static的 这个我到不是很清楚
静态方法的本意是类方法,是类层次上的东西,跟对象无关,只要调用静态方法,就会加载class,产生Class这种类对象,(当然,前提是还没有加载)
调用static限定的静态方法和构造方法都会加载class,构造方法多了一个附属产品(产生了对象)。
static限定的方法跟构造方法是两种不同类型的静态方法,所以说,使用上会有区别,但本质是相同的。
起码在java语言定义的范畴内,静态方法有起自己的定义。当然,你重写了定义,可以引伸出和java定义不同的结论来。
我翻译这两句的意思是:被声明为static的方法称为类方法。类方法不涉及特定的对象。
我觉得这里仅仅指明了static方法(静态方法)是一种类方法,当然,我说的“静态方法的本意是类方法”说法是错误的,(我不是要来为我的观点辩护。)
但是,从类方法这个层次上讲,static方法与构造方法应该是一样的。(它们都是类方法,是类层次上的东西,跟对象无关,我觉的THKJ的作者也应该是这个意思)。
还有,我觉得上面两段英文好像没有给声明为static的方法下一个定义,它只是说static方法是一种类方法。