static静态方法学java的都很熟悉,那static有什么作用、又是怎么用的呢?使用过程中应该注意什么呢?小猿圈加加详解一下static,对static模糊的朋友看到这篇文章,清晰透彻,下面进入整题。
1、static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。(static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的)
Static修饰方法:方法可以直接被类名点出
基本作用:方便在没有创建对象的情况下来进行调用(方法/变量)。
2、static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化。
static修饰变量:变量可以直接被类名点出,是一个静态变量 在内存中的方法区中 如果常量池中有该变量 那么有且只有一个
注意:被static所修饰 可以直接通过类名点出 数据存放在方法区 数据是整个项目公用的
3、static代码块:{}
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
{}定义在方法中:普通代码块
{}定义在类中:构造块
{}定义在类中并且被static所修饰:静态代码块
执行顺序:静态代码块——构造块——普通代码块
在我们程序启动的时候 被static所修饰的会先被创建 而没有被static所修饰会后加载 被static所修饰 会优于类的创建
static所修饰的变量和方法 只能 被static修饰的方法所调用 不能调用非static修饰的方法
非static的方法 可以代用 static修饰的方法
面试真题练习:
下面是一道面试当中,出现频率很高的一道关于static的面试题:
这段代码的输出结果是什么?
class Base{ static{ System.out.println("base static"); } public Base(){ System.out.println("base constructor"); } } public class Test extends Base{ static{ System.out.println("hello static"); } public Test(){ System.out.println("hello constructor"); } public static void main(String[] args){ new Test(); } }
result:
base static
test static
base constructor
test constructor
解析:代码块执行顺序:静态代码块——构造块——普通代码块,所以在我们程序启动的时候 被static所修饰的会先被加载, 而没有被static所修饰会后加载,Test类继承自Base类,因此会转去先加载Base类的static块,再加载Test类中的static块,然后依照顺序加载父类和子类的其他代码块
看完小猿圈写的这篇文章,是不是感觉赚到了,static写的一目了然,最后面试题也是相当重要的,是static知识点出的,做错的朋友可以看看解析,希望大家可以通过小编这篇文章,对static好好理解了,想了解其他知识点的朋友,可以看看小猿圈加加的前几篇文章哦。