官术网_书友最值得收藏!

2.1.6 static靜態(tài)成員

1.靜態(tài)類成員

通常,類的成員必須屬于一個具體化對象才能訪問。但Java也提供了不用創(chuàng)建對象而直接讓類中成員工作的機制。只要在該成員的聲明前面加上關(guān)鍵字static即可。當(dāng)聲明一個成員為static時,可以在類的任何對象創(chuàng)建之前訪問它。static成員的最常見的例子是main()方法,該方法不是作為一個對象的成員被運行的。

被聲明為static的成員變量就是靜態(tài)變量,也稱為類變量。當(dāng)聲明該類的對象時,在對象中不生成static變量的副本,類的所有實例將共享同一個static變量。

同理,被聲明為static的成員方法是靜態(tài)方法,也稱為類方法。靜態(tài)方法有幾條限制:

(1)它們僅可以調(diào)用其他static方法。

(2)它們只能訪問static數(shù)據(jù)成員。

(3)它們不能以任何方式引用this或super(關(guān)鍵字super與繼承有關(guān),下一節(jié)介紹),因為this和super都是指向一個具體對象。

2.靜態(tài)代碼塊

static塊(即靜態(tài)代碼塊),這個塊僅在該類被第一次加載時執(zhí)行一次。靜態(tài)代碼塊的語法格式:

      static {
          // 程序塊
      }

靜態(tài)代碼塊不是類的方法,沒有方法名、返回值和參數(shù)表。靜態(tài)代碼塊也與類方法一樣,不能使用非靜態(tài)變量及方法,也不能使用this或super關(guān)鍵字。

例2-4】 static方法、static變量、static初始塊演示。

            public class UseStatic{
                static int a=3;                        // 靜態(tài)變量(類變量),并初始化
                static int b;                          // 靜態(tài)變量
                int c=10;                             // 實例變量
                static void display(int x){             // 靜態(tài)方法(類方法)
                    System.out.println("x = " + x);
                    System.out.println("a = " + a);
                    System.out.println("b = " + b);
                    //System.out.println("c="+c);    //靜態(tài)方法不能直接調(diào)用非靜態(tài)成員
                }
                static{                              // 靜態(tài)代碼塊
                    System.out.println("靜態(tài)代碼塊執(zhí)行開始");
                    b=a*4;                           // 初始化靜態(tài)變量b
                }
                public static void main(String  args[]){
                    display(42);                     // 直接調(diào)用靜態(tài)方法
                }
            }

一旦裝載了UseStatic類,所有的static語句都被運行。首先,a被設(shè)置為3;然后static塊執(zhí)行(打印一條信息),最后,b被初始化為a*4即12;然后執(zhí)行main()方法,main()中調(diào)用display()類方法,把42傳遞到x。三條println()語句引用兩個static變量a、b,一個局部變量x。而c由于是非靜態(tài)變量,因此不能直接被靜態(tài)方法調(diào)用。

下面是該程序的輸出:

            靜態(tài)代碼塊執(zhí)行開始
            x = 42
            a = 3
            b = 12

靜態(tài)方法和變量可以獨立于任何對象使用,僅需指定它們的類名,后跟一個“.”(點)運算符。可以用兩種方式調(diào)用靜態(tài)成員,它們的作用相同,因為不管該類有多少個對象都只存在一個靜態(tài)成員。

靜態(tài)變量: 類名.靜態(tài)變量名

類對象.靜態(tài)變量名

靜態(tài)方法: 類名.靜態(tài)方法名(?。?/p>

類對象.靜態(tài)方法名( )

例如,如果希望從類UseStatic外調(diào)用一個static方法,可以使用下面的形式:

            UseStatic.display(42);

其中UseStatic是類的名字,在該類中直接調(diào)用static方法,這種格式與通過對象調(diào)用非static方法的格式類似??梢杂猛瑯拥姆绞絹碓L問static變量——類名加上“.”(點)運算符。

請看如下代碼,注意static方法callme()和static變量b是如何被訪問的。

            class StaticDemo{
                static int a=42;       // 靜態(tài)變量
                static int b=99;       // 靜態(tài)變量
                static void callme(){  // 靜態(tài)方法
                    System.out.println("a = " + a);
                }
            }
            public class StaticByName{
                public static void main(String  args[]){
                    StaticDemo.callme();  // 不需創(chuàng)建對象,通過類名直接調(diào)用靜態(tài)方法
                    System.out.println("b="+StaticDemo.b);  // 通過類名直接調(diào)用靜態(tài)變量
                }
            }

下面是該程序的輸出:

            a = 42
            b = 99

特別提示:

靜態(tài)成員表示該類所有對象將共有同一個成員,如果一個對象將靜態(tài)成員改變,將造成由該類生成的所有對象中的該成員發(fā)生相同改變。就好比如果全世界人只有一個錢罐,任何人往錢罐中放入一塊錢,對于其他人來說他們的錢罐中也多了一塊錢。

工作分解-操作方案

1.分析抽象出類;

2.按照類圖編制出類框架;

3.實現(xiàn)類方法;

4.創(chuàng)建對象;

5.調(diào)用對象中的方法完成計算功能。

工作實施

1.分析抽象出類

根據(jù)類成員的訪問權(quán)限可知,要使長和寬兩個屬性不允許另一個類訪問,那么其只能是private類型的。存在一個矩形類Rectangle,該類包含兩個private類型成員變量:長length和寬width,以及7個成員方法:setter和getter方法分別用于設(shè)置和獲取各屬性,一個帶參構(gòu)造方法Rectangle(double width, double length)用于初始化數(shù)據(jù)成員,perimeter()和area()方法分別用于計算長方形的周長和面積,如圖2-4所示。另外,還有兩個包:一個包com.bean,用于存放Rectangle類;另一個包com.test,用于存放主類RectangleTest。

圖2-4 長方形類(Rectangle)圖

2.按照類圖編制出類框架

先創(chuàng)建包com.bean,然后在該包中定義Rectangle類。

        // 源文件Rectangle.java
        package com.bean;
        public class Rectangle {
                                                // 聲明private類型的成員變量,類外不能被訪問
            private double length;                // 長
            private double width;                 // 寬
                                                // 帶參構(gòu)造方法(可以在所有包內(nèi)被訪問)
            public Rectangle(double length, double width) {
            }
            /*********以下定義成員方法*********/
            public double getLength(){            // 獲取長方形的長
            }
            public void setLength(double length){  // 設(shè)置長方形的長
            }
            public double getWidth(){             // 獲取長方形的寬
            }
            public void setWidth(double width){    // 設(shè)置長方形的寬
            }
            public double perimeter(){            // 求長方形的周長
            }
            public double area(){                 // 求長方形的面積
            }
        }

3.實現(xiàn)類中的方法

        // 帶參構(gòu)造方法,用于初始化長方形的長和寬
       public Rectangle(double length, double width){
            this.width=width;                 //this關(guān)鍵字表示當(dāng)前對象
            this.length = length;
       }
       public void setLength(double length){      // 設(shè)置長方形的長
            this.length = length;
       }
       public double getLength(){                // 獲取長方形的長
            return length;
       }
       public void setWidth(double width){        // 設(shè)置長方形的寬
            this.width = width;
       }
       public double getWidth(){                 // 獲取長方形的寬
            return width;
       }
        public double perimeter(){              // 求長方形的周長
            return 2*(this.getLength() + this.getWidth());
        }
        public double area(){                  // 求長方形的面積
            return this.length*this.width;        // 調(diào)用當(dāng)前對象的成員變量
        }

4.定義主類

先新建一個包com.test,然后在該包中定義一個主類RectangleTest。

        // 源文件RectangleTest.java
        package com.test;
        // 用import引入包
        public class RectangleTest {
            public static void main(String[] args) {
                // 創(chuàng)建類的對象
            }
        }

5.創(chuàng)建類的對象

        // 第1步:將主類中“// 用import引入包”一行語句替換成下面一行語句
        import com.bean.Rectangle;  // 導(dǎo)入com.bean包中的Rectangle類
        // 第2步:在主類的主方法main()中創(chuàng)建對象
        Rectangle rect=new Rectangle(10.0,5.0);// 調(diào)用帶參構(gòu)造方法

6.訪問對象中成員方法完成具體工作

        // 通過調(diào)用成員方法來打印出指定長方形的長、寬、周長和面積
        System.out.println("調(diào)用帶參構(gòu)造方法創(chuàng)建的長方形類對象rect:");
        System.out.print("length = " + rect.getLength() + " width = "+ rect.getWidth());
        System.out.println("perimeter="+rect.perimeter()+"  area="+rect.area());

7.代碼調(diào)試運行

(1)完整源代碼如下:

        // 源文件Rectangle.java
        package com.bean;
        /**
         * 長方形類
         * @author lee
         */
        public class Rectangle {
        // 聲明private類型的成員變量,類外不能被訪問
        private double length;// 長
        private double width;// 寬
        // 帶參構(gòu)造方法(可以在所有包內(nèi)被訪問),用于初始化長方形的長和寬
        public Rectangle(double length, double width) {
            this.length=length;   //this關(guān)鍵字表示當(dāng)前對象
            this.width = width;
        }
        public double getLength(){  // 獲取長方形的長
            return length;
        }
        public void setLength(double length){  // 設(shè)置長方形的長
            this.length = length;
        }
        public double getWidth(){  // 獲取長方形的寬
            return width;
        }
        public void setWidth(double width){  // 設(shè)置長方形的寬
            this.width = width;
        }
        public double perimeter(){// 求長方形的周長
            return 2 * (this.getLength() + this.getWidth());
        }
        public double area(){// 求長方形的面積
            return this.length*this.width;// 調(diào)用當(dāng)前對象的成員變量
        }
        }
        // 源文件RectangleTest.java
        package com.test;// 所屬包
        import com.bean.Rectangle;  // 導(dǎo)入com.bean包中的Rectangle類
        public class RectangleTest {
        public static void main(String[] args) {
            Rectangle rect=new Rectangle(10.0,5.0);// 調(diào)用帶參構(gòu)造方法
            // 通過調(diào)用成員方法來打印出指定長方形的長、寬、周長和面積
            System.out.println("調(diào)用帶參構(gòu)造方法創(chuàng)建的長方形類對象rect:");
            System.out.print("length="+rect.getLength()+"  width="+rect.getWidth());
            System.out.println("  perimeter="+rect.perimeter()+"  area="+rect.area());
        }
        }

(2)調(diào)試結(jié)果:

        調(diào)用帶參構(gòu)造方法創(chuàng)建的長方形類對象rect:
        length=10.0  width=5.0  perimeter=30.0  area=50.0
主站蜘蛛池模板: 客服| 崇仁县| 根河市| 来凤县| 胶南市| 普陀区| 茌平县| 奈曼旗| 于都县| 庆安县| 磐安县| 汉川市| 平远县| 台州市| 洪泽县| 泽州县| 巴里| 巨野县| 长丰县| 高阳县| 梁平县| 安徽省| 娱乐| 宁远县| 庆阳市| 利津县| 江源县| 确山县| 禄劝| 舒兰市| 彭山县| 永清县| 武鸣县| 会东县| 侯马市| 吉水县| 彭山县| 元朗区| 高尔夫| 门源| 富裕县|