目录
1.1 static修饰成员变量
Java中的成员变量按照有无static修饰分为两种: 类变量 , 实例变量
类变量 : 有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享.
实例变量 (对象的变量) : 无static修饰, 属于每个对象的.
由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量
实例变量是属于对象的,需要通过对象才能调用:对象.实例变量
下面是代码演示:
1.2 static修饰成员变量的应用场景
如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。
我们看一个案例
需求:系统启动后,要求用于类可以记住自己创建了多少个用户对象。
-
第一步:先定义一个
User
类,在用户类中定义一个static修饰的变量,用来表示在线人数;
public class User {
//定义一个number变量,用来记录创建了多少个对象
public static int count ;
public User() {
User.count++;
}
}
-
第二步:再写一个测试类,再测试类中创建3个User对象,再打印number的值,观察number的值是否再自增。
public class Test{
public static void main(String[] args){
//创建3个对象
new User();
new User();
new User();
//查看系统创建了多少个User对象
System.out.println("系统创建的User对象个数:"+User.number);
}
}
运行上面的代码,查看执行结果是:系统创建的User对象个数:3
1.3 static修饰成员方法
成员方法根据有无static也分为两类:类方法、实例方法
- 类方法 : 有static修饰的成员方法,属于类
- 实例方法 : 无static修饰的成员方法, 属于对象.
有static修饰的方法,是属于类的,称为类方法;调用时直接用类名调用即可。
无static修饰的方法,是属于对象的,称为实例方法;调用时,需要使用对象调用。
类方法和实例方法在堆中开辟空间
1.类方法:static修饰的方法,可以被类名调用,是因为它是随着类的加载而加载的;所以类名直接就可以找到static修饰的方法
2.实例方法:非static修饰的方法,需要创建对象后才能调用,是因为实例方法中可能会访问实例变量,而实例变量需要创建对象后才存在。所以实例方法,必须创建对象后才能调用。
1.4 工具类
需求 : 生成验证码
如果一个类中的方法全都是静态的,那么这个类中的方法就全都可以被类名直接调用,由于调用起来非常方便,就像一个工具一下,所以把这样的类就叫做工具类。
-
我们写一个生成验证码的工具类
public class utils{
public static String createCode(int n){
//1.定义一个字符串,用来记录产生的验证码
String code = "";
//2.验证码是由所有的大写字母、小写字母或者数字字符组成
//这里先把所有的字符写成一个字符串,一会从字符串中随机找字符
String data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ";
//3.循环n次,产生n个索引,再通过索引获取字符
Random r = new Random();
for(int i=0; i<n; i++){
int index = r.nextInt(data.length());
char ch = data.charAt(index);
//4.把获取到的字符,拼接到code验证码字符串上。
code+=ch;
}
//最后返回code,code的值就是验证码
return code;
}
}
-
接着可以在任何位置调用
utils
的createCode()
方法产生任意个数的验证码方法
//比如这是一个登录界面
public class LoginDemo{
public static void main(String[] args){
System.out.println(utils.createCode());
}
}
//比如这是一个注册界面
public class registerDemo{
public static void main(String[] args){
System.out.println(utils.createCode());
}
}
- 补充一点,工具类里的方法全都是静态的,推荐用类名调用为了防止使用者用对象调用。我们可以把工具类的构造方法私有化。
public class utils{
//私有化构造方法:这样别人就不能使用构造方法new对象了
private MyUtils(){
}
//类方法
public static String createCode(int n){
...
}
}
1.5 static的注意事项
使用类方法, 实例方法时的主义事项:
(1)类方法中可以直接访问类的成员,不可以直接访问实例对象成员.
(2)实例方法中既可以直接访问类成员,也不可以直接访问实例成员.
(3)实例方法中可以出现this关键字, 类方法中不可以出现this关键字.
public class Test01 {
//实例变量
public int age;
//类变量
public static String name;
//实例方法
public void show(){}
//类方法
public static void show1(){}
/**
* 1、类方法中可以直接访问类的成员,不可以直接访问实例成员。
*/
public static void Test1(){
System.out.println(name);
show1();
// System.out.println(age);
// show();
// System.out.println(this);
// this.show1();
}
/**
* 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。
* 3、实例方法中可以出现this关键字,类方法中不可以出现this关键字的
*/
// 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。
// 3、实例方法中可以出现this关键字,类方法中不可以出现this关键字的
public void test2(){
System.out.println(name);
show1();
System.out.println(age);
show();
System.out.println(this);
this.show();
}
}
1.6 static应用(代码块)
- 静态代码块:
格式 : static { }
特点 : 类加载时自动执行, 由于类只会加载一次, 所以静态代码块也只会执行一次.
作用 : 完成类的实例化, 例如 : 对类变量的初始化赋值
静态代码块不需要创建对象就能够执行
- 实例代码块:
格式 : { }
特点 : 每次创建对象时,执行代码块, 并在构造器钱执行.
作用 : 完成类的实例化, 例如 : 对类变量的初始化赋值
对于实例代码块重点注意:实例代码块每次创建对象之前都会执行一次
1.7 static应用(单例设计模式)
什么是设计模式(Design pattern) ?
- 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
- 设计模式有20多种,对应20多种软件开发中会遇到的问题。
单例设计模式(只说饿汉式)
- 使一个类只能有一个对象
步骤 :
-
1.私有化构造方法
-
2.提供一个私有类变量,这个类变量的类型是该类本身,并赋值
-
3.提供一个公共的类方法,返回a变量指向的对象
//1.私有化构造方法
private A() {
}
//2.提供一个私有类变量,这个类变量的类型是该类本身,并赋值
private static A a = new A();
//3.提供一个公共的类方法,返回a变量指向的对象
public static A getA() {
return a;
}
懒汉式:
//懒汉式
//1.私有化构造方法
private A() {
}
//2.提供一个私有类变量,这个类变量的类型是该类本身,不赋值
private static A a;
//3.提供一个公共的类方法,返回本类对象
public static A getA() {
if (a == null) {
a = new A();
}
return a;
}