static的注意事项
- 类方法中可以直接访问类的成员,不可以直接访问实例成员。
public class Student{ //定义一个类变量和一个实例变量 static String schoolName; int score; //定义一个类方法和一个实例方法 public static void printHello(){ } public void printPass(){ } public static void printHelloWorld(){ //注意:这里是在同一个类中,访问类成员可以省略类名 //可以访问类变量 schoolName = "**大学"; //同样也可以访问类方法 printHello(); //而在类方法中访问实例成员的话,会报错 System.out.println(score); //报错 printPass(); //报错 } }
- 实例方法中既可以直接访问类成员,也可以直接访问实例成员。
public class Student{ //定义一个类变量和一个实例变量 static String schoolName; int score; public void printPass(){ schoolName = "**大学"; System.out.println(score); //都可以执行 } }
- 实例方法中可以出现this关键字,类方法中不可以出现this关键字的。
public class Student{ public static void printHelloWorld(){ //因为类方法中是在类中执行的,而this要取到当前对象的地址,类方法中并没有对象 System.out.println(this); //会报错 } public void printPass(){ System.out.println(this); //可以执行 } }
static相关:代码块
代码块概述
- 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为两种:
- 静态代码块
格式:static{}
特点:加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
作用:完成类的初始化,例如:对类变量的初始化赋值(无意义),实际上多用来起到日志的作用。
例如:
定义一个学生类
public class Student{ static int number = 100; //静态代码块 static{ System.out.println("静态代码块执行了"); } }
多次调用学生类,它会优先执行静态代码块,但只会执行一次
public class Test{ public static void main(String[] args){ System.out.println(Student.number); System.out.println(Student.number); System.out.println(Student.number); } }
所以最终输出结果为:
静态代码块执行了
100
100
100
- 实例代码块
格式:{}
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。
单例设计模式
学习单例设计模式之前,我们先了解一下什么是设计模式:
- 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
- 设计模式有20多种,对应20多种软件开发中会遇到的问题。
关于设计模式的学习,主要掌握两点:
- 解决什么问题?
- 怎么写?
而单例设计模式就是设计模式中的一种。
我们知道一个类可以new出很多对象,但对于某个应用场景下,我们希望这个类只能有一个对象,这就是单例设计模式所解决的问题。
- 单例设计模式:确保一个类只有一个对象。
写法
- 把类的构造器私有。
- 定义一个类变量记住类的一个对象。
- 定义一个类方法,返回对象。
//单例类 public class A{ //1.私有构造器 private A(){ } //2.定义一个类变量记住类的一个对象 private static A a = new A(); //3.定义一个类方法返回对象 public static A getObject(){ return a; } }
单例设计模式的应用场景
例如:任务管理器,只需要一个任务管理器就可以管理他们了,使用单例模式可以避免浪费内存。
饿汉式单例
单例设计模式的实现方式有很多,我们刚刚写的就属于饿汉式单例,也就是:
- 返回对象时,对象已经创建好了。
下面介绍第二种单例设计模式
懒汉式单例
- 拿对象时,才开始创建对象(延迟加载对象)。
写法
- 把类的构造器私有。
- 定义一个类变量用于存储对象。
- 提供一个类方法,保证返回的是同一个对象。
public class B{ //1.把类的构造器私有 private B(){ } //2.定义一个类变量,用于存储这个类的一个对象。 private static B b; //注意:这里与饿汉式单例的区别就在于没有先new一个对象出来 //3.定义一个类方法,保证第一次调用时才创建一个对象,后面调用时不创建对象 public static B getInstance(){ if(b == null){ b = new B(); } return b; } }
什么时候用饿汉式单例?什么时候用懒汉式单例呢?
当需要频繁用到这个单例设计模式的时候可以用饿汉式单例先把对象创建出来,而对于不频繁使用的则可以用懒汉式单例,会稍微节省一些内存。
END