Java教程 目录

Java static关键字

java中的static关键字主要用于内存管理。我们可以应用java static关键字在变量,方法,块和嵌套类中。 static关键字属于类,而不是类的实例。

静态(static)可以是:

  1. 变量(也称为类变量)
  2. 方法(也称为类方法)
  3. 代码块
  4. 嵌套类

1. Java静态变量

如果将一个变量声明为static,它就是所谓的静态变量了。

  • 静态变量可以用于引用所有对象的公共属性(对于每个对象不是唯一的)。如:员工公司名称,学生所在的大学名称。

静态变量的优点:

  • 它能使程序存储器高效(即它节省内存)。

理解不使用静态变量的问题

----- --------  
     --- -------  
     ------ -----  
     ------ --------------  
-

假设在一所学校有500名学生,现在所有实例数据成员将在每次创建对象时获取内存。所有学生都有其唯一的注册ID:rollno和 name ,因此实例数据成员没有什么问题。college 指的是所有对象的共同属性。如果使它静态化(使用static关键字修饲),这个字段将只获得内存一次。

Java静态属性被共享给所有对象。

静态变量的示例

--------- -- ------ --------  

----- -------- -
    --- -------
    ------ -----
    ------ ------ ------- - ------

    ------------ -- ------ -- -
        ------ - --
        ---- - --
    -

    ---- --------- -
        ------------------------- - - - - ---- - - - - ---------
    -

    ------ ------ ---- ----------- ------- -
        -------- -- - --- ------------- ---------
        -------- -- - --- ------------- ---------

        -------------
        -------------
    -
-

上面代码执行结果如下 -

--- ----- ---
--- ----- ---

创建对象示例图如下所示 -

不使用静态变量的计数器程序

在这个例子中,我们创建了一个名为count的实例变量用来统计创建对象的数目,它在构造函数中执行递增。 由于实例变量在创建对象时要获取内存,每个对象都将具有实例变量的副本,如果它被递增了,它也不会反映到其他对象中。所以每个对象在count变量中的值还是1

----- ------- -
    --- ----- - ---- ---- --- ------ ---- -------- -- -------

    --------- -
        --------
        --------------------------
    -

    ------ ------ ---- ----------- ------- -

        ------- -- - --- ----------
        ------- -- - --- ----------
        ------- -- - --- ----------

    -
-

上面代码执行结果如下 -

-
-
-

计数器静态变量的程序
如上所述,静态变量将只获取一次内存,如果任何对象更改静态变量的值,它将保留其值,所有实例均可访问同一变量值。

----- -------- -
    ------ --- ----- - ---- ---- --- ------ ---- ---- --- ------ --- -----

    ---------- -
        --------
        --------------------------
    -

    ------ ------ ---- ----------- ------- -

        -------- -- - --- -----------
        -------- -- - --- -----------
        -------- -- - --- -----------

    -
-

上面代码执行结果如下 -

-
-
-

2. Java静态方法

如果在任何方法上应用static关键字,此方法称为静态方法。

  • 静态方法属于类,而不属于类的对象。
  • 可以直接调用静态方法,而无需创建类的实例。
  • 静态方法可以访问静态数据成员,并可以更改静态数据成员的值。

静态方法的示例

--------- -- -------- --- ------ -------- -- --- -------------- -------  

----- -------- -
    --- -------
    ------ -----
    ------ ------ ------- - ------

    ------ ---- -------- -
        ------- - --------
    -

    ------------ -- ------ -- -
        ------ - --
        ---- - --
    -

    ---- --------- -
        ------------------------- - - - - ---- - - - - ---------
    -

    ------ ------ ---- ----------- ------- -
        ------------------

        -------- -- - --- ------------- ---------
        -------- -- - --- ------------- ---------
        -------- -- - --- ------------- ---------

        -------------
        -------------
        -------------
    -
-

上面代码执行输出以下结果 -

--- ----- -----
--- ----- -----
--- ----- -----

执行正常计算的静态方法的另一个示例:

--------- -- --- ---- -- - ----- ------ -- ------ ------  

----- --------- -
    ------ --- -------- -- -
        ------ - - - - --
    -

    ------ ------ ---- ----------- ------- -
        --- ------ - ------------------
        ---------------------------
    -
-

上面代码执行输出以下结果 -

---

静态方法的限制

静态方法有两个主要限制。它们分别是:

  • 静态方法不能直接使用非静态数据成员或调用非静态方法。
  • thissuper两个关键字不能在静态上下文中使用。
----- - -
    --- - - ----- --- ------

    ------ ------ ---- ----------- ------- -
        ----------------------
    -
-

上面代码执行输出以下结果 -

-------------- ---- -----

为什么java main方法是静态的?

这是因为对象不需要调用静态方法,如果它是非静态方法,jvm首先要创建对象,然后调用main()方法,这将导致额外的内存分配的问题。

3. Java静态块

Java中的静态块主要有两个作用:

  • 用于初始化静态数据成员。
  • 它在类加载时在main方法之前执行。

静态块的示例

----- -- -
    ------ -
        -------------------------- ----- -- ----------
    -

    ------ ------ ---- ----------- ------- -
        ------------------------- -------
    -
-

上面代码执行输出以下结果 -

------ ----- -- -------
----- ----

可以执行程序没有main()方法吗?
答:是的,一种方式是静态块,但在以前旧的JDK版本中,不是在JDK 1.7。

----- -- -
    ------ -
        -------------------------- ----- -- ----------
        ---------------
    -
-

上面代码执行输出以下结果 -

------ ----- -- -------

在JDK7及以上版本中,输出将为:

--- -- ---- ---- ---- --- -- ---- ------
   ------ ------ ---- ------------- -----

上一篇:Java构造器(构造方法)
下一篇:Java this关键字