【Java笔记】11 类变量和类方法
一、类变量
1.1 什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象访问时,取到的都是相同值,任何一个该类的对象去修改时,修改的也是同一个变量。
1.2 定义类变量
访问修饰符 static 数据类型 变量名;[推荐]
static 访问修饰符 数据类型 变量名;
1.3 访问类变量
类名.类变量名 或 对象名.类变量名
静态变量的访问修饰符的访问权限和范围和普通属性是一样的。
public class VisticStatic {public static void main(String[] args) {//类名.类变量名//类变量随着类的加载而创建,没有创建对象实例也可以访问System.out.println(A.name);A a = new A();//对象名.类变量名System.out.println("a.name=" + a.name);}}class A{// 类变量的访问必须遵守访问权限public static String name = "lll"; // 类变量private int num = 10; // 普通属性/普通成员变量/非静态属性/非静态成员变量/实例变量}
1.4 类变量的内存布局

有不同说法 可能由于jdk版本不同 在堆或者静态域
但 static变量是对象共享,在类加载时就生成了
1.5 注意事项
- 什么时候使用类变量 需要让某个类的所有对象共享一个变量时
- 类变量与实例变量(普通属性)区别 类变量是该类的所有对象共享的,实例变量是每个对象独享的。
- 加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
- 实例变量不能通过类名.类变量名访问
- 类变量的生命周期随类的加载开始,随类消亡而销毁
public class StaticDetail {public static void main(String[] args) {B b = new B();// System.out.println(B.n1);//没static,不能用类名.变量名表示System.out.println(B.n2);//静态变量是类加载的时候,就创建了,没有创建对象实例也可以通过类名.类变量名来访问System.out.println(C.address);}}class B{public int n1 = 100;public static int n2 = 200;}class C{public static String address = "xxx";}
二、类方法
2.1
类方法也叫静态方法
访问修饰符 static 数据返回类型 方法名(){} 【推荐】
static 访问修饰符 数据返回类型 方法名(){}
2.2 类方法的调用
类名.类方法名 或 对象名.类方法名
public class StaticMethod {public static void main(String[] args) {Stu tom = new Stu("tom");//tom.payFee(100);或Stu.payFee(100);Stu mary = new Stu("mary");//mary.payFee(200);或Stu.payFee(200);Stu.showFee(); // 300}}class Stu {private String name;//普通成员//静态变量累加学生学费private static double fee = 0;public Stu(String name) {this.name = name;}//static修饰后,该方法是静态方法,静态方法可以访问静态属性/变量public static void payFee(double fee) {Stu.fee += fee;}public static void showFee() {System.out.println("总学费有:" + Stu.fee);}}
2.3 使用场景
方法中不涉及任何和对象相关的成员,如工具类中的方法 Math类,开方 Math.sqrt(9);
2.4 注意事项
类方法和普通方法都是随类的加载而加载,将结构信息存储在方法区
类方法中无this的参数,普通方法中隐含着this的参数
类方法不允许使用和对象有关的关键字,如this和super
类方法中只能访问静态变量或静态方法,普通成员方法,既可以访问静态成员也可以访问非静态成员(成员即变量和方法)。
