Java基礎-基礎語法-變數與常量

hughjin發表於2020-12-18

Java工程師知識樹 / Java基礎

常量

常量有哪些

整數常量:包括了所有的整數
小數常量:包括了所有的小數
布林型常量:較為特殊它只有兩個值true和false,這個常量主要用於判斷真與假,應用的較為廣泛,比較常用。
字元常量:將一個字母、數字或者符號用單引號進行(’ ')標識。
字串常量:將一個或者多個字母、數字或者符號用單引號進行(" ")標識。

注意:

1)區分字元常量和字串常量
字元常量是單引號引起來的單個,字串常量是雙引號引起來的不限長度
由於java採用Unicode編碼,每個字元佔兩個位元組,因而可用天十六進位制編碼形式表示,當然也可以用一箇中文表示(單箇中文佔用兩個位元組)
2)"常量"這個名次還會用在另外其他語境中表示值不可變的變數

定義常量的方式有哪些

	/**
     * Method One 採用介面(Interface)的中變數預設為static final的特性
     */
    interface ConstantInterface {
        String SUNDAY = "SUNDAY";
        String MONDAY = "MONDAY";
        String TUESDAY = "TUESDAY";
        String WEDNESDAY = "WEDNESDAY";
        String THURSDAY = "THURSDAY";
        String FRIDAY = "FRIDAY";
        String SATURDAY = "SATURDAY";
    }
    /**
     * Method Two 採用了Java 5.0中引入的Enum型別
     */
    enum ConstantEnum {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
    }
    /**
     * Method Three 採用了在final修飾的普通類中使用static final修飾變數的方法
     */
    public final class ConstantClassField {
        public static final String SUNDAY = "SUNDAY";
        public static final String MONDAY = "MONDAY";
        public static final String TUESDAY = "TUESDAY";
        public static final String WEDNESDAY = "WEDNESDAY";
        public static final String THURSDAY = "THURSDAY";
        public static final String FRIDAY = "FRIDAY";
        public static final String SATURDAY = "SATURDAY";
    }
    /**
     * Method Four 類似方法三,但是通過函式來獲取常量
     */
    class ConstantClassFunction {
        private static final String SUNDAY = "SUNDAY";
        private static final String MONDAY = "MONDAY";
        private static final String TUESDAY = "TUESDAY";
        private static final String WEDNESDAY = "WEDNESDAY";
        private static final String THURSDAY = "THURSDAY";
        private static final String FRIDAY = "FRIDAY";
        private static final String SATURDAY = "SATURDAY";
        public static String getSunday() {
            return SUNDAY;
        }
        public static String getMonday() {
            return MONDAY;
        }
        public static String getTuesday() {
            return TUESDAY;
        }
        public static String getWednesday() {
            return WEDNESDAY;
        }
        public static String getThursday() {
            return THURSDAY;
        }
        public static String getFirday() {
            return FRIDAY;
        }
        public static String getSaturday() {
            return SATURDAY;
        }
    }
    public class TestConstant {
        static final String day = "saturday";
        public static void main(String[] args) {
            System.out.println("Is today Saturday?");
            System.out.println(day.equalsIgnoreCase(ConstantInterface.SATURDAY));
            System.out.println(day.equalsIgnoreCase(ConstantEnum.SATURDAY.name()));
            System.out.println(day.equalsIgnoreCase(ConstantClassField.SATURDAY));
            System.out.println(day.equalsIgnoreCase(ConstantClassFunction
                    .getSaturday()));
        }
    }

分析:首先定義全域性變數似乎有違Java的物件導向的封裝特性,增加的耦合。
所以最佳的方法是避免定義全域性變數。
如果是引數等,可以寫入配置檔案。
如果實在是必須的,方法二是最為推薦的。
方法三是大家都能想到的,非常的直觀。
方法一和方法三本質上一樣。
方法四提供了靈活性。

阿里文件和常量有關說明:

【推薦】介面類中的方法和屬性不要加任何修飾符號(public 也不要加),保持程式碼的簡潔性,並加上有效的javadoc註釋。儘量不要在介面裡定義變數,如果一定要定義變數,肯定是與介面方法相關,並且是整個應用的基礎常量。
正例:介面方法簽名:void f();
介面基礎常量表示:String COMPANY = “alibaba”;
反例:介面方法定義:public abstract void f();
說明:JDK8中介面允許有預設實現,那麼這個default方法,是對所有實現類都有價值的預設實現

【強制】不允許出現任何魔法值(即未經定義的常量)直接出現在程式碼中。
反例: String key=”Id#taobao_”+tradeId;
cache.put(key, value);

【推薦】不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。如:快取相關的常量放在類:CacheConsts下;系統配置相關的常量放在類:ConfigConsts類下。
說明:大而全的常量類,非得ctrl+f才定位到修改的常量,不利於理解,也不利於維護。
【推薦】常量的複用層次有五層:跨應用共享常量、應用內共享常量、子工程內共享常量、包內共享常量、類內共享常量。
1) 跨應用共享常量:放置在二方庫中,通常是client.jar中的const目錄下。
2) 應用內共享常量:放置在一方庫的modules中的const目錄下。
反例:易懂變數也要統一定義成應用內共享常量,兩位攻城師在兩個類中分別定義了表示“是”的變數:
類A中:public static final String YES = “yes”;
類B中:public static final String YES = “y”;
A.YES.equals(B.YES),預期是true,但實際返回為false,導致產生線上問題。
3) 子工程內部共享常量:即在當前子工程的const目錄下。
4) 包內共享常量:即在當前包下單獨建const目錄下。
5) 類內共享常量:直接在類內部private static final定義。

【強制】避免通過一個類的物件引用訪問此類的靜態變數或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可。

變數

概念:

java變數是程式中最基本的儲存單元,其要素包括變數名,變數型別和作用域。

語法:

java程式中每一個變數都屬於特定的資料型別,在使用前必需對其進行宣告,宣告格式為:
type varName [=value]

例如:

int i =100;
foloat f=12.3f;
double d1,d2,d3=0.123;//(宣告瞭三個變數,其中d1,d2是預設值,d3=0.123)
String s="hello"

**注意:**從本質上講,變數其實是記憶體中的一小塊區域,使用變數名來訪問這塊區域,因此,每一個變數使用前必需先宣告,然後必需進行賦值,才能使用。
java變數分類

分類:

按被宣告的位置劃分:

區域性變數:方法或語句塊內部定義的變數,只能在被定義的方法或語句塊內使用
成員變數:方法外部、類的內部定義的變數,可以在整個類中使用,包括類裡的方法或語句塊內也可以使用

注意:類外面是不能有變數的宣告的

成員變數與區域性變數的區別

1、在類中的位置不同
成員變數:在類中方法外面
區域性變數:在方法或者程式碼塊中,或者方法的宣告上(即在引數列表中)
2、在記憶體中的位置不同,可以看看Java程式記憶體的簡單分析
成員變數:在堆中(方法區中的靜態區)
區域性變數:在棧中
3、生命週期不同
成員變數:隨著物件的建立而存在,隨著物件的消失而消失
區域性變數:隨著方法的呼叫或者程式碼塊的執行而存在,隨著方法的呼叫完畢或者程式碼塊的執行完畢而消失
4、初始值
成員變數:有預設初始值
區域性變數:沒有預設初始值,使用之前需要賦值,否則編譯器會報錯(The local variable xxx may not have been initialized)

按所屬的資料型別劃分:

基本資料型別變數
引用資料型別變數

image.png


歡迎關注簡書
https://www.jianshu.com/u/2d59a41f50a9

相關文章