static关键字
先来通过一段代码来感受一下 静态成员变量(被static修饰)和 实例成员变量(无static修饰)的不同 ==>
1 public class User {
2 //在线人数成员信息:静态成员变量
3 public static int onLineNumber;
4 //实例成员变量
5 private String name;
6 private int age;
7
8 public static void main(String[] args) {
9 //1、类名.静态成员变量
10 System.out.println(onLineNumber); //同一个类中,访问静态成员变量,类名可以省略不写
11 User.onLineNumber++;
12
13 //2、对象.实例成员变量
14 User user = new User();
15 user.name = "李明";
16 user.age = 24;
17 System.out.println(user.name);
18 System.out.println(user.age);
19 //对象访问:不推荐
20 user.onLineNumber++;
21 System.out.println(onLineNumber);
22 System.out.println("-----------------");
23 User user1 = new User();
24 user1.name = "李白";
25 user1.age = 26;
26 System.out.println(user1.name);
27 System.out.println(user1.age);
28
29 }
30 }
输出结果:
所对应的内存图:
实例方法(无static修饰) & 静态方法(被static修饰):
1 public class Student {
2 private String name;
3
4 //实例成员方法:无static修饰,属于对象,通常表示对象自己的行为
5 public void study(){
6 System.out.println(name + "在学习!");
7 }
8 //静态方法:有static修饰,属于类,可以被类和对象共享
9 public static int getMax(int a,int b){
10 return a > b ? a : b;
11 }
12
13 public static void main(String[] args) {
14 //1、类名.静态方法
15 System.out.println(Student.getMax(5, 9));
16 //同一个类中访问静态方法,类名可以省略不写
17 System.out.println(getMax(135, 34));
18
19 //2、对象.实例方法
20 Student student = new Student();
21 student.name = "小明";
22 student.study();
23 System.out.println(student.getMax(21, 11)); //不推荐
24 }
25 }
输出结果:
所对应的内存图:
由于静态方法属于类,所以被static修饰的静态方法main()和getMax()在类文件中,其实实例方法study()也存在类文件中,不过它不直接属于类,而属于对象,它只有在对象创建时才能被调用,但是对象又属于类,因此也可以理解为实例方法间接地属于类。不过必须搭建对象这一桥梁!即 类 --- 对象 -- 实例方法。
static应用:工具类案例--->
在企业的管理系统中,通常需要在一个系统中使用验证码进行防刷新等安全业务,如果我们为每一个业务提供一个验证码的服务,则会带来大量代码的冗余,而static关键字定义一个工具类则可以为这些业务提供一个静态的(即共享的)服务。
如下我们为某一个业务提供一个验证码生成机制:
接踵而来的问题是:如果我们又要在其他的业务上用到验证码生成机制,就不得不重新写一份(或者复制一份)相同的代码,那么,有没有什么方法可以实现把这些共享的功能统一 一下呢?答案是肯定的,用static修饰的工具类就可以实现这一功能:
1、创建工具类:
2、创建测试类,今后用类名调用该静态方法:
由此看来:工具类实现了共享验证码的作用,今后只要那个地方需要验证码,就直接调用VerifyTool类的createCode(int number)方法,传入相应的参数便可得到相应位数的验证码。
Java单例设计模式之饿汉式(对象提前创建好):
从运行结果我们可以看出:不管创建了多少个SingleHungryInstance类的对象,其最终的地址都指向了同一个对象的地址。
Java单例设计模式之懒汉式(对象在需要时被创建):
不难得出饿汉设计模式的原理是:当第一次调用返回单例对象的方法时:创建一个新的对象,以后在调用该方法则使用之前已经创建过的对象。
饿汉式 & 懒汉式
1、由于饿汉式在使用该对象时对象已经被创建,而懒汉式第一次获取对象时还需要当场创建,所以效率上讲变来讲饿汉式更快;
2、不过第二次及以后获取对象时懒汉式只需返回第一次已经创建好的对象即可;
3、不过从节约内存上来讲,由于饿汉式在类加载是便会创建一个对象(不管这个对象在后来是否被使用),如果我们只是用了该类里边的其他静态方法或其他静态成员变量,对于那些未被使用过的静态成员变量便白白浪费了宝贵的内存资源。