1.没有产生对象,因为main()方法是一个静态方法,它可以不依赖于实例存在。
2.由于第一个问题的答案,第二个问题已经解决。如果在Main()方法中创造实例,那么当然还是先执行main()方法。
3.这是Java语法规范。当然,main()方法也可以不定义成静态方法,但是那样Java虚拟机就无法自动执行main()方法,不过你可以自己调用。另外,上面的例子有一个错误,main方法必须有String []类型的参数,否则它不会被自动执行。
4.上面的例子好像编译不通过的。在static方法中没有this,因为static方法是不依赖于对象存在的。
5.对,Java的静态方法只能被静态方法覆盖。至于空间回收,应该是可以自动处理的,那是Java虚拟机的事。
2.由于第一个问题的答案,第二个问题已经解决。如果在Main()方法中创造实例,那么当然还是先执行main()方法。
3.这是Java语法规范。当然,main()方法也可以不定义成静态方法,但是那样Java虚拟机就无法自动执行main()方法,不过你可以自己调用。另外,上面的例子有一个错误,main方法必须有String []类型的参数,否则它不会被自动执行。
4.上面的例子好像编译不通过的。在static方法中没有this,因为static方法是不依赖于对象存在的。
5.对,Java的静态方法只能被静态方法覆盖。至于空间回收,应该是可以自动处理的,那是Java虚拟机的事。
那么:JAVA程序的一次执行,是不是可以理解为类的一次实例化呢?
含有main()方法的“主类”,它是否产生了一个对象?
没有产生这个对象,因为main方法是static的,不需要对象,但是加载这个类.
我的理解:一次Java运行就是一个进程,所以运行两次就是两个进程2.如果的确如上所述,按照“类在实例化时,最先执行构造方法”
疑问就来了:JAVA程序运行时,是先执行main()方法还是“主类”的构造方法?
(课本上有这么一句原话:“当程序执行时,解释器会找主方法,它是程序的入口点”
还有这样一句话:“每当创建一个对象,为新建对象开辟内存空间后,JAVA系统自动调用构
造方法.......)
它们是否互相矛盾?
没有对象生成所以不会执行构造函数,只是执行main方法.3.例程中,main()被定义为static
为什么每个main()都要定义为static?
入口函数规定的,这里不需要生成这个类的实例.4.假设构造方法比main()先执行,
那么例程还有一个错误:main()是static的,它里面调用了非static的数据a。
如果我把System.out.print(a);
改为System.out.print(this.a);
可以吗?java程序能自己调用自己吗?this指针可以引用含有main()方法的对象吗?
假设不成立,静态方法不可以调用非静态域.
5.静态方法不能被非静态方法重写,而只能被静态方法重写(overwrite)。(后半句对吗?为什么?)
假设对,如果重写之前的静态方法占用内存是10个空间,重写之后只要5个空间。
那么java会自动回收该内存空间?
对,这个问题根本不是问题,静态方法是属于类的,你用那个类就调用了那个方法.这个和占用空间有什么关系?
System.out.print(this.a);
如果a就是该类的域(属性)的话。。
这两句 就一样的语句
比如:javabean中的set get方法就会写成
...
private int id;
public void setId(int id)
{
this.id=id;//这里如果不用this引制的话 就是指 局部变量id 而不是 本类属性id
}
在main里初始化对象,为对象分配内存空间
main之所以声明为static,我想是因为当编译时声明为static的函数或者是字段类是的一部分
所以像楼上说的,能够自动加载,这也是靠java虚拟机
由static声明的,是类级别的对象,也就是说要调用或使用静态的变量或方法是不需要生成任何对象的,所以在调用main函数的时候,无任何对象生成,也没有该类的构造方法的调用,这也是任何程序中,main都必须为static的原因,要不,main就无法作为程序的入口了,,
你的例子的确会产生错误,因为a作为一个对象级别的变量必须要等到有该类的对象生成后,方能使用,而这儿的main为类方法,它的使用又不需要对象,这样就有了冲突,,
{
static
{
System.out.println("static");
}
Test()
{
System.out.println("instance");
}
public void hehe()
{
System.out.println("hehe");
}
public static void main(String[] args)
{
Test a=new Test();
a.hehe();
System.out.println("main");
}
}另外,在static中是不可以引用this,因为this是代表当前的类对象,而static是个静态类,不需要实例就可以引用,所以不能用this的。你明白static和实例的实质区别,就会明白上面的问题了。
1.OS课上我学到了:进程就是应用程序的一次执行,是它的一次实例。
那么:JAVA程序的一次执行,是不是可以理解为类的一次实例化呢?
含有main()方法的“主类”,它是否产生了一个对象?
A:没有产生对象,你说的"主类"通常情况下只有当被new操作符操作时才能产生一个新的对象,而main方法是static的,也就是说可以不通过一个实例而直接调用.2.由于第一个问题的答案,第二个问题已经解决。如果在Main()方法中创造实例,那么当然还是先执行main()方法。
3.这是Java语法规范。当然,main()方法也可以不定义成静态方法,但是那样Java虚拟机就无法自动执行main()方法,不过你可以自己调用。另外,上面的例子有一个错误,main方法必须有String []类型的参数,否则它不会被自动执行。
4.上面的例子好像编译不通过的。在static方法中没有this,因为static方法是不依赖于对象存在的。
5.对,Java的静态方法只能被静态方法覆盖。至于空间回收,应该是可以自动处理的,那是Java虚拟机的事。2.如果的确如上所述,按照“类在实例化时,最先执行构造方法”
疑问就来了:JAVA程序运行时,是先执行main()方法还是“主类”的构造方法?
(课本上有这么一句原话:“当程序执行时,解释器会找主方法,它是程序的入口点”
还有这样一句话:“每当创建一个对象,为新建对象开辟内存空间后,JAVA系统自动调用构
造方法.......)
它们是否互相矛盾?A:如果类中有static,基本类型数据,等等,在实例化时,并不是最先执行构造方法,他还有一个初始化的过程,一般是 基本数据->static->non-static->(有对象生成先执行constructor)->main方法(如果在main里产生对象一般先执行main方法)3.例程中,main()被定义为static
为什么每个main()都要定义为static?
A:在回答这个问题之前,先搞清楚this,this代表了引用当前类的reference,所谓的static就是表明当前的方法不能引用this,不需要产生对象就可以通过类名直接引用,而MAIN方法是一个类的入口,如果它不是static,你让程序怎么去执行main方法呢?
举个例子:
public class Employee
{
public static void main(String[] args)
{
}
public static void test()
{
System.out.println("This is a test");
} public void getSalary()}Employee e = new Employee();
e.getSalary(); //e就是所谓的this,而getSalary()是non-static函数
Employee.Test();
Employee.main(args); //4.假设构造方法比main()先执行,
那么例程还有一个错误:main()是static的,它里面调用了非static的数据a。
如果我把System.out.print(a);
改为System.out.print(this.a);
可以吗?java程序能自己调用自己吗?this指针可以引用含有main()方法的对象吗?
5.静态方法不能被非静态方法重写,而只能被静态方法重写(overwrite)。(后半句对吗?为什么?)
假设对,如果重写之前的静态方法占用内存是10个空间,重写之后只要5个空间。
那么java会自动回收该内存空间?
谢谢了~
1.OS课上我学到了:进程就是应用程序的一次执行,是它的一次实例。
那么:JAVA程序的一次执行,是不是可以理解为类的一次实例化呢?
含有main()方法的“主类”,它是否产生了一个对象?
A:没有产生对象,你说的"主类"通常情况下只有当被new操作符操作时才能产生一个新的对象,而main方法是static的,也就是说可以不通过一个实例而直接调用.
2.如果的确如上所述,按照“类在实例化时,最先执行构造方法”
疑问就来了:JAVA程序运行时,是先执行main()方法还是“主类”的构造方法?
(课本上有这么一句原话:“当程序执行时,解释器会找主方法,它是程序的入口点”
还有这样一句话:“每当创建一个对象,为新建对象开辟内存空间后,JAVA系统自动调用构
造方法.......)
它们是否互相矛盾?A:如果类中有static,基本类型数据,等等,在实例化时,并不是最先执行构造方法,他还有一个初始化的过程,一般是 基本数据->static->non-static->(有对象生成先执行constructor)->main方法(如果在main里产生对象一般先执行main方法)
3.例程中,main()被定义为static
为什么每个main()都要定义为static?
A:在回答这个问题之前,先搞清楚this,this代表了引用当前类的reference,所谓的static就是表明当前的方法不能引用this,不需要产生对象就可以通过类名直接引用,而MAIN方法是一个类的入口,如果它不是static,你让程序怎么去执行main方法呢?
举个例子:
public class Employee
{
public static void main(String[] args)
{
Employee.test(); //static方法可以直接调用
//!getSalary(); //在static方法中不能直接调用non-static函数
Employee e = new Employee(); //必须创建一个对象
e.getSalary(); //通过对象来调用non-static函数
}
public static void test()
{
System.out.println("This is a test");
} public void getSalary()
{
System.out.println("getSalary");
}}Employee e = new Employee();
e.getSalary(); //e就是所谓的this,而getSalary()是non-static函数
Employee.Test(); //可以直接调用
Employee.main(args); //这个也可以~
4.假设构造方法比main()先执行,
那么例程还有一个错误:main()是static的,它里面调用了非static的数据a。
如果我把System.out.print(a);
改为System.out.print(this.a);
可以吗?java程序能自己调用自己吗?this指针可以引用含有main()方法的对象吗?
A:同上,在static方法中不能直接调用non-static方法,static方法中没有所谓的this
5.静态方法不能被非静态方法重写,而只能被静态方法重写(overwrite)。(后半句对吗?为什么?)
假设对,如果重写之前的静态方法占用内存是10个空间,重写之后只要5个空间。
那么java会自动回收该内存空间?
A:后半句是对的。你的说法不对,不过我想能够理解你的意思,空间回收是JVM的事情。应该是可以的。
看了楼主的贴子,我对楼主有几个建议,
1。静下心来搞清楚类,对象,引用(reference),static方法,non-static方法的含义。
2.关于类,对象含义。可以看看JAVA书的相关章节。比如《CORE JAVA 6/E》的第4/5章(好象)
3。关于初始化可以看看《Thinking in java》第四章后半段。
4.还有,由于翻译的原因,句柄,引用等都是指同一个东西(reference),还有比如函数,方法,等还有比如实例方法。类方法等等都有不同的翻译。在看书的时候要注意一下
5。楼主好象对底层实现很感兴趣。这个是不错的。好象有C/C++经验的也经常会有这种感觉。楼主可以看看《Inside JVM 2/e》,我觉得对语法有了一定了解之后。适当花些精力的了解一下底层细节是很有好处的。楼主加油~