static的作用,修饰成员变量的用法

static是静态的意思,可以修饰成员变量,表示该成员变量在内存中只存储一份,可以被共享访问、修改。含义是无论通过这个类创建了多少对象,这些对象都共用这一块的内存。
image.png

成员变量可以分为两类,以及它们的访问方式

静态成员变量(有static修饰)

image.png
在同一个类中类名可以省略不写

实例成员变量(无static修饰)

image.png

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

静态成员变量属于类,有static修饰,只加载一次,可以被共享访问,随类的加载而为他分配内存,内存在静态变量区(是堆内存的子集)
image.png

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

成员方法的分类

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

实例成员方法的使用场景

表示对象而不是类的行为,并且方法中要访问实例成员的,就必须申明成实例方法

静态成员方法的使用场景

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

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

image.png
static修饰的成员方法属于类,而不是对象

工具类

工具类产生的原因

在实际开发时,有时候会对一个功能进行在不同场景下的开发,这样会出现代码重复性过高的问题

工具类的定义

对一些应用程序中多次需要用到的功能,可以将这些功能封装成静态方法,放在一个类中,这个类就是工具类

工具类的好处

1.方便调用
2.提高了代码的复用

工具类的原理和延伸

一次编写,处处可用
建议将构造器私有,不让工具类对外产生对象
image.png

static的注意点

1.静态方法只能访问静态成员,不能直接访问实例成员,实例方法
因为静态方法属于类,实例成员属于对象,对象没有创建自然无法访问
2.实例方法既可以访问静态成员,静态方法,又可以访问实例成员,实例方法
使用实例方法时,对象已经创建
3.静态方法中不能出现this关键字
this表示的是当前对象,自然不能出现在静态方法中

代码块的简单介绍和代码块的类别

代码块是类的五大成分之一(成员变量,构造器,方法,代码块,内部类)定义在类中方法外
在Java类下,使用{ } 括起来的代码被称为是代码块

静态代码块

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

  1. package edu.dhu.objectdemo;
  2. public class StringDemo {
  3. public static int num;
  4. public static void main(String[] args) {
  5. System.out.println("main方法先执行");
  6. System.out.println(num);
  7. }
  8. static {
  9. num = 10;
  10. System.out.println("静态代码块先执行");
  11. }
  12. }

特点解释:静态代码块在类加载之后会优先执行(和它在代码中的位置无关),优先于任何的方法(包括main方法)

构造代码块

格式:{}
特点:创建对象是通过构造器实现的,每次创建对象时,会先执行代码块中的代码,然后在执行构造器,也就是说在创建对象时,代码块的执行顺序在构造器之前(每创建一个对象它会执行一次)
适用场景:初始化实例资源

static应用知识:单例设计模式

什么是设计模式

设计模式是一套被前人反复使用,多数人知晓,经过分类编目的代码设计经验的总结,后来者可以拿来解决问题
设计模式是软件设计中的常见解决方案,好的设计模式可以进一步提高代码的重用性

单例模式

可以保证系统中,应用该模式的这个类永远只有一个实例,即一个雷永远只创建一个对象

单例的场景和作用

例如任务管理器对象我们只需要一个就能解决问题,这样就可以节省内存空间

单例的实现方式

饿汉单例模式

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

  1. public class 类名{
  2. public static 类名 变量名 =new 类名();//定义一个静态变量存储一个该类对象,由于是静态类型因此它只在类加载时创建一个
  3. private 类名(){ //构造器必须私有(藏起来),不能被别人调用
  4. }
  5. }

特点:
定义一个类,构造器私有
定义一个静态变量存储一个对象

懒汉单例模式

真正需要该对象的时候,才去创建一个对象(延迟加载对象)
格式:

  1. public class 类名{
  2. public static 类名 变量名;//声明一个静态变量存储一个该类对象(并不初始化),由于是静态类型因此它只在类加载时创建一个
  3. private 类名(){ //构造器必须私有(藏起来),不能被别人调用
  4. }
  5. public static 类名 getInstance(){
  6. '''
  7. return ...;
  8. }
  9. }

特点:
定义一个类,构造器私有
定义一个静态变量存储一个对象(不初始化)
定义一个静态方法,做判断,如果没有初始化就初始化,已经初始化就不再操作
例子:
image.png
懒汉单例的静态变量一般私有

还有其他的单例模式暂时不学习