1、static概念
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?
可以的,我们可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员。
2、static特点
(1)被static修饰的成员变量属于类,不属于这个类的某个对象(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量);
1 class Demo { 2 public static int num = 100; 3 } 4 5 class Test { 6 public static void main(String[] args) { 7 Demo d1 = new Demo(); 8 Demo d2 = new Demo(); 9 d1.num = 200; 10 System.out.println(d1.num); //结果为200 11 System.out.println(d2.num); //结果为200 12 } 13 }
(2)被static修饰的成员可以并且建议通过类名直接访问。
访问静态成员的格式:
类名.静态成员变量名 类名.静态成员方法名(参数) 对象名.静态成员变量名 ------不建议使用该方式,会出现警告 对象名.静态成员方法名(参数) ------不建议使用该方式,会出现警告
代码演示:
1 class Demo { 2 //静态成员变量 3 public static int num = 100; 4 //静态方法 5 public static void method(){ 6 System.out.println("静态方法"); 7 } 8 } 9 class Test { 10 public static void main(String[] args) { 11 System.out.println(Demo.num); 12 Demo.method(); 13 } 14 }
3、static注意事项
(1) 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区;
1 class Demo { 2 //成员变量 3 public int num = 100; 4 //静态方法 5 public static void method(){ 6 //this.num; 不能使用this/super。 7 System.out.println(this.num); 8 } 9 }
(2)同一个类中,静态成员只能访问静态成员;
1 class Demo { 2 //成员变量 3 public int num = 100; 4 //静态成员变量 5 public static int count = 200; 6 //静态方法 7 public static void method(){ 8 //System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法 9 System.out.println(count); 10 } 11 }
(3)main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中。
4、定义静态常量
(1)在类中定义一个静态常量,通常使用public static final修饰的变量来完成定义。此时变量名用全部大写,多个单词使用下划线连接;
(2)定义格式:
public static final 数据类型 变量名 = 值;
(3)代码演示:
1 class My{ 2 public static final String MY_NAME = "Java"; 3 public static void method(){ 4 System.out.println("一个静态方法"); 5 } 6 }
(4)当我们想使用类的静态成员时,不需要创建对象,直接使用类名来访问即可;
System.out.println(My.MY_NAME); //打印Java My.method(); // 调用一个静态方法
(5)注意
接口中的每个成员变量都默认使用public static final修饰;
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问;
interface Inter { public static final int COUNT = 100; }
访问接口中的静态变量
Inter.COUNT
接口中的每个成员变量都默认使用public static final修饰