static 静态

目录

1.1 static修饰成员变量

1.2 static修饰成员变量的应用场景

1.3 static修饰成员方法

1.4 工具类

1.5 static的注意事项

1.6 static应用(代码块)

1.7 static应用(单例设计模式)


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;
    }
}

  • 接着可以在任何位置调用utilscreateCode()方法产生任意个数的验证码方法

//比如这是一个登录界面
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;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序一定有bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值