文章目录
10.1 类变量和类方法
10.1.1 问题
一群小孩在玩堆雪人,不时有新的小孩加入,问:现在有多少人在玩?
10.1.2 传统方法
在main方法中定义一个变量count,每有一个小孩加入,count++
问题:
1. count是一个独立于对象的
2. 后续访问count很麻烦,没有使用到OOP
3. 引出 类变量/静态变量
10.1.3 类变量快速入门
public class ChildGame {
public static void main(String[] args) {
Child child1 = new Child("jack");
child1.join();
child1.count++;
Child child2 = new Child("tom");
child2.join();
child2.count++;
System.out.println("共有 " + Child.count + " 个小孩加入了游戏");
}
}
class Child {
private String name;
public static int count = 0;//类变量(静态变量),可以被Child类所有的对象实例共享
public Child(String name) {
this.name = name;
}
public void join() {
System.out.println(name + " 加入了游戏");
}
}
10.1.4 类变量内存布局
有的说在堆,有的说在方法区,和jdk版本有关。
但是不管在哪里,static变量时同一个类所有对象共享的;在类加载的时候就生成了
10.1.5 什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个类的对象去访问它时, 取到的都是相同的值,统一任何一个该类的对象去修改它时,修改的也是同一个变量。
10.1.6 定义类变量
访问修饰符 static 数据类型 变量名;(推荐)
static 访问修饰符 数据类型 变量名;
10.1.7 如何访问类变量
类名.类变量名(推荐)
对象名.类变量名
静态变量的访问修饰符的访问权限和范围 和 普通属性一样
10.1.8 类变量使用注意事项和细节
- 什么时候需要类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量 - 类变量 与 实例变量(普通属性)区别
类变量是共享的,实例变量是每个对象独享的 - static修饰,类名.类变量名 访问(实例变量不能通过该方法访问)
- 类变量是在类加载的时候就初始化了,即使没有创建对象,只有类加载了,就可以使用类变量
- 类变量的生命周期随类的加载开始,消亡销毁
10.1.9 类方法基本介绍
访问修饰符 static 数据返回类型 方法名(){ } 推荐
static 访问修饰符 数据返回类型 方法名(){ }
10.1.10 类方法的调用
类名.类方法名 推荐
对象名.类方法名
10.1.11 类方法应用案例
public class StaticMethod {
public static void main(String[] args) {
Stu tom = new Stu("tom");
Stu.payFee(100);//等价 tom.payFee(100);
Stu.jack = new Stu("jack");
Stu.pauFee(100);
Stu.showFee();//200
//若不希望创建实例,也可以调用方法,则做成静态方法即可,用于工具类,方便调用
System.out.println(MyTools.calSum(2.3, 4,5));
}
}
class MyTools {
public static double calSum(double n1, double n2) {
return n1 + n2;
}
}
class Stu {
private String name;
private static double fee = 0;
public Stu(String name) {
this.name = name;
}
public static void payFee(double fee) {
Stu.fee += fee;
}
public static void showFee() {
System.out.println("学费有: " + Stu.fee);
}
}
10.1.12 类方法经典使用场景
当方法中不实际到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
如:工具类中的方法 utils (Math类、Arrays类、Collection集合类)
10.1.13 类方法使用注意事项和细节讨论
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:
类方法中无this的参数;普通方法中隐含着this的参数 - 类方法可以通过类名或对象名调用
- 普通方法和对象有关,需要通过对象名调用,不能通过类名调用
- 类方法中不允许使用和对象有关的关键字,如this、super
- 类方法(静态方法)中只能访问静态变量 或 静态方法
- 普通成员方法,既可以访问 非静态成员,也可以访问 静态成员
10.2 理解main方法语法
10.2.1 main方法
public static void main(String[] args) {}
- main方法时虚拟机调用
- Java虚拟机需要调用类的main方法,所以该方法访问权限必须public
- Java虚拟机在执行main方法时不必创建对象,所以该方法是static
- 该方法接收String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数
10.2.2 特别提示
- 在main方法中,我们可以直接调用main方法所在类的静态方法或静态属性
- 但是不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
public class Main01 {
private int n1 = 10;
private void t1(){
}
public static void main(String[] args) {
Main01 main01 = new Main01();
main01.t1();
System.out