static静态关键字
static是静态的意思,可以修饰成员变量和成员方法
static修饰成员变量表示该成员变量只在内存中只存储一份,共享访问,修改
例:
public class User{
public static int onlineNumber = 161;
private String name;
private int age;
}
成员变量可以分为2类
静态成员变量(有static修饰,属于类,内存中加载一次):需要被共享的信息,可以共享访问
public class User{
//类名.静态成员变量(推荐)
//对象.静态成员变量(推荐)
public static int onlineNumber = 1;
}
实例成员变量(无static修饰,存在于每个对象中):属于每个对象的信息
public class User{
//对象.实例成员变量
private String name;
private int age;
}
static修饰成员方法的基本用法
静态成员方法(有static修饰,属于类)建议用类名访问,也可以用对象访问
表示该方法是以执行一个共用功能为目的,则可以申明成静态方法
实例成员方法(无static修饰,属于对象)只能用对象触发访问
表示对象自己的行为时,且方法中需要访问实例成员的,则该方法必须申明成实例方法
public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } //实例成员方法 public void stduy(){ System.out.println("好好学习,天天向上"); } //静态成员方法 public static void getMax(int a,int b){ System.out.println(a>b?a:b); } public static void main(String[] args) { Student s = new Student("大珍珠",23); getMax(12,15); Student.getMax(13,16); s.getMax(14,17); s.stduy(); } }
static访问注意事项
静态方法只能访问静态成员,不可以直接访问实例成员
实例方法可以访问静态的成员,也可以访问实例成员
静态方法中时不可以出现this关键字
static工具类
工具类中定义的都是一些静态方法,每个方法都是以完成一个公用的功能为目的
工具类好处:
①调用方便 ②提高代码复用(一次编写处处可用)
实例方法需要创建对象调用,此时用对象只是为了调用方法,这样只会浪费内存
public class Util { private ItheimaUtil(){ } public static String createVerifyCode(int n){ String code=""; String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random = new Random(); for (int i = 0; i < n; i++) { code += s.charAt(random.nextInt(s.length())); } return code; } }
注意:
建议将工具类的构造器进行私有化,工具类无需创建对象
里面都是静态方法,直接用类名访问即可
static代码块
代码块:
类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外
在Java类下,使用{}括起来的代码称为代码块
静态代码块:
格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载到时候做一些静态数据初始化的操作,以便后续使用
public class StaticDemo { public static int onLineNumber; static{ System.out.println("静态代码块"); onLineNumber=99; } public static void main(String[] args) { System.out.println("main方法"); System.out.println(StaticDemo.onLineNumber); } }
构造代码块:
格式:{}(很少用)
特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
使用场景:初始化实例资源
public class StaticDemo { private String name; public StaticDemo2() { System.out.println("构造器"); } { System.out.println("实例代码块/构造代码块"); name = "大珍珠"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { StaticDemo2 s2 = new StaticDemo2(); System.out.println(s2.getName()); } }
static单例
单例模式:
可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间
饿汉单例模式
在用类获取对象的时候,对象已经提前创建好了
设计步骤:
定义一个类,把构造器私有
定义一个静态变量存储一个对象
public class Singlelnstance { private Singlelnstance(){ } public static Singlelnstance singlelnstance = new Singlelnstance(); }
懒汉单例模式
在真正需要对象的时候,才去创建一个对象(延迟加载对象)
设计步骤:
定义一个类,把构造器私有
定义一个静态变量存储一个对象
提供一个返回单例对象的方法
public class Singlelnstance { private Singlelnstance(){ } private static Singlelnstance singlelnstance; public static Singlelnstance getSinglelnstance(){ if (singlelnstance==null){ singlelnstance = new Singlelnstance(); } return singlelnstance; } }