【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
类方法中只能访问静态变量或静态方法,普通成员方法,既可以访问静态成员也可以访问非静态成员(成员即变量和方法)。