一、static修饰成员变量
1.什么是static
叫静态,可以修饰成员变量、成员方法。
2.成员变量的分类
成员变量按照有无static修饰,分为两种:
1.类变量:有static修饰,属于类,与类一起加载一次,在内存里只有一份,会被类的所有对象共享。
//类名.类变量(推荐)
Student.name = "刘德华";
System.out.println(Student.name);//刘德华
//对象.类变量(不推荐)
Student s1 = new Student();
s1.name = "周星驰";
System.out.println(s1.name);//周星驰
Student s2 = new Student();
s2.name = "梁朝伟";
System.out.println(s1.name);//梁朝伟
System.out.println(s2.name);//梁朝伟
//有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
System.out.println(Student.name);//梁朝伟
2.实例变量(对象的变量):无static修饰,属于每个对象。
//对象.实例变量
s1.age = 10;
s2.age = 20;
System.out.println(s1.age);//10
System.out.println(s2.age);//20
3.类变量的应用场景
在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住
public class User{
//类变量
public static int number;
//构造器
public User(){
User.number++;
}
}
二、static修饰成员方法
1.成员方法的分类
1.类方法:有static修饰的成员方法,属于类。(main方法属于类方法)
类名.方法(推荐)、对象名.方法(不推荐)
public static void printHelloWorld(){
System.out.println("HelloWorld");
}
2.实例方法:无static修饰的成员方法,属于对象。
只能通过对象访问
public void printPass(){
……
}
2.类方法的应用场景
1.类方法应用场景
类方法可以用来设计工具类,如生成验证码。
2.工具类是什么,有什么好处
工具类中的方法都是类方法,每个类方法都是用来完成一个功能的。
提高了代码的复用性,调用方便,提高了开发效率
3.为什么工具类要用类方法,而不是实例方法
实例方法需要创建对象来调用,会浪费内存。
4.工具类定义时有什么要求
工具类不需要创建对象,建议将工具类的构造器私有化。
三、static注意事项
1.类方法中可以直接访问类的成员,不可以直接访问实例成员
2.实例方法中既可以直接访问类成员,也可以直接访问实例成员
3.实例方法中可以出现this关键字,类方法中不可以出现this关键字
四、static应用—代码块
1.代码块概述
代码块是类的五大成分之一(成员变量、构造器、方法、代码块、内部类)
2.代码块分类
静态代码块:
格式:static{ }
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
作用:完成类的初始化,例如:对类的变量的初始化赋值。
实例代码块:
格式:{ }
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。
五、static应用—单例设计模式
1.饿汉式单例:拿对象时,对象早就创建好了
写法:把类的构造器私有;定义一个类变量记住类的一个对象;定义一个类方法,返回对象。
public class A {
//2.定义一个类变量记住类的一个对象
private static A a = new A();
//1.私有构造器
private A(){
}
//3.定义一个类方法返回对象
public static A getObject(){
return a;
}
}
2.懒汉式单例:拿对象时,才开始创建对象
写法:把类的构造器私有;定义一个类用于存储对象;提供一个类方法,保证返回的时同一个对象
public class B {
//2.定义一个类变量,用于存储这个类的一个对象
private static B b;
//1.把类的构造器私有
private B(){
}
//3.定义一个类方法,这个方法要保证第一次调用时才创建一个对象,后面调用时都会用这同一个对象返回
public static B getInstance(){
if(b == null){
b = new B();
}
return b;
}
}