面试题总结——static关键字详解

面试题总结——static关键字详解

  首先来看一下Java中static的几种应用场景。

  1、static修饰属性(静态变量/属性)
  2、static修饰方法(静态方法)
  3、static修饰内部类(静态内部类)
  4、static修饰代码块(静态代码块)
  5、import static(静态导入)

  static最核心的一点就是与对象解绑

 1、静态变量与普通变量

  java的静态变量也叫做类变量,它开始于类的创建,结束于类的消亡。非静态变量叫做实例变量,它开始于类的实例的创建,结束语类的实例的消亡。静态变量被所有实例所共享

  由于静态变量是存放在类上的,与对象无关,因此静态变量在类加载时会存放在方法区(全局数据区,所有对象共享的区域)。

  而普通变量(局部变量)是与对象相关的,只有实例化类产生对象与对象一起创建(位于上)

 2、静态方法

  普通方法再被调用时,实际上还存在一个隐式参数this,相当于需要传入调用该方法的那个对象(“我”),因此,普通方法会随着对象的销毁而销毁,而静态变量是全局共享的,因此,不能在普通方法中创建静态变量,但可以调用静态变量或静态方法(全局共享)。(不能创建但能引用静态变量)

  静态方法是没有this参数(隐式参数)的方法,因此在静态方法中不能调用普通方法和普通属性(也必须要有对象存在)。但可以创建普通属性(方法内部)、静态属性,也可以调用静态方法。(不能引用但能创建普通属性)

 总结一下:静态方法,静态属性通过类名调用,与对象实例化无关,但是,一个类的对象也可以直接调用该类的静态方法或静态属性的(不推荐)。因为它们都是全局共享的。

 3、静态内部类与成员内部类

  有了上面静态方法与普通方法的基础,静态内部类与成员内部类只需要进行类比即可。贯穿始终的this此时就值得是Outter.this(外部类的this)

  和普通方法类似,成员内部类也是需要与对象(外部类对象)强相关的,也需要传入隐式参数,只不过此时的参数不是this了,而是外部类的this(Outter.this,代表外部类对象),因此成员内部类中也不能创建静态变量,但成员内部类中可以访问外部类的数据(包括私有数据),但由于成员内部类是依附于外部类对象的,因此需要先创建外部类再创建成员内部类(先有对象才有普通方法)

  和静态方法类似,静态内部类相当于是没有Outter.this的内部类,同样也不能访问外部类的非静态域(普通属性,普通方法),类似的,也可以在类中创建普通属性,静态属性。由于并不依附外部类对象,因此可以直接创建静态内部类对象。

 4、静态代码块

  静态代码块与构造代码块差距较大,只需要记住一点。

  静态代码块中的内容在类加载时执行,且只执行一次。构造代码块在每次类对象产生时优先于构造方法执行。

 5、import static(静态导入)

  使用静态导入另外一个类,相当于将该类与当前类合二为一,当前类调用该类的静态方法时不需要加类名,直接调用即可。

你可能感兴趣的:(面试题总结,static)