main()方法为啥必须要public static void类型的??java中的静态成员
2011-04-03 12:30
417 查看
1.main()方法
在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void类型的,方法必须是接受一个字符串数组的参数等。
因为main()方法是由Java虚拟机调用的,所以必须是public,虚拟机调用的main()方法的时候,不需要产生任何对象,所以main()方法声明为static,且不需要返回值,所以必须声明为void,最终格式如下所示: public void main(String[] args)
在学习java中的main()方法之前,先看下面一段程序:
现在对上面的程序做一个简单的解释,Demo类中有main()方法,说明这是个Java应用程序,通过JVM直接启动运行的程序。main()方法中有一个输入参数,类型为String[],这个也是java中的规范,至于字符串的名字,这个可以自己设定,根据习惯,这个字符串数组的名字一般和Sun Java规范范例中的main()的参数名保持一致,取名为args。而且main()方法不准抛出异常,因此main()方法中的异常要么不处理,要么不处理,不能继续抛出。
main()方法中的字符串参数数组的作用是结婚搜命令行输入参数,命令行的参数之间用空格隔开。下面为上述程序段运行结果:
2.java中静态成员
通常情况下,方法必须通过它的类对象访问。但是如果该方法的使用完全对立于该类的任何对象,可以利用static关键字。通过该关键字可以创建一个方法或者变量,它能够被自己使用,而不用引用特定的示例。在方法或变量前面加上static即可。
如果一个方法被声明为static,它就能够在它的类任何对象创建之前被访问,而不必引用任何对象。下面示例中,演示静态方法和静态变量的使用。
运行结果:
在Java中没有一个直接的修饰符来实现常量,而是通过静态成员变量的方式来实现的,如: public static final int X=20; static public final int Y=30; static表示属于类,不必创建对象可以使用,因为常量应该不依赖任何对象,final表示值不能改变。一般用作常量的静态成员变量访问权限设置为public,因为常量应该允许所有的类或对象访问。
对于非静态成员变量,系统不会为其分配默认值,必须在构造器完成之前对其初始化。对于静态成员变量,系统也不会为其分配默认值,也要求开发人员必须对其进行初始化。但是静态变量属于类,是不能等到构造器运行在初始化的,因为类加载完成之后其值必须可以使用。在Java中,静态成员变量的的初始化要求在静态语句块结束之前必须完成。即Java中静态成员变量的初始化时机有两个,在声明的同时进行初始化或者在静态语句块中进行初始化。
如果将第11到15行注释掉,在次进行编译,就会报“可能尚未初始化变量const2”错误。
对于静态成员的访问,可以直接使用"<类名>.<静态成员名>"的语法调用静态成员变量。
a.静态方法访问非静态成员
编译代码,运行结果:
从上图可以看出,编译报“无法从静态上下文中引用非静态变量 var”错,这是因为main()方法自身便是一个静态方法,而var是非静态成员。因为静态成员不依赖于该类的任何对象,所以当其所在的类加载成功后,就可以被访问了,此时对象并不一定存在,非静态成员自然也不一定存在,静态成员的生命周期比非静态成员的长。即使访问时存在非静态成员,静态方法也不一定知道访问的是哪一个对象的成员,因为静态方法属于类,非静态成员属于对象,所以静态方法将不知道关于其所属类对象的消息。而静态方法访问静态成员时,自然是任何时候都没有问题,静态成员都属于类,只要类存在,静态成员都存在。同样的道理,在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行。因为this代表指向自己对象的引用,而静态方法是属于类的,不属于对象,其成功加载后,对象还不一定存在,也不知道this指的是哪一个对象。
编译后,运行结果:
b.非静态方法访问静态成员
非静态方法访问静态成员的时候,规则比较简单。非静态成员的生命周期被静态成员生命周期包含,因此当非静态成员存在的时候,静态成员绝对存在。故非静态方法在任何时候都可以访问静态成员。
在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void类型的,方法必须是接受一个字符串数组的参数等。
因为main()方法是由Java虚拟机调用的,所以必须是public,虚拟机调用的main()方法的时候,不需要产生任何对象,所以main()方法声明为static,且不需要返回值,所以必须声明为void,最终格式如下所示: public void main(String[] args)
在学习java中的main()方法之前,先看下面一段程序:
public class Demo { public static void main(String[] args) { System.out.println("打印main方法的输入参数"); for(int i=0;i<args.length;i++){ System.out.println(args[i]); } } }
现在对上面的程序做一个简单的解释,Demo类中有main()方法,说明这是个Java应用程序,通过JVM直接启动运行的程序。main()方法中有一个输入参数,类型为String[],这个也是java中的规范,至于字符串的名字,这个可以自己设定,根据习惯,这个字符串数组的名字一般和Sun Java规范范例中的main()的参数名保持一致,取名为args。而且main()方法不准抛出异常,因此main()方法中的异常要么不处理,要么不处理,不能继续抛出。
main()方法中的字符串参数数组的作用是结婚搜命令行输入参数,命令行的参数之间用空格隔开。下面为上述程序段运行结果:
2.java中静态成员
通常情况下,方法必须通过它的类对象访问。但是如果该方法的使用完全对立于该类的任何对象,可以利用static关键字。通过该关键字可以创建一个方法或者变量,它能够被自己使用,而不用引用特定的示例。在方法或变量前面加上static即可。
如果一个方法被声明为static,它就能够在它的类任何对象创建之前被访问,而不必引用任何对象。下面示例中,演示静态方法和静态变量的使用。
public class StaticDemo1 { //s为静态变量 public static String s="我是静态变量"; //静态方法 public static void printInfo(){ System.out.println("我是静态方法"); } public static void main(String[] args){ //调用StaticDemo1中的printInfo方法时,不需要创建新的 //StaticDemo1对象,直接访问即可 StaticDemo1.printInfo(); //直接调用StaticDemo1中的s变量时,直接访问即可 System.out.println(StaticDemo1.s); } }
运行结果:
在Java中没有一个直接的修饰符来实现常量,而是通过静态成员变量的方式来实现的,如: public static final int X=20; static public final int Y=30; static表示属于类,不必创建对象可以使用,因为常量应该不依赖任何对象,final表示值不能改变。一般用作常量的静态成员变量访问权限设置为public,因为常量应该允许所有的类或对象访问。
对于非静态成员变量,系统不会为其分配默认值,必须在构造器完成之前对其初始化。对于静态成员变量,系统也不会为其分配默认值,也要求开发人员必须对其进行初始化。但是静态变量属于类,是不能等到构造器运行在初始化的,因为类加载完成之后其值必须可以使用。在Java中,静态成员变量的的初始化要求在静态语句块结束之前必须完成。即Java中静态成员变量的初始化时机有两个,在声明的同时进行初始化或者在静态语句块中进行初始化。
//功能:初始化静态成员变量介绍 public class StaticDemo2 { //声明并初始化常量const1 public static final int const1=1111; //声明常量const2 public static final int const2; /********************************** 下面为静态语句块,是静态成员的一种。在此静态语句中初始化了常量 const2.静态语句块在类加载时执行一次,可以将对类进行初始化的代码写在其中。 ***********************************/ static { //初始化常量const2 const2=2222; } public static void main(String [] args){ System.out.println("两个常量的值分别为const1="+const1+",const2="+const2); } }
如果将第11到15行注释掉,在次进行编译,就会报“可能尚未初始化变量const2”错误。
对于静态成员的访问,可以直接使用"<类名>.<静态成员名>"的语法调用静态成员变量。
a.静态方法访问非静态成员
public class StaticDemo3 { int var=13; public static void main(String[] args){ System.out.println("成员变量var的值为:"+var); } }
编译代码,运行结果:
从上图可以看出,编译报“无法从静态上下文中引用非静态变量 var”错,这是因为main()方法自身便是一个静态方法,而var是非静态成员。因为静态成员不依赖于该类的任何对象,所以当其所在的类加载成功后,就可以被访问了,此时对象并不一定存在,非静态成员自然也不一定存在,静态成员的生命周期比非静态成员的长。即使访问时存在非静态成员,静态方法也不一定知道访问的是哪一个对象的成员,因为静态方法属于类,非静态成员属于对象,所以静态方法将不知道关于其所属类对象的消息。而静态方法访问静态成员时,自然是任何时候都没有问题,静态成员都属于类,只要类存在,静态成员都存在。同样的道理,在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行。因为this代表指向自己对象的引用,而静态方法是属于类的,不属于对象,其成功加载后,对象还不一定存在,也不知道this指的是哪一个对象。
public class StaticDemo4 { static int x=100; public static void main(String[] args){ int y=this.x; } }
编译后,运行结果:
b.非静态方法访问静态成员
非静态方法访问静态成员的时候,规则比较简单。非静态成员的生命周期被静态成员生命周期包含,因此当非静态成员存在的时候,静态成员绝对存在。故非静态方法在任何时候都可以访问静态成员。
相关文章推荐
- java 的main()方法为啥必须要public static void类型的??java中的静态成员
- main()方法为啥必须要public static void类型的??java中的静态成员
- main()方法为啥必须要public static void类型的??java中的静态成员
- main()方法为啥必须要public static void类型的??java中的静态成员
- 带有public static void main方法的类,其中的成员变量必须是static的,否则main方法没法调用。除非是main里的局部变量。因为main方法就是static的啊。
- 黑马程序员--03.Java面向对象--02.【static关键字】【main方法】【静态成员】
- 创建一个Test类,包含有一个public权限的int型成员变量与一个char类型的成员变量,观察在main方法中的初始值
- Java 中,为什么在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?
- 创建一个Test类,包含有一个public权限的int型成员变量与一个char类型的成员变量,观察在main方法中的初始值
- 在java中为什么main方法必须是静态的解释
- java类中的main()方法必须是public static void 和有参数的
- 类中找不到main方法请将main方法定义为public static void main. 否则 JavaFX 应用程序类必须扩展javafx.application.Application
- Java的main方法为什么是public static的?
- Java接口中的成员变量为什么必须是public static final?
- 【Java编程思想第4版错误记录】Collections.addAll()静态方法与Collection.addAll()成员方法
- Android JNI反射调用Java构造方法、成员方法和静态方法
- Java中子类的基本继承方法,子类通过继承父类public方法,访问父类private成员
- java的静态成员、静态方法的注意事项!
- Java接口中的成员变量为什么必须是public static final?
- 单元测试时候使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且应采用一个TestContext类型的参数报错的解决办法