当我们编写一个类时,其实就是在描述对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统会给对象分配内存空间,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生多少对象的情况下,某些特定的数据在内存空间里只有一份。例如所有的中国人都有个国家名称,不必在每一个中国人的实例对象中都单独分配一个代表国家名称的变量
static可以用来修饰属性、方法、代码块、内部类
属性按是否使用static修饰又分为静态属性和非静态属性(实例变量)
public class StaticTest {
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.name = "王子璇";
c1.age = 20;
Chinese c2 = new Chinese();
c2.name = "李昊";
c2.age = 25;
c1.nation = "CHN";
System.out.println(c2.nation); // CHN
c2.nation = "CHINA";
System.out.println(c1.nation); // CHINA
}
}
class Chinese{
String name;
int age;
static String nation;
}
1.静态变量的加载要早于对象的创建
2.可以直接类.属性的方式,去调用咱们的静态变量
chinese.nation = "中国";
3.由于类只加载一次,则静态变量在类中只存在一份,存在方法区的静态域中

在静态的方法内,不能使用this、super关键字
属性是可以被多个对象共享的,不会随着对象的不同而不同
操作静态属性的方法,通常设置为静态的
工具类中的方法,习惯上声明为静态

用饿汉式和懒汉式
package baozhuang;
public class singleton {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank1 == bank2);
}
}
//饿汉式
class Bank{
//1.私有化类的构造器
private Bank(){
}
// 2.内部创建类的对象
// 4 静态的方法要求对象也必须为静态.
private static Bank instance = new Bank();
//3.提供公共的方法,返回类的对象,外面要想调用,必须先创建一个对象,但由于是private创建不了对象,所以得用static外部才能在不创建新对象的情况下去调用
public static Bank getInstance(){
return instance;
}
}
package baozhuang;
public class SingleTest2 {
public static void main(String[] args) {
Order ord1 = Order.getInstance();
Order ord2 = Order.getInstance();
System.out.println(ord1 == ord2);
}
}
class Order{
// 1. 私有化类的构造器
private Order(){
}
// 2.声明当前类的对象
// 4.此对象也必须声明为static
private static Order instance = null;
// 3.声明public,static的返回当前类对象的方法
public static Order getInstance(){
if (instance == null){
instance = new Order();
}
return instance;
}
}
饿汉式:
好处:对象加载时间过长
坏处:线程安全的
懒汉式
好处:延迟对象的创建
坏处:目前的写法是线程不安全的 ----到多线程的时候再修改
由于单例模式只生成了一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式解决
