1. 程式人生 > >為什麼用static來修飾方法或者變數,有什麼好處

為什麼用static來修飾方法或者變數,有什麼好處

對於用static修飾的變數稱為靜態變數,也叫類變數。由類建立的所有物件都可以共用這個變數。類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在,而且僅一份。 
順便說一下例項變數,例項變數是類new了一個物件之後才有的,每個物件有自己的那一份。

當一個方法或者變數需要初始化載入,或者是經常被呼叫的時候可以加上static。用static修飾的方法可以用類名直接呼叫,不用的一定要先例項化一個物件然後才可以呼叫。 
用static修飾的方法叫靜態方法,也叫類方法。 
隨著類的載入而載入,就算沒有new一個物件,類方法還是存在,且僅存在一份。 
類方法內部可以呼叫靜態的變數和靜態的方法,而不能呼叫非靜態的變數和方法;反之,非靜態方法可以呼叫靜態的變數和方法。

結合程式碼理解一下:

public class ExtB{
    /類變數和例項變數都是全域性變數,無須初始化
      兩者的區別是:
      類變數由static修飾,由所有物件共享
      例項變數不用static修飾,由每個物件各自佔有自己的,類似於在例項化時建立了例項變數的副本
      /
    static int i = 10;//不必須初始化
    int j = 20 ;//不必須初始化
    public ExtB(int j) {
        this.j = j;
    }
    public ExtB() {
    }
    public void hello(){
        System.out.println("Hello,我是非靜態方法~");
        System.out.println("Hello,我是非靜態方法~我在呼叫類變數i= " + i);
        System.out.println("Hello,我是非靜態方法~我在呼叫例項變數j= " + j);
        System.out.println("Hello,我是非靜態方法~我在呼叫靜態方法helloStatic()");
        helloStatic();
    }
    public void hello1(){
        hello();//非靜態方法呼叫非靜態方法沒有問題
        System.out.println(j);//非靜態方法呼叫非靜態變數沒有問題
    }
    public static void helloStatic() {
        System.out.println("Hello,我是靜態方法~");
        System.out.println("Hello,我是靜態方法~我在呼叫類變數i= " + i);
        //System.out.println("Hello,我是靜態方法~我在呼叫例項變數j= " + j);//報錯,非靜態變數不能直接呼叫
    }
    public static void main(String[] args) {
        int x;//區域性變數必須初始化

        ExtB extb1 = new ExtB(30);
        ExtB extb2 = new ExtB(40);
        System.out.println("ExtB.i= "+ExtB.i);
        System.out.println("extb1.i= "+extb1.i);
        System.out.println("extb2.i= "+extb2.i);
        System.out.println("--------------------");

        //System.out.println("ExtB.j= "+ExtB.j);//報錯,非靜態變數不能直接呼叫
        System.out.println("new ExtB(1).j= "+new ExtB(1).j);
        System.out.println("extb1.j= "+extb1.j);
        System.out.println("extb2.j= "+extb2.j);
        System.out.println("--------------------");

        //System.out.println(x);//報錯,區域性變數必須初始化

        ExtB.helloStatic();//呼叫靜態方法,沒有問題,或者直接helloStatic();也行
        System.out.println("--------------------");

        //hello();//報錯,非靜態方法不能直接呼叫
        new ExtB().hello();
        System.out.println("--------------------");

    }
}

再給一個單例模式一種寫法:

class Single {
    private static Single single = null;
    public static Single getInstance(){
        synchronized (Single.class) {
            if (single == null) {
                single = new Single();
            }
        }
        return single;
    }
}

相關推薦

為什麼static修飾方法或者變數什麼好處

對於用static修飾的變數稱為靜態變數,也叫類變數。由類建立的所有物件都可以共用這個變數。類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在,而且僅一份。  順便說一下例項變數,例項變數是類new了一個物件之後才有的,每個物件有自己的那一份。 當一個方法

為什麼static修飾方法或者變數?用處?

對於用static修飾的變數稱為靜態變數,也叫類變數。由類建立的所有物件都可以共用這個變數。類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在,而且僅一份。 順便說一下例項變數,例項變數是類new了一個物件之後才有的,每個物件有自己的那一份。

java static關鍵字修飾方法

java static關鍵字修飾方法 1.java static關鍵字修飾方法的特性 2.注意要點 1.java static關鍵字修飾方法的特性 隨著類的載入而載入,在記憶體中也是獨一份 可以直接通過“

Python基礎(三)--- Python面向物件oop類、方法變數繼承

一、面向物件oop ----------------------------------------------------- 1.類 用來描述具有相同的屬性和方法的物件的集合。 它定義了該集合中每個物件所共有的屬性和方法。 物件是類的例項。

java 介面中用private、protected、public、default和status修飾方法變數

通常使用java 的介面時都是不帶修飾符的public interface Test { int a = 0; void test(); } 其實這個裡面有好多修飾符都是預設省略掉了。 正確的型別應該是: public interface Test { publ

Android Studio 快速檢視方法或者變數的註釋

在eclipse中,想要檢視一個方法或者變數的註釋時,只需要滑鼠懸停在上面就可以了,但是android studio怎麼看方法或變數的註釋呢?解決辦法:只要這個地方設定勾選一下:File > Seetings > General > Editor > Show quick doc on

static關鍵字修飾

Java裡面static一般用來修飾成員變數或函式。但有一種特殊用法是用static修飾內部類,普通類是不允許宣告為靜態的,只有內部類才可以。被static修飾的內部類可以直接作為一個普通類來使用,而不需例項一個外部類(見如下程式碼)

matlab迴圈批量生成多個變數神奇的eval()函式

可以用eval()函式,例如: b = ones(100); for i = 1 : 10 <span style="white-space:pre"> </span>eval

建構函式為什麼不能const修飾

const修飾函式表示該函式的返回值是const型別的,改返回值只能賦值給同類型的const變數。 const是可以修飾類的成員函式,但是該函式不能修改資料成員。建構函式也屬於類的成員函式,但是建構函

final修飾引用型變數變數所指物件的屬性是否能改變!!

請在下面的程式中找出錯誤的位置!!! package com.bdqn.cc.polymorphic; public cl

pythonrequests傳送https的請求時安全驗證

python用requests傳送https的請求時,有安全驗證,將驗證設定為false 即可verify=False content = {‘login’: ‘1234567890’, ‘password’: ‘123456’} r=requests.post(‘url…login’,

什麼是繫結變數什麼優缺點?

提到繫結變數,首先肯定想到硬解析和軟解析。繫結變數時解決硬解析的利器。 硬解析:就是一條沒有執行過的sql。資料庫首先對他進行語法分析和解析,過後,根據分析的資訊生成最好的執行計劃,然後執行。 軟解析:就是已經存在了一樣的sql語句了 繫結變數實質就是變數。類似於我們是用

static{}(即static塊)會在類被載入的時候執行且僅會被執行一次一般初始化靜態變數和呼叫靜態方法

這裡是一個工具類,因為連線配置資訊只需要執行一次就行所以採用static塊 static塊會最先執行 package com.my.jedis; import java.io.IOException; import java.io.InputStream; import

java基礎 靜態 static 問在多態中子類靜態方法覆蓋父類靜態方法父類引用調的是哪個方法

xtend java pos main 靜態方法 show extends ava pri 多態 package com.swift.jiekou; public class Jicheng_Tuotai_jingtai_diaoyong { publ

靜態內部類定義在類中任何方法static定義

static sys 需要 有一個 out col 定義 pub 不可 靜態內部類:(註意:前三種內部類與變量類似,所以可以對照參考變量) 靜態內部類定義在類中,任何方法外,用static定義。 靜態內部類只能訪問外部類的靜態成員。 生成(new)一個靜態內部類不需要外部類

通過Spring Bean 注入static變數設計一套適合測試開發生產環境的配置項

(http://blog.csdn.net/initphp/article/details/8834844) 這邊文章的目的主要是為了在spring開發web專案的時候,讓我們的測試,開發,生產環境的配置項 .properties作為配置檔案。 我們首先需要建

Java static修飾屬性(類變數)、static修飾方法(類方法

注:靜態的結構(static的屬性、方法、程式碼塊、內部類)的宣告週期要早於非靜態類,同時被回收也晚於非靜態類。 一、static修飾屬性(類變數)  1.由類建立的所有的物件,都共用這一屬性。  2.類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在

C/C++---static函式static成員函式static變數static成員變數理一理

首先說一下記憶體的五個區: 棧(stack):由編譯器自動分配釋放,存放函式的引數值,區域性變數的值(除static),其操作方式類似於資料結構中的棧。 堆(heap):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結

JAVA關鍵字Static作用 特點 利弊及建立時機 成員變數和靜態變數 Static修飾成員 修飾方法 修飾塊(靜態快)

(1)Static關鍵字修飾符 可以修飾成員(成員屬性 成員方法)(2)Static修飾成員的特點a 生命週期長 跟類相同b 用Static修飾的變數 所有物件共享c Static修飾變數 可以通過物件(.)點的形式呼叫 還可以通過類名(.)點方法呼叫(3)Static建立時

transient修飾的成員變數不能序列化為什麼ArrayList集合可以實現序列化

序列化有2種方式:  A、只是實現了Serializable介面。    序列化時,呼叫java.io.ObjectOutputStream的defaultWriteObject方法,將物件序列化。