首页 > 其他分享 >Static静态关键字

Static静态关键字

时间:2022-12-27 19:44:53浏览次数:33  
标签:String 静态 System 关键字 static println Static public out

Static静态关键字

定义

static是静态的意思,可以修饰成员变量和成员方法。

static修饰成员变量表示该成员变量在内存中只能存储一份,可以被共享访问,修改。

成员变量可以分为两类

  • 静态成员变量(有static修饰,属于类,内存中加载一次):常表示如在线人数信息、等需要被共享的信息,可以被共享访问。

image

  • 实例成员变量(无static修饰,存在于每个对象中):常表示姓名name、年龄age、等属于每个对象的信息。

image

static修饰成员变量的内存原理

image

statci修饰成员方法的基本用法

public class User {
    /**
     * 在线人数
     * 注意:static修饰的成员变量:静态变量,只在内存中存一份
     */
    public static int onlineNumber = 161;
    /**
     * 实例成员变量:无static修饰,属于每个对象的,必须用对象名.访问
     */
    private String name;
    private int age;

    public static void main(String[] args) {
        // 目标:理解static修饰成员变量的作用和访问特点
        // 1.类名。静态成员变量
        System.out.println(User.onlineNumber);

        // 2.对象名.实例成员变量
        User u = new User();
        u.name = "张三";
        u.age = 23;
        System.out.println(u.name);
        System.out.println(u.age);
        u.onlineNumber++;//新来一个人

        User u2 = new User();
        u.name = "李四";
        u.age = 23;
        System.out.println(u2.name);
        System.out.println(u2.age);
        u.onlineNumber++;//新来一个人

        System.out.println(u.onlineNumber);
        System.out.println(User.onlineNumber); // 推荐方式
        //注意:同一个类中静态成员变量的访问可以省略类名
        System.out.println(onlineNumber);
    }
}

成员方法的分类

  • 静态成员方法(有static修饰,归属于类),建议用类名访问,也可以用对象访问
  • 实例成员方法(无static修饰,归属于对象),只能用对象出发访问。

image

static修饰成员变量的内存原理

image

public class Student {
    /**
     * 实例成员变量,无staitc修饰。属于对象。
     */
    private String name;

    /*
        静态成员方法:有static修饰,归属于类,可以被共享访问,用类名或方法名都可以访问
     */
    public static int getMax(int age1,int age2){
        return age1 > age2 ? age1 : age2;
    }

    /*
       实例方法:属于对象的,只能用对象出发访问
     */
    public void study(){
        System.out.println(this.name + "在好好学习,天天向上");
    }

    public static void main(String[] args) {
        // 1. 类名.静态成员方法
        System.out.println(Student.getMax(10, 3));
        // 注意:同一个类中,访问静态方法,类名可以省略不写
        System.out.println(getMax(10, 32));

        // study(); 报错了
        // 2. 对象.实例方法
        Student s = new Student();
        s.name = "猪八戒";
        s.study();

        // 3.对象.静态方法(语法可行,但 不推荐)
        System.out.println(s.getMax(10,3));
    }

}

static的注意事项(可能出面试题)

  • 静态方法只能访问静态的成员,不可以直接访问实例成员
  • 实例方法可以访问静态成员,也可以访问实例成员
  • 静态方法中是不可以出现 this 关键字的
public class Test3 {
    // 目标:理解static 访问相关的语法:面试笔试题,或者以后理解程序很重要的知识(拓展)

    /*
        静态成员
     */
    public static int onlineNumber = 10;
    public static void test2(){
        System.out.println("==test2==");
    }

    /*
        实例成员
     */
    private String name;
    public void run(){
        System.out.println(name+"跑得快");
    }

    // 3.静态方法是不可以出现 this 关键字的
    public static void test3(){
        //System.out.println(this); // this只能代表当前对象!
    }

    // 2.实例方法可以访问静态成员,也可以访问实例成员
    public void go(){
        System.out.println(onlineNumber);
        System.out.println(Test3.onlineNumber);
        test2();
        System.out.println(name);
        System.out.println(this.name);
        run();
    }


    // 1.静态方法只能访问静态成员,不能直接访问实例成员
    public static void test(){
        System.out.println(onlineNumber);
        System.out.println(Test3.onlineNumber);
        test2();
        //System.out.println(name);//不能直接访问实例成员
        Test3 t = new Test3();
        System.out.println(t.name);//可以间接访问实例成员

    }

    public static void main(String[] args) {

    }
}

static应用知识:工具类

工具类是什么

类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类来给系统开发人员共同使用的

案例

image

image

/**
 * 工具类
 */
public class zzxUtil {

    /*
        注意!由于工具类无需创建对象,所以把其构造器私有化会显得很专业!
     */
    private zzxUtil(){
    }

    /**
     * 静态方法。
     */
    public static String createVerifyCode(int n){
        // 开发一个验证码
        // 1.定义一个变量记住验证码
        String code = "";
        // 2.定义一个变量记住全部验证码字符
        String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
        // 3.定义一个循环生成几个随机索引,去得到几个字符
        Random r = new Random();
        for (int i = 0; i < n; i++) {
            int index = r.nextInt(data.length());
            char c = data.charAt(index);
            code += c;
        }
        return code;
    }
}

工具类的优势

  • 内部都是一些静态方法,每一个方法完成一个功能
  • 一次编写,出出可用

工具类的要求

  • 建议工具类的构造器私有化处理。

练习

image

ArraysUtils工具类

/**
 * ArraysUtils工具类
 */
public class ArraysUtils {

    //隐藏构造器,构造器私有化
    private ArraysUtils(){
    }

    /**
     * 静态方法:将整数数组的内容按照[1,2,3...]的格式返回
     * @param arrays 传入的整数数组
     * @return 返回字符串格式的数组内容
     */
    public static String toString(int[] arrays){
        //判断数组为空的情况
        if (arrays ==null){
            return null;
        }
        String s = "[";
        for (int i = 0; i < arrays.length; i++) {
            if (i != arrays.length-1){
                s = s + arrays[i] + ",";
            }else {
                s = s + arrays[i] ;
            }
        }
        s = s + "]";
        return s;
    }

    /**
     * 去掉数组内最大值、最小值后求取数组的平均值并返回
     * @param scores 传入的分数数组
     * @return 平均值
     */
    public static double getAverage(double[] scores){
        //判断数组为空的情况
        if (scores == null){
            return 0;
        }
        Arrays.sort(scores);
        double sumScore = 0;
        for (int i = 1; i < scores.length-1; i++) {
            sumScore +=  scores[i];
        }
        double average = sumScore/(scores.length-2);
        return average;
    }
}

TestDemo测试类

/**
 * 测试类
 */
public class TestDemo {

    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6};
        int[] a2 = null;
        int[] a3 = {};
        System.out.println(ArraysUtils.toString(a));
        System.out.println(ArraysUtils.toString(a2));
        System.out.println(ArraysUtils.toString(a3));

        double[] b = {50,60,70,80,90};
        double[] b2 = null;
        double[] b3 = {};
        System.out.println(ArraysUtils.getAverage(b));
        System.out.println(ArraysUtils.getAverage(b2));
        System.out.println(ArraysUtils.getAverage(b3));

    }
}

static应用知识:代码块

代码块概述

  • 代码块是类的五大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法外

  • 在Java类下,使用 { } 括起来的代码被称为代码块

静态代码块

  • 格式:static{}
  • 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
  • 使用场景:在类加载的适合做一些静态数据初始化的操作,以便以后使用
public class StaticDemo1 {

    public static String schhoolName;

    /**
     * 静态代码块:有static修饰,属于类,与类一起优先加载一次,自动出发执行
     * 作用:可以用于初始化静态资源
     */
    static {
        System.out.println("------静态代码块被触发执行了------");
        schhoolName = "黑马";
    }

    public static void main(String[] args) {
        //目标:先理解静态代码块。
        System.out.println("------main代码块被触发执行了------");
        System.out.println(schhoolName);

    }
}

构造代码块(了解,见得少)

  • 格式:{}
  • 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
  • 使用场景:初始化实例资源
public class StaticDemo2 {

    private String name;

     public StaticDemo2(){
         System.out.println("===无参构造器被触发执行===");
     }

    /*
        实例代码块:无static修饰:属于对象,每次构建对象时,都会触发一次
          初始化实例资源
     */
    {
        System.out.println("===实例代码块被触发执行===");
        name = "张三";

    }

    public static void main(String[] args) {
        //目标: 理解实例代码块(构造代码块)
        StaticDemo2 s1 = new StaticDemo2();
        StaticDemo2 s2 = new StaticDemo2();
        System.out.println(s1.name);
        System.out.println(s2.name);
    }
}

静态代码块的应用案例

斗地主游戏

image

public class StaticTest3 {

    /*
        1.定义一个静态的集合,这样这个集合只加载一次,因为当前房间只需要一副牌
     */
    public static ArrayList<String> cards = new ArrayList<>() ;

    /*
        2.在程序真正运行main方法前,把54张牌放进去,后续游戏可以直接使用
     */
    static {
        // 3.正式做牌,放到集合中去
        // a.定义一个数组存储全部点数:类型确定了,个数确定
        String[] sizes = {"3","4","5","6","7","8","9,","10","J","Q","K","A","2"};
        // b.定义一个数组存储全部的花色:类型确定了,个数确定了
        String[] colors = {"♥","♠","♦","♣"};
        // c.遍历点数
        for (int i = 0; i < sizes.length; i++) {
            // sizes[i]
            // d.遍历花色
            for (int j = 0; j < colors.length; j++) {
                // colors[j]
                String card = sizes[i] + colors[j];
                cards.add(card);
            }
        }
        // e.单独加入大小王。
        cards.add("小

标签:String,静态,System,关键字,static,println,Static,public,out
From: https://www.cnblogs.com/zzx944964684/p/17008825.html

相关文章