✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】
有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。
问题:
举个栗子
package com.dingjiaxiong.static_;
/**
* ClassName: ChildGame
* date: 2022/9/3 15:14
*
* @author DingJiaxiong
*/
public class ChildGame {
public static void main(String[] args) {
Child child1 = new Child("孙悟空");
child1.join();
child1.count ++;
Child child2 = new Child("猪八戒");
child2.join();
child2.count ++;
Child child3 = new Child("唐僧");
child3.join();
child3.count ++;
Child child4 = new Child("沙悟净");
child4.join();
child4.count ++;
System.out.println("共有" + Child.count + "个小孩加入了游戏");
System.out.println(child1.count);
System.out.println(child2.count);
System.out.println(child3.count);
System.out.println(child4.count);
}
}
class Child{
private String name;
public static int count = 0;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(name + "加入了游戏...");
}
}
运行结果
【static变量是对象共享】
共识
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量。
任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。这个从前面的图也可看出来。
定义语法
访问修饰符 static 数据类型 变量名;【推荐】
static 访问修饰符 数据类型 变量名;
静态变量的访问修饰符的访问权限和范围和普通属性是一样的。
举个栗子
package com.dingjiaxiong.static_;
/**
* ClassName: VisitStatic
* date: 2022/9/3 16:01
*
* @author DingJiaxiong
*/
public class VisitStatic {
public static void main(String[] args) {
System.out.println(A.name);
A a = new A();
System.out.println(a.name);
}
}
class A{
public static String name = "韩老师666";
private int num = 10;
}
运行结果
什么时候需要用类变量
当需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):比如:定义学生类,统计所有学生共交多少钱。
类变量与实例变量(普通属性)区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的。
加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
类变量可以通过类名.类变量名或者对象名.类变量名来访问,但java设计者推荐使用类名.类变量名方式访问。【前提是满足访问修饰符的访问权限和范围】
实例变量不能通过类名.类变量名方式访问。
类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了。
类变量的生命周期是随类的加载开始,随着类消亡而销毁。
举个栗子
package com.dingjiaxiong.static_;
/**
* ClassName: StaticDetail
* date: 2022/9/3 16:07
*
* @author DingJiaxiong
*/
public class StaticDetail {
public static void main(String[] args) {
B b = new B();
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 = "北京";
}
运行结果
类方法也叫静态方法。
形式:
访问修饰符 static 数据返回类型 方法名(){} 【推荐】
static 访问修饰符 数据返回类型 方法名(){}
使用方式【前提是满足访问修饰符的访问权限…】
package com.dingjiaxiong.static_;
/**
* ClassName: StaticMethod
* date: 2022/9/3 16:16
*
* @author DingJiaxiong
*/
public class StaticMethod {
public static void main(String[] args) {
Stu tom = new Stu("Tom");
Stu.payFee(100);
Stu marry = new Stu("Marry");
Stu.payFee(200);
Stu.showFee();
System.out.println("9开平方的结果是 = " + Math.sqrt(9));
System.out.println(MyTools.calSum(10 ,30));
}
}
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);
}
}
运行结果
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样不需要创建对象就可以使用了,比如打印一维数组,冒泡排序,完成某个计算任务等。
【静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(必须遵守访问权限)】