第十二章 static关键字与main方法
提纲
- 12.1 static关键字
- 12.1.1 什么是static
- 12.1.2 static关键字的用途
- 12.1.3 static作用总结
- 12.2 类的主方法(main方法)
- 12.2.1 什么是类的主方法
- 12.2.2 语法
- 12.2.3 主方法的特性
- 12.2.4 main方法各关键字的解释
- 12.2.5 main()方法中字符串参数数组作用
12.1 static关键字
- 12.1.1 什么是static:
- static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以修饰静态static代码块。
- 被static修饰的成员变量和成员方法独立于该类的 任何对象 。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
- 12.1.2 static关键字的用途
- static变量
-
解释:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有 一个副本 ,
它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在 多个副本 ,各个对象拥有的副本 互不影响 。
**注意:**static成员变量的初始化顺序按照定义的顺序进行初始化。访问权限与四种访问权限效果相同。 -
语法:访问权限 + static + 变量类型 + 变量名
-
调用方法:类名.静态变量名
-
举例:
//创建Book类 public class Book{ public int page = 0;//在类中定义非静态变量 public static String name = "矛盾文集";//在类中定义赋予初始值的静态变量 public static int id = 0;//在类中定义未赋予初始值的静态变量 public Book() { id++; page++; } } //创建Test类,使用main方法测试 public class Test { public static void main(String[] args) { Book book1 = new Book(); Book book2 = new Book(); System.out.println("类名.静态变量名调用:"+Book.name); //不推荐使用,因为静态变量与对象无关,所以不必这样调用 System.out.println("对象名.静态变量名调用(不推荐):book1="+book1.name+",book2="+book2.name); Book.name = "矛盾散文集";//给静态变量赋值 System.out.println("名称修改后:"+Book.name); System.out.println("最后id为:直接调用id0="+Book.id+",book1="+book1.id+",book2="+book2.id); System.out.println("最后page为:book1="+book1.page+",book2="+book2.page); } } //执行结果 类名.静态变量名调用:矛盾文集 对象名.静态变量名调用(不推荐):book1=矛盾文集,book2=矛盾文集 名称修改后:矛盾散文集 最后id为:直接调用id0=2,book1=2,book2=2 最后page为:book1=1,book2=1
-
- static方法
-
解释:static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。**注意:**虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
-
语法:访问权限 + static + 返回值类型 + 方法名(参数1,参数2…){方法体}
-
调用方法:类名.静态方法名
-
举例:
//创建Book类 public class Book{ public int page = 0;//在类中定义非静态变量 public static String name = "矛盾文集";//在类中定义赋予初始值的静态变量 public static int id = 0;//在类中定义未赋予初始值的静态变量 public Book() { id++; page++; } //定义一个静态成员方法 public static void method1(){ //this.//错误,无法使用this //错误,静态成员方法中无法调用非静态成员变量和方法 //page = 2; //method2(); //错误,在Java中不能将局部变量声明为static //static int i = 0; //直接使用静态成员变量,可以直接写静态变量名, //也可以使用类名.静态变量名,即Book.id System.out.println("id="+id); } //定义一个非静态成员方法 public void method2(){ //非静态成员方法中可以调用静态成员方法和变量 id++; page++; name = "鲁迅散文";//或者使用Book.name="鲁迅散文" System.out.println("page="+page); method1();//或者使用Book.method1() } } //创建Test测试类进行测试 public class Test { public static void main(String[] args) { Book book1 = new Book(); Book book2 = new Book(); Book.method1();//调用静态成员方法method1() book1.method2();//调用非静态成员方法method2() book2.method2(); } } //执行结果 id=2 page=2 id=3 page=2 id=4
-
- static代码块
-
解释:static关键字还有一个比较关键的作用就是用来修饰静态代码块以优化程序性能。
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,
会按照static块的顺序来执行每个static块,并且只会执行一次。 -
语法:static{代码内容}
-
举例:
//创建一个 public class Person { static int a = 2; static int b = 3; static int c; static { c = a + b; System.out.println("第一个static运行了.....c="+c); } static { c = a * b; System.out.println("第二个static运行了.....c="+c); } static { a = 10; b = 20; c = b / a; System.out.println("第三个static运行了.....c="+c); } public void getC(){ System.out.println("最后c="+c); } } //创建测试类Test调用 public class Test { public static void main(String[] args) { Person person1 = new Person(); Person person2 = new Person(); person1.getC(); person2.getC(); } } //执行结果 第一个static运行了.....c=5 第二个static运行了.....c=6 第三个static运行了.....c=2 最后c=2 最后c=2
-
- static变量
- 12.1.3 static作用总结
- 放在成员变量中,称为:静态成员变量,静态变量被所有的对象所共享,在内存中只有 一个副本 ,它当且仅当在类初次加载时会被初始化。使用【类名.变量】名直接访问。
- 放在方法中,称为:静态方法。方法中,不能使用this关键字,不能使用非静态成员变量和非静态成员方法。使用【类名.方法名】进行访问。
- 放在代码块中,称为:静态代码块。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。当不加static时,代码块会在每次创建对象时调用一次。
12.2 类的主方法(main方法)
-
12.2.1 什么是类的主方法:主方法是类的入口点,它定义了程序从何处开始;主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。
-
12.2.2 语法:
//必须这么定义,这是Java的规范。 public static void main(String[] args){ //方法体 }
-
12.2.3 主方法的特性:
- 主方法是静态的
- 主方法没有返回值
- 主方法的形参为数组,其中args[0]~args[n]分别代表程序的第一个参数到第n个参数,可以使用args.length来获取参数的个数。
-
12.2.4 main方法各关键字的解释
- main()方法的声明为:public static void main(String args[])。必须这么定义,这是Java的规范。
- 当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。
- 由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。
- 对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。
- main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类型必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。
-
12.2.5 main()方法中字符串参数数组作用
- main()方法中字符串参数数组作用是接收命令行输入参数的,命令行的参数之间用空格隔开。
- 如何使用MyEclipse设置程序参数(操作过程见:命令行参数输入.docx)
-
创建一个类,如Test,编写main方法,然后点击右键Run As-Java Application/或者点击上方绿色按钮,必须运行一次。
-
Test类中点击右键Run As-Run Configurations/或者点击上方绿色按钮右边向下的小黑箭头,选择Run Configurations。
-
在出现的新版面中,左边代表已经运行过main方法的类名,找到刚刚的Test点击,在旁边有一个(x)=Arguments,代表设置参数,点击它。
-
在下面的文本框中有个叫Program Arguments,这个就是命令行,回车或者空格,代表分隔成两个字符串。
-
举例:
public class Test { //根据如上步骤设置好参数:123 abc 你好 public static void main(String[] args) { for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } } } //执行结果 123 abc 你好
-