Static关键字使用及代码块知识点

一、static关键字

1、static是什么,有什么作用?

static是一个关键字,一般用于修饰类中的成员(成员变量、成员方法)

2static修饰的成员有什么特点

    被有某类所产生的所有的对象所共享

    可以使用类名调用(推荐使用)

    静态的加载优先于对象

    随着类的加载而加载

3、访问静态成员的格式

    类名.静态成员变量名

    类名.静态成员方法名

4、静态内存图


5类中static修饰的静态成员变量和非静态成员变量有什么区别?

    静态成员:随着类的加载而加载完成

   非静态成员:是随着对象的创建而完成初始化。当完成之后,我们就可以通过对象来使用(它在哪个地方初始化完成,就在那个地方可以使用)。

    所以:静态成员只加载一次,或者是只执行一次;非静态的成员在每次创建对象时都会重新加载,或者是执行多次。

6、静态的注意事项:

    静态的方法:

        可以直接调用静态的变量和方法.

        不可以调用直接非静态的成员.

    非静态的方法:

            可以直接使用非静态的成员

            可以直接使用静态的成员

        在静态的成员中是不能直接使用this

7、静态的优缺点和使用场景

    优点:可以实现资源共享、可以直接通过类名访问

    缺点:当在字节码文件加载完成之后,那么静态的也已经加载完成.占用内存资源.

8类变量与实例变量辨析

        A:类变量:其实就是静态变量

                定义位置:定义在类中方法外

                所在内存区域:方法

        生命周期:随着类的加载而加载

        特点:无论创建多少对象,类变量仅在方法,并且只有一份

        B:实例变量:其实就是非静态变量

                定义位置:定义在类中方法外

                所在内存区域:

        生命周期:随着对象的创建加载

        特点:每创建一个对象,中的对象中就有一份实例变量

二、代码块

1、局部代码块

    其实就是在方法中定义一个代码块.

    作用:控制局部变量的生命周期

    当我们调用方法的时候,局部代码块被使用

2、构造代码块

    在成员的位置,在类中定义.

    作用:提取构造方法中公共的部分.

    在构造方法之间被调用.每一个构造方法在使用之前都会调用构造代码块

3、静态代码块

    在成员的位置,在类中定义,在代码块之前加static.

    作用:使用驱动.

    只会被调用一次.

4、同步代码块(多线程)

面试题:考察代码块的执行顺序

1、关于类中静态、非静态、构造方法的执行顺序
/*
 * 考察知识点:
 * 1.代码块的执行顺序,带继承的又是如何执行的
 * 2.静态代码块Fu---静态代码块Zi---构造代码块Fu---构造代码块Zi---构造方法Fu---构造方法Zi(错误理解)
 * 2.静态代码块Fu---静态代码块Zi---构造代码块Fu---构造方法Fu---构造代码块Zi---构造方法Zi(正确执行顺序)
 *为什么呢?执行顺序如下
 *1.jvm调用了main方法,main方法进栈
 *2.遇到Zi z = new Zi();,会先将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存
 * 父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
 * 所以,第一个输出的是静态代码块Fu,第二个输出静态代码块Zi
 * 3.走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类的构造,但是
 *在执行父类构造时,发现父类有构造代码块,构造代码块是优先与构造方法执行的
 * 所以,第三个输出构造代码块Fu,第四个输出构造方法Fu
 *4.Fu类初始化结束,子类初始化,第五个输出构造代码块Zi,最后输出构造方法Zi
 *
 */
public class Test02 {
	public static void main(String[] args) {
		Zi z = new Zi();
	}
}

class Fu {
	static {
		System.out.println("静态代码块Fu");
	}

	{
		System.out.println("构造代码块Fu");
	}

	public Fu() {
		System.out.println("构造方法Fu");
	}
}

class Zi extends Fu {
	static {
		System.out.println("静态代码块Zi");
	}

	{
		System.out.println("构造代码块Zi");
	}

	public Zi() {
		System.out.println("构造方法Zi");
	}
}

2、一道阿里的面试题

点击打开链接


猜你喜欢

转载自blog.csdn.net/happy_write/article/details/80012360
今日推荐