static静态,可以修饰成员变量、成员方法
## 一、static修饰成员变量
1、静态变量(类变量):有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
2、实例变量(对象的变量):无static修饰,属于每个对象,每个对象的实例变量各不相同
package org.example.staticfield;
public class Student {
//静态变量,有static修饰,属于类,只加载一份,可以被类和类的全部对象共享访问
static String name;
//实例变量,没有static修饰,属于对象,每个对象都有一份
int age;
}
package org.example.staticfield;
public class Test {
public static void main(String[] args) {
//1、类名.静态变量(推荐)
Student.name = "袁华";
System.out.println(Student.name);
//2、对象名.静态变量(不推荐)
Student s1 = new Student();
s1.name="马冬梅";
s1.age = 18;
System.out.println(s1.name);
System.out.println(s1.age);
Student s2 = new Student();
s2.name="秋雅";
s2.age = 19;
System.out.println(s2.name);
System.out.println(s2.age);
System.out.println(Student.name);
}
}
在以上案例中,name是静态变量,属于类,所有对象可以共享,但只有一份,因此最后程序执行结果是静态变量name的值被修改为秋雅。静态变量的运行原理如下图:
3、静态变量的应用场景:
如果某个数据只需要一份,且希望能被共享、访问、修改,则使用静态变量。
例如:要记住创建了多少类的对象。
package org.example.staticfield;
public class User {
static int count = 0;
//使用构造器(创建对象时自动执行),可以用来记录一共有多少个此类的对象
public User() {
count++;
}
}
package org.example.staticfield;
public class Test2 {
public static void main(String[] args) {
new User();
new User();
new User();
new User();
new User();
System.out.println("User类一共创建了"+User.count+"个对象");
}
}
运行结果如下:
二、static修饰方法
1、静态方法(类方法):有static修饰,属于类,可以直接用类名访问,也可以用对象访问
2、实例方法(对象的方法):无static修饰,属于对象,只能用对象名访问
package org.example.staticmethod;
public class Student {
private double score;
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
// 静态方法:有static修饰,为类所持有
public static void printHelloworld() {
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
//System.out.println(score);// 报错,静态方法中不能直接访问成员变量
}
//实例方法:没有static修饰,为对象所持有
public void socrePass(){
if (this.score >= 60){
System.out.println("通过");
}else {
System.out.println("未通过");
}
}
}
package org.example.staticmethod;
public class Test {
public static void main(String[] args) {
//1、类名.静态方法(推荐)
Student.printHelloworld();
System.out.println("----------------");
//2、对象名.静态方法(不推荐)
Student s = new Student();
s.printHelloworld();
System.out.println("----------------");
//3、对象名.实例方法
s.setScore(55);
s.socrePass();
}
}
主方法中,可以直接用类名.静态方法来访问静态方法,而不需要创建类的对象来调用方法,因此静态方法用作设计某些功能,方便直接使用。
3、静态方法的应用场景
做工具类:工具类中都是一些静态方法,每个方法用来完成一个功能,以便供给开发人员直接使用。工具类中使用静态方法比较方便,直接用类名调用即可。
注意:工具类没有创建对象的必要,建议将工具类的构造器私有,就不能创建工具类的对象了。
以开发一个验证码程序为例:
package org.example.staticmethod;
public class VerifyCodeUtil {
private VerifyCodeUtil() {}
public static String generateVerifyCode(int length) {
//1、定义一个变量,接收验证码
String verifyCode = "";
//2、写一个循环,循环次数为指定位数
for (int i = 0; i < length; i++) {
//i是3,0,1,2,3
//定义一个随机数,为当前位置指定数字或者大写字母或者小写字母,数字是1,小写字母是2,大写字母是3
int random = (int) (Math.random() * 3 + 1);//1,2,3
switch (random) {
case 1:
//当随机数为1时,当前位置是数字
verifyCode += (int) (Math.random() * 10);
break;
case 2:
//当随机数为2时,当前位置是小写字母
verifyCode += (char) (Math.random() * 26 + 'a');
break;
case 3:
//当随机数为3时,当前位置是大写字母
verifyCode += (char) (Math.random() * 26 + 'A');
break;
}
}
return verifyCode;
}
}
这是一个验证码工具类,可以直接用
package org.example.staticmethod;
public class Test2 {
public static void main(String[] args) {
System.out.println(VerifyCodeUtil.generateVerifyCode(4));
}
}
来访问,可以提高代码的复用性,不重复书写验证码程序。
4、static关键字的一些注意事项:
package org.example.staticmethod;
public class Test3 {
//静态变量
public static int count =100;
//静态方法
public static void printHelloWorld()
{
System.out.println("hello world");
}
//实例变量:属于对象的
public String name;
//实例方法
public void run(){
}
public static void main(String[] args) {
//目的:搞清楚静态方法、实例方法访问的几点注意事项
}
//1、静态方法可以直接访问静态成员,不可以直接访问实例成员
public static void print(){
System.out.println(count);
printHelloWorld();
//System.out.println(name);//报错,静态方法不能直接访问实例成员
Test3 t = new Test3();
System.out.println(t.name);//静态方法可以间接访问实例成员
//run();//报错
//System.out.println(this);//报错。this代表的是对象
}
//2、实例方法既可以直接访问静态成员,也可以直接访问实例成员
public void print2(){
System.out.println(count);
printHelloWorld();
System.out.println(name);
run();
System.out.println(this);
}
//3、实例方法中国可以出现this关键字,静态方法中不可以出现this关键字
}
标签:01,Java,System,static,println,静态方法,public,out
From: https://blog.csdn.net/ddshs/article/details/144834828