Static

static

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

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

成员变量可以分为2类

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

    public class User{
        //静态成员变量
        public static String onlineNumber = 161
    }
    • 访问方式:

      • 类名.静态成员变量。(推荐

      • 对象.静态成员变量。(不推荐

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

    public class User{
        public static String onlineNumber = 161;
        //实例成员变量:
        private String name;
        private int age;
    }

    比较:

    public class User{
        //静态成员变量
        public static int num = 161;
        //实例成员变量
        private String name;
        private String age;
        public static void main(String []args){
            //1. 类名,静态成员变量
            System.out.println(User.num);
            //1.对象名,实例成员变量
            System.out.println(User.name);  //报错,name为该类中每一个对象的变量,不能通过类调用。
            User u = new User();
            u.name = "张三";
            u.age = 18;
            System.out.println(u.name);
            Syetem.out.println(u.age);
            u.num++;  //新来了一个人
            Syetem.out.println(u.num);
            User u2 = new User();
            u2.name = "李四";
            u2.age = 19;
            System.out.println(u2.name);
            Syetem.out.println(u2.age);
            u2.num++; 
            System.out.println(u.num);
            System.out.println(User.num);//推荐方式
            //注意:同一个类中的静态成员变量的访问可以省略类名。
            System.out.println(num);
            
        }
    }

    输出结果:

     

static 内存机制

 

在main方法传入方法区时,会像堆内存中创建一个静态变量区,用来存储静态变量。

static修饰成员方法

成员方法的分类

  • 静态成员方法(有static修饰,归属于类),建议用类名访问,也可以用对象访问

  • 实例成员方法(无static修饰,归属于对象),只能用对象触发访问。

    public class Student{
        //实例成员变量,无static修饰,属于对象
        private String name;
        public void study(){
            System.out.println(name+"在好好学习~~")
        }
        
        public static int getMax(int age1,int age2){
            return age1>age2? age1:age2;
        }
        
        public static void main(String[]args){
            //类名.静态成员方法
            System.out.println(Student.getMax(10,2));
            //注意,同一个类中访问静态成员的类名可以不写
            System.out.println(getMax(23,44));
            //2. 对象.实例成员方法
            //study()会报错
            Student student = new Student();
            student.name = "猪八戒";
                student.study();
            //3.对象.静态成员方法(不推荐)
            System.out.println(student.getMax(20,10));
        }
    }

  • 每种方法的使用场景时怎么样的?

    • 表示自己的行为的,且方法中需要访问实例成员,则该方法必须申明成实例方法。

    • 如果该方法是执行一个通用功能为目的,或者需要方便访问,则可以声明为静态方法。

static修饰成员方法的内存原理

 

static的注意事项

  • 静态方法只能访问静态的成员,不可以直接访问实例成员

  • 实例方法可以访问静态的成员,也可以访问实例成员

  • 静态方法中不会出现this关键字

static应用知识

工具类

  • 工具类是什么?

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

  • 使用工具类的好处

    • 一调用方便,二是提高了代码复用(一次编码,处处可用)

  • 为什么工具类中的方法不用实例方法做?

    • 实例方法需要创建对象调用

    • 此时用对象值是为了调用方法,这样会浪费内存

  • 工具类定义时的其它要求:

    • 由于工具里面都是静态方法,直接用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器进行私有

      public class Test{
          private Test(){
              
          }
          public static String getVerifyCode(int n){
              String strs = "";
              String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
              Random random = new Random();
              for(int i = 0;i<n;i++){
               int num = random.nextInt(str.length);
                  char ch = str.charAt(num);
                  strs = str+ch;
              }
          return strs;
          }
      }

代码块

  • 代码块概述:

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

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

  • 代码块分为:

    • 静态代码块:

      • 格式:static{}

      • 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

      • 使用场景:在类加载的时候做一些静态数据初始化的操作,以便于后续使用

        public class Test{
            public static int num;
            static 
        }
    • 构造代码块(了解,见得少):

      • 格式:{}

      • 特点:每次创建对象,调用构造器执行时,都会执行改代码中的代码,并且在构造器执行之前执行

      • 使用场景:初始化实例资源

单例模式

  • 什么是设计模式?

    • 开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,成为设计模式

    • 设计模式有20多种,对应20多种软件开发过程中遇到的问题

    • 学设计模式主要是学2点:

      • 第一:用这种模式来解决什么问题

      • 第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的。

  • 饿汉单例设计模式

    • 在用类获取对象的时候,对象已经提前为你创建好了

    • 设计步骤

      • 定义一个类,把构造器私有化,放置被人随意调用

      • 定义一个静态变量存储一个对象

      package com.itheima.d3_static_code;
      //饿汉单例模式   在吃饭时,饭已经做好了
      //在用类获取对象时,对象已经提前创建好了。
      public class SingleInstance {
          private SingleInstance(){}
          public static SingleInstance singleInstance = new SingleInstance();
      ​
          public static void main(String[] args) {
              SingleInstance singleInstance = SingleInstance.singleInstance;//通过调用静态变量的方式,创建对象
              SingleInstance singleInstance1 = SingleInstance.singleInstance;
              System.out.println(singleInstance1==singleInstance);
          }
      }
       
  • 懒汉单例模式

    • 当真正需要该对象的时候,才回去创建一个对象(延迟加载对象)。

    • 设计步骤

      • 定义一个类,把构造器私有

      • 定义一个静态变量存储对象

      • 提供一个返回单例的方法

      package com.itheima.d3_static_code;
      //懒汉单例模式:像吃饭的时候才去做饭
      //在需要单例对象的时候才去创建对象
      public class SingleInstance2 {
          private static SingleInstance2 singleInstance2;  //创建静态对象来存储单例对象
          private SingleInstance2(){}  //构造器私有化
          public static SingleInstance2 getInstance(){  //构造方法来创建单例对象
              if (singleInstance2 ==null){
                  singleInstance2 = new SingleInstance2();
              }
              return singleInstance2;
          }
      ​
          public static void main(String[] args) {
              SingleInstance2 first = getInstance();
              SingleInstance2 second = getInstance();
              System.out.println(first==second);  //输出为true
          }
      }
      ​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值