文章目录
- 一、static关键字的使用
- static修饰属性
- 实例变量
- 静态变量(类变量)
- 内存解析
- static修饰方法
- static注意点
- 如何确定什么时候使用static?
- 方法
- 属性
- 单例设计模式
- 饿汉式
- 懒汉式
- 区分饿汉式和懒汉式
一、static关键字的使用
1、可以用来修饰:属性、方法、代码块、内部类
static修饰属性
static修饰属性:静态变量(类变量)
属性,按是否有static修饰,分为:静态属性 vs 非静态属性(实例变量)
实例变量
实例变量:我们创建了类的多个对象,每个对象都独立拥有一套类中的非静态属性。当修改其中一个对象的非静态属性时,其他对象的属性值不会被修改。
静态变量(类变量)
静态变量:我们创建了类的多个对象,多个对象共享一个静态变量。当修改其中一个对象的静态变量时,其他对象调用的属性值是修改后的。
【说明】
①静态变量随着类的加载而加载。可以通过类.静态变量的方式调用(在没有创建属性时)
②因为类早于对象的创建,所以静态变量早于对象创建
③由于类只会加载一次,所以静态变量在内存中只存在一份:存在方法区的静态域中。
内存解析
栈:局部变量
堆:new出来的结构(对象、数组)
方法区:类的加载信息、静态域、常量池
static修饰方法
static修饰方法:静态方法
①随着类的加载而加载,可以通过 类.方法名 方式进行调用
②静态方法中,只能调用静态的方法或属性
非静态方法中,即可调用静态的方法或属性,也可调用非静态的方法或属性
(根据加载先后得到)
static注意点
在静态方法中,不能使用this或super,因为静态方法加载早于对象,这两个是基于对象的。
如何确定什么时候使用static?
方法
操作静态属性的方法通常设置为静态
工具类中的方法习惯上声明为静态,如Math
属性
属性可以被多个对象所共享的,不会随着对象不同而不同的。
类中的常量常常也声明为static,如Math.PI
单例设计模式
设计模式类似于套路
饿汉式
public class SingleTon1 {
public static void main(String[] args) {
Bank b=Bank.getInstance();
}
}
//饿汉式
class Bank{
//1.构造私有化构造器
private Bank(){
}
//2.内部创建类的对象
//4.要求此对象也是静态的
private static Bank bank1=new Bank();
//3.提供公共的静态的方法返回类的对象
public static Bank getInstance(){
return bank1;
}
}
懒汉式
public class SingleTon2 {
public static void main(String[] args) {
Order o1=Order.getInstance();
Order o2=Order.getInstance();
System.out.println(o1==o2);
}
}
class Order{
//1.私有化类的构造器
private Order(){
}
//2.声明当前类对象,没有初始化
//4.此对象必须为static
private static Order o=null;
//3.声明public的,static的,返回当前类对象的方法
public static Order getInstance(){
if(o==null){
o=new Order();
}
return o;
}
}
区分饿汉式和懒汉式
饿汉式:
坏处——对象加载时间过长
好处——线程是安全的
懒汉式:
好处——延迟对象的创建
目前写法的坏处——线程不安全(后面可修复)