我是靠谱客的博主 无私大象,这篇文章主要介绍Java 静态、类加载,现在分享给大家,希望可以做个参考。

1.静态是什么?有什么用?

static的主要作用在于创建独立于具体对象的域变量或者方法。

每创建一个对象,都会在堆里开辟内存,存成员(属性),但是不存方法,方法是共用的,没必要每一个对象都浪费内存去存方法。有一个叫方法区的地方,专门存方法。方法区里又有静态域,存静态变量或者静态方法。

普通变量和方法的调用:通过对象调用

静态变量和方法的调用:通过对象或对象调用

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyTest8 { public static void main(String[] args) { System.out.println(Plant.name);//通过类调用 Plant p1=new Plant(); System.out.println(p1.name);//通过对象调用 p1.name="植物";//类似方法,是公用的,改了之后就是改了,新建对象也是这个值 Plant p2=new Plant(); System.out.println(p2.name);//通过对象调用 } } class Plant{ static String name="静态植物"; public static void say() { System.out.println("植物类"); } } /**输出 静态植物 静态植物 植物 */
静态的调用

 

在类被加载的时候,静态的代码都会被加载,并且只加载一次,放在方法区里,该类的对象一起用。省时省力。

2.加载类有什么用?

任何程序都要先加载到内存中才能和CPU进行交流,而JVM中的ClassLoader(类加载器)就是负责提前将,class文件加载到内存中去的。

3.类何时被加载?(普通人的宏观理解)

  • 实例化对象时,如Chinese c1=new Chinese();此时加载了Chinese类
  • 通过类名调用静态变量或静态方法的时候
  • 如果实例化子类对象,会先加载父类

通过代码验证:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyTest8 { public static void main(String[] args) { Plant.say();//通过类名调用静态方法 Plant p1 = new Plant();//创建对象 Plant p2 = new Plant(); } } class Plant{ static String name="静态植物"; public static void say() { System.out.println("植物类"); } static { System.out.println("植物类的静态代码被执行加载了"); } { System.out.println("植物类的普通代码被加载了"); } }

输出:

植物类的静态代码被执行加载了
植物类
植物类的普通代码被加载了
植物类的普通代码被加载了

由此可知,Plant.say();调用方法时就加载了类,静态代码也都被执行了,并且只执行一次,创建对象的时候再次加载类,但是不执行静态代码,而是非静态代码。

 

再通过继承关系观察静态和非静态的关系

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MyTest8 { public static void main(String[] args) { Flower.say();//通过类名调用静态方法 Flower f1=new Flower();//创建花类对象 Flower f2=new Flower(); } } class Plant{ static String name="静态植物"; public static void say() { System.out.println("植物类"); } static { System.out.println("植物类的静态代码被执行加载了"); } { System.out.println("植物类的普通代码被加载了"); } } class Flower extends Plant{ static { System.out.println("花类被加载了"); } static String name="花"; public static void say() { System.out.println("花类"); } { System.out.println("花类的普通代码被加载了"); } }

输出:

植物类的静态代码被执行加载了
花类被加载了
花类
植物类的普通代码被加载了
花类的普通代码被加载了
植物类的普通代码被加载了
花类的普通代码被加载了

由此可知:调用静态的东西,只执行静态的代码,静态代码只执行一次。创建对象的时候也会加载,如果静态没有被加载过也会被加载,加载过就不用。加载子类的时候,会先把父类加载一次。

在代码中,调用子类静态方法,则先加载父类的静态代码,再加载子类的静态代码,再调用方法。创建对象的时候,先加载父类,再加载子类。

转载于:https://www.cnblogs.com/shoulinniao/p/11570159.html

最后

以上就是无私大象最近收集整理的关于Java 静态、类加载的全部内容,更多相关Java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(121)

评论列表共有 0 条评论

立即
投稿
返回
顶部