静态关键字static
静态关键字可以用来修饰成员变量和成员方法,表示共享的意思。
在同一个类中,调用成员变量和成员方法,类名可以省略。
static用来修饰成员变量
属于类,在内存中只加载一次,并且是共享的。
public class StaticDemo {
static int onlinenumber=160;
public void login(){
onlinenumber++;
}
public static void main(String[] args) {
if(true){
onlinenumber++;
}
StaticDemo staticDemo=new StaticDemo();
staticDemo.login();
System.out.println(onlinenumber);
}
运行结果:162
static修饰成员变量的内存图
当类加载时,同时会在堆内存中开辟静态变量区。
总结:
被static修饰的静态成员变量可以用类名调用、也可以用对象名调用(但不建议使用)。
static修饰成员方法
静态成员方法的属于类,所以建议使用类名访问,也可以用对象名访问,可以被共享。
什么时候用static修饰成员方法呢?
1.若表示对象自己的行为,并且要访问实例成员的方法,则该方法必须申明成实例方法。
2.如果该方法时执行一个共用的方法,则定义为静态方法。
public class StaticDemo {
static int onlinenumber=160;
public static void login(){
onlinenumber++;
}
public static void main(String[] args) {
login();
StaticDemo.login();
StaticDemo staticDemo=new StaticDemo();
staticDemo.login();
System.out.println(onlinenumber);
}
用static修饰成员方法的内存图
static的注意事项:
静态方法只能访问静态的成员(静态成员变量或静态成员方法),不可以直接访问实例成员。
实例方法可以访问静态成员,也可以访问实例成员。
不能使用this关键字。
static修饰的代码块
概述:
代码块是类中的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在内中方法外。
在java中,用{}括起来的为代码块。
代码块的分类:
静态代码块:
static{}
随着类的加载而加载,并且自动触发,只执行一次。
作用:用于初始化静态资源。
构造(实例代码块)代码块: 每次创建对象时都会执行。(一般不用)
{}
每次创建对象,调用构造器执行,都会执行该代码块,并且在构造器之前执行
作用:初始化实例资源。
静态代码块的应用案例:
斗地主游戏:
开始时,提前准备54张牌。
定义一个静态的集合。
static应用:设计模式
什么是设计模式?
开发中的最优解。
学习设计模式学两点:
第一:这种设计模式是用来解决什么样的问题
第二:遇到这种问题,该模式是怎样写的,他是如何解决这个问题的.
单例模式:
可以保证系统中,应用该模式的类永远只有一个实例,即一个类只能创建一个对象。
比如:任务管理器。节省内存空间
单例的实现方式:
饿汉式单例实际模式:在用类获取对象的时候,对象已经创建好了
设计步骤:
定义一个类,私有构造器
定义一个静态变量存储一个对象
public class single {
public static single single=new single();
private single(){
}
}
public class Test {
public static void main(String[] args) {
single s1=single.single;
single s2=single.single;
System.out.println(s1==s2);
}
}
懒汉单例设计模式:在真正需要的该对象的时候,才去创建一个对象(延迟加载对象)
设计步骤:
定义一个类,私有构造器。
定义一个静态变量存储一个对象(不能直接创建对象)
提供一个返回单例对象的方法
public class single2 {
private static single2 single2;//最好私有
public static single2 getInstance(){
if(single2==null){
single2=new single2();
}
return single2;
}
private single2(){
}
}
public class Test2 {
//懒汉单例
public static void main(String[] args) {
single2 s1=single2.getInstance();
single2 s2=single2.getInstance();
System.out.println(s1==s2);
}
}
public static void main(String[] args) {
single2 s1=single2.getInstance();
single2 s2=single2.getInstance();
System.out.println(s1==s2);
}
}