JVM类加载和静态存储

来源:互联网 发布:张国荣死亡之谜 知乎 编辑:程序博客网 时间:2024/06/06 02:13

静态的,那就是最优先的

修饰当中,总有几个骚东西

如果说public,protected,default(friendly,就是没有修饰符啦)定义的是访问权限范围的话

static定义的就是优先级了


想要创建对象,先查户口,看看老爹(继承父类),再看看老妈(接口)

追到老祖宗,查遍户口本了,才开始到你


创建对象可不是构造方法开头的,如果你这么以为,那就错了

操作语句不能在类级别直接写,那是不被允许的

但是加个大括号就可以了,这个东西还排在构造之前

public class Client {public Client(){System.out.println("create");}{System.out.println("construct");}}
看起来有点骚,这个无名氏有点腻害

这个是构造代码块

如果说finalize是临死前的最后一句遗言

构造方法是受精孕育生命

构造代码块就是小蝌蚪在冲刺了


创建对象时一定会先走这一步,可以测试一下

public class Client {private static String name;public Client(){//name = "judas";}{name = "godme";}public String getName(){return name;}public static void main(String args[]){Client client = new Client();System.out.println(client.getName());//godme}}
放开注释
public class Client {private static String name;public Client(){name = "judas";}{name = "godme";}public String getName(){return name;}public static void main(String args[]){Client client = new Client();System.out.println(client.getName());//judas}}

可以知道两点:

1. 构造代码块可以执行

2. 构造方法会覆盖,说明构造方法在构造代码块之后


如果是那种一开始就必须赋值的基本属性的话,不防在构造代码块中进行赋值,这种是很保险的


小蝌蚪既然开始摇摆了,那前面也必须static来进行放闸

正如需要查遍户口验明正身,了解一切,在最初的时候JVM也会先解析你

加载就是这样一个过程

构造代码块,构造方法,正如名称,构造

每次创建对象的时候,这些方法都会执行一次

但是加载过程只会有一次,此时执行的就是静态代码块

public class Client {private static String name;public Client(){//name = "judas";}static{name = "godme";}public static String getName(){return name;}public static void main(String args[]){System.out.println(Client.getName());}
此时,没有默认的赋值,没有构造来出发,也没有外部的注入

这就是加载时候默认出发的方法

用static修饰的变量,都会被存放在JVM的静态内存中,也会优先被加载

毕竟放闸了才会有以后

1. 查户口

    1. 静态代码块

2. 静态代码块

3. 构造代码块

4. 构造方法

5. 开始你的程序

加载到的时候就会执行,所以哪怕是你没用到的类,继承了他或者他的子类,他也会还阳那么一会会


但是,这个静态的东西都必须在类里面定义么

这种好东西使用范围必定是广泛的,如果真的只在类里面定义,没有一个方便的方式,那也废了

public class Client {public static void main(String args[]){System.out.println(System.getProperty("name"));}public static void set(){System.setProperty("name", "godme");}}
这样不就好了,同时一个程序,通过静态存储区就可以进行相互的数据交流了

数组,集合当然也可以,不过局限太大了

感觉不到的话,比较一下

public class Client {public static void main(String args[]){set(3,5);calc();int ans = get();System.out.println(ans);}public static void set(int a, int b){System.setProperty("a", a+"");System.setProperty("b", b+"");}public static void calc(){String astring = System.getProperty("a");String bstring = System.getProperty("b");int a;int b;if(astring == null && bstring == null){astring = "0";astring = "0";}a = Integer.valueOf(astring);b = Integer.valueOf(bstring);System.setProperty("ans", (a+b)+"");}public static int get(){return Integer.valueOf(System.getProperty("ans"));}}
通过一个中介,三个部分都只是孤立的完成自己的操作,却组装出了一个实用的方法

不过这种只是JVM自己提供的存储机制,工业上这种交互式的缓存可以用redis

不同于Oracle或MySQL的专注持久化存储,在快速的数据交互情景下,redis快速的存取更获得青睐

好比设置的键值,redis中不同表的划分,让不同的线程来进行处理,再转移到下一个表,接收下一步的处理

这种阶段式,集中式的处理,会更方便,更高效