针对多个对象有共同的成员变量值的时候,Java就提供了一个关键字来修饰:static。
static关键字的概述
* 是一个修饰符。 * 一般用来修饰成员变量,成员方法以及代码块
* static修饰的成员变量和成员方法不再属于对象,而是属于类。可以被该类的所有对象共享。
可以对象名调用,也可以通过类名调用(推荐)
static的特点:
A:随着类的加载而加载
回想main方法。
B:优先于对象存在
C:被类的所有对象共享
举例:咱们班级的学生应该共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。(类变量)
举例: 饮水机(用静态修饰) 水杯(不能用静态修饰)
D:可以通过类名调用
其实它本身也可以通过对象名调用。 推荐使用类名调用。
静态修饰的内容一般我们称其为:与类相关的类成员
成员变量的分类
* 静态成员变量或类变量:被static修饰的成员变量 * 非静态成员变量或实例变量:没被static修饰的成员变量
静态成员变量和非静态成员变量的区别
语法的区别
静态成员变量:被static修饰的成员变量非静态成员变量:没被static修饰的成员变量
数量的区别
静态成员变量:在内存中只有一份,被类的所有对象共享。 非静态成员变量:每创建一个对象都会为该成员变量分配内存空间,每一个对象都有自己的一份,互不干扰。
访问方式的区别
静态成员变量:可以通过对象名访问,也可以通过类名访问(强烈推荐使用) 非静态成员变量:只能通过对象名方法。
生命周期的区别
静态成员变量:跟随类的加载而创建并初始化,跟随类的销毁而销毁。 非静态成员变量:跟随对象的创建而创建并初始化,跟随对象的销毁而销毁。
什么时候可以使用static修饰成员变量?
* 当该成员变量的值需要在该类的所有对象之间共享时,则应该定义为静态成员变量。
静态方法和非静态方法的区别
静态方法:可以通过对象名访问,可以通过类名调用(推荐使用)
非静态方法:只能通过对象名调用
静态方法的注意事项
静态方法中不能使用this和super关键字。
静态方法中不能访问非静态成员:非静态成员变量和非静态成员方法
非静态方法中可以访问静态成员:静态成员变量和静态成员方法。
什么时候应该将该方法定义为静态方法?
当该方法内部不需要访问任何的非静态成员:非静态成员变量和非静态成员方法,就可以考虑定义为静态方法。
定义工具类时,工具类中的方法一般都是静态方法。
static关键字注意事项
A:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加 载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法
静态方法: 成员变量:只能访问静态变量 成员方法:只能访问静态成员方法 非静态方法: 成员变量:可以是静态的,也可以是非静态的 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
简单记: 静态只能访问静态。 记住是只能
定义静态常量:
class Teacher { public int num = 10; public static int num2 = 20; public void show() { System.out.println(num); //隐含的告诉你访问的是成员变量 System.out.println(this.num); //明确的告诉你访问的是成员变量 System.out.println(num2); //function(); //function2(); } public static void method() { //无法从静态上下文中引用非静态 变量 num //System.out.println(num); System.out.println(num2); //无法从静态上下文中引用非静态 方法 function() //function(); function2(); } public void function() { } public static void function2() { } } class TeacherDemo { public static void main(String[] args) { //创建对象 Teacher t = new Teacher(); t.show(); System.out.println("------------"); t.method(); } }
1.请说出 static 可以修饰什么?
它可以修饰成员变量,还可以修饰成员方法以及代码块
2.请说出 static 关键字的特点 ?
A:随着类的加载而加载
回想main方法。
B:优先于对象存在
C:被类的所有对象共享
举例:咱们班级的学生应该共用同一个班级编号。
其实这个特点也是在告诉我们什么时候使用静态?
如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。(类变量)
举例: 饮水机(用静态修饰) 水杯(不能用静态修饰)
D:可以通过类名调用
其实它本身也可以通过对象名调用。 推荐使用类名调用。
3.请说出 static 修饰的成员如何使用 ?
类名.静态成员变量名类名.静态成员方法名(参数)对象名.静态成员变量名 ------不建议,出现警告对象名.静态成员方法名(参数) ------不建议,出现警告