static关键字 java

来源:互联网 发布:dota2和lol的区别 知乎 编辑:程序博客网 时间:2024/06/03 23:48

static最突出的特点是在没有创建对象的情况下来就可以调用方法或变量。被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,也可以编写static代码块来优化程序性能。下面对这些特性进行讲解:

1、静态变量

static变量也称作静态变量,静态变量和非静态变量的区别是:

静态变量被所有的对象所共享,在内存中只有一个副本,被所有的实例共享。

非静态变量是某个对象单独拥有,在创建对象的时候被初始化,各个对象拥有的非静态变量互不影响。

如下例:

class Student {static String schoolName;  // 定义静态变量schoolName}public class Example12 {public static void main(String[] args) {Student stu1 = new Student();     // 创建学生对象Student stu2 = new Student();Student.schoolName = "传智播客";// 为静态变量赋值System.out.println("我的学校是" + stu1.schoolName);// 打印第一个学生对象的学校System.out.println("我的学校是" + stu2.schoolName); // 打印第二个学生对象的学校}}

输出:

我的学校是传智播客
我的学校是传智播客

注意:static只能用于修饰成员变量,不能用于修饰局部变量,否则错误。如下面的代码是错误的

public class Student {public void speak() {  static int num=12;       //不能用于修饰局部变量,即使speak也定义为static}}

2、静态方法

被static修饰的方法称作作静态方法,不创建对象就可以调用静态方法,静态方法可以使用“类名.方法名的方式来访问”。

但也因为这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

class Person {public static void sayHello() { // 定义静态方法System.out.println("hello");}}class Example {public static void main(String[] args) {Person.sayHello();     // 调用静态方法,最后直接输出hello}}

3、静态代码块

static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,只会执行一次(只会在类第一次使用时才会被加载)也因此static关键字形成静态代码块可以优化程序性能。

class Person {static String country;static {    //一个静态代码块        country = "china";System.out.println("Person类中的静态代码");}}class Example2 {    static {  // 静态代码块         System.out.println("测试类静态代码");}public static void main(String[] args) {Person p1 = new Person();// 创建对象p1Person p2 = new Person();// 创建对象p2}}
结果:该方法中创建了两个对象,但在两次实例化的过程中,静态代码只执行了一次,这说明类在第一次使用时才会被加载