- Java面向?qū)ο筌浖_發(fā)
- 姚駿屏 汪衛(wèi)星主編
- 2370字
- 2018-12-29 19:04:15
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
- scikit-learn Cookbook
- Mobile Application Development:JavaScript Frameworks
- iOS 9 Game Development Essentials
- 自己動手實現(xiàn)Lua:虛擬機、編譯器和標準庫
- Learn to Create WordPress Themes by Building 5 Projects
- JavaScript語言精髓與編程實踐(第3版)
- 零基礎(chǔ)玩轉(zhuǎn)區(qū)塊鏈
- 我的第一本算法書
- Java開發(fā)入行真功夫
- 區(qū)塊鏈:以太坊DApp開發(fā)實戰(zhàn)
- Visual Basic程序設(shè)計習(xí)題解答與上機指導(dǎo)
- Apache Mesos Essentials
- Node.js全程實例
- Android系統(tǒng)原理及開發(fā)要點詳解
- Python深度學(xué)習(xí):模型、方法與實現(xiàn)