日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java学习笔记之十五】Java中的static关键字解析

發(fā)布時間:2023/12/18 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java学习笔记之十五】Java中的static关键字解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java中的static關鍵字解析

  static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static關鍵字的用法和平常容易誤解的地方,最后列舉了一些面試筆試中常見的關于static的考題。以下是本文的目錄大綱:

  一.static關鍵字的用途

  二.static關鍵字的誤區(qū)

  三.常見的筆試面試題

  若有不正之處,希望諒解并歡迎批評指正。


一.static關鍵字的用途

  在《Java編程思想》P86頁有這樣一段話:

  “static方法就是沒有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過來是可以的。而且可以在沒有創(chuàng)建任何對象的前提下,僅僅通過類本身來調(diào)用static方法。這實際上正是static方法的主要用途。”

  這段話雖然只是說明了static方法的特殊之處,但是可以看出static關鍵字的基本作用,簡而言之,一句話來描述就是:

  方便在沒有創(chuàng)建對象的情況下來進行調(diào)用(方法/變量)。

  很顯然,被static關鍵字修飾的方法或者變量不需要依賴于對象來進行訪問,只要類被加載了,就可以通過類名去進行訪問。

  static可以用來修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來優(yōu)化程序性能。

1)static方法

  static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對象就可以進行訪問,因此對于靜態(tài)方法來說,是沒有this的,因為它不依附于任何對象,既然都沒有對象,就談不上this了。并且由于這個特性,在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因為非靜態(tài)成員方法/變量都是必須依賴具體的對象才能夠被調(diào)用。

  但是要注意的是,雖然在靜態(tài)方法中不能訪問非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問靜態(tài)成員方法/變量的。舉個簡單的例子:

  在上面的代碼中,由于print2方法是獨立于對象存在的,可以直接用過類名調(diào)用。假如說可以在靜態(tài)方法中訪問非靜態(tài)方法/變量的話,那么如果在main方法中有下面一條語句:

  MyObject.print2();

  此時對象都沒有,str2根本就不存在,所以就會產(chǎn)生矛盾了。同樣對于方法也是一樣,由于你無法預知在print1方法中是否訪問了非靜態(tài)成員變量,所以也禁止在靜態(tài)成員方法中訪問非靜態(tài)成員方法。

  而對于非靜態(tài)成員方法,它訪問靜態(tài)成員方法/變量顯然是毫無限制的。

  因此,如果說想在不創(chuàng)建對象的情況下調(diào)用某個方法,就可以將這個方法設置為static。我們最常見的static方法就是main方法,至于為什么main方法必須是static的,現(xiàn)在就很清楚了。因為程序在執(zhí)行main方法的時候沒有創(chuàng)建任何對象,因此只有通過類名來訪問。

  另外記住,即使沒有顯示地聲明為static,類的構(gòu)造器實際上也是靜態(tài)方法。

2)static變量

  static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態(tài)變量是對象所擁有的,在創(chuàng)建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

  static成員變量的初始化順序按照定義的順序進行初始化。

3)static代碼塊

  static關鍵字還有一個比較關鍵的作用就是 用來形成靜態(tài)代碼塊以優(yōu)化程序性能。static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執(zhí)行每個static塊,并且只會執(zhí)行一次。

  為什么說static塊可以用來優(yōu)化程序性能,是因為它的特性:只會在類加載的時候執(zhí)行一次。下面看個例子:

?

1 class Person{ 2 private Date birthDate; 3 4 public Person(Date birthDate) { 5 this.birthDate = birthDate; 6 } 7 8 boolean isBornBoomer() { 9 Date startDate = Date.valueOf("1946"); 10 Date endDate = Date.valueOf("1964"); 11 return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; 12 } 13 }

?

  isBornBoomer是用來這個人是否是1946-1964年出生的,而每次isBornBoomer被調(diào)用的時候,都會生成startDate和birthDate兩個對象,造成了空間浪費,如果改成這樣效率會更好:

?

1 class Person{ 2 private Date birthDate; 3 private static Date startDate,endDate; 4 static{ 5 startDate = Date.valueOf("1946"); 6 endDate = Date.valueOf("1964"); 7 } 8 9 public Person(Date birthDate) { 10 this.birthDate = birthDate; 11 } 12 13 boolean isBornBoomer() { 14 return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; 15 } 16 }

?

因此,很多時候會將一些只需要進行一次的初始化操作都放在static代碼塊中進行。

二.static關鍵字的誤區(qū)

1.static關鍵字會改變類中成員的訪問權(quán)限嗎?

  有些初學的朋友會將java中的static與C/C++中的static關鍵字的功能混淆了。在這里只需要記住一點:與C/C++中的static不同,Java中的static關鍵字不會影響到變量或者方法的作用域。在Java中能夠影響到訪問權(quán)限的只有private、public、protected(包括包訪問權(quán)限)這幾個關鍵字。看下面的例子就明白了:

  提示錯誤"Person.age 不可視",這說明static關鍵字并不會改變變量和方法的訪問權(quán)限。

2.能通過this訪問靜態(tài)成員變量嗎?

  雖然對于靜態(tài)方法來說沒有this,那么在非靜態(tài)方法中能夠通過this訪問靜態(tài)成員變量嗎?先看下面的一個例子,這段代碼輸出的結(jié)果是什么?

1 public class Main {   2 static int value = 33; 3 4 public static void main(String[] args) throws Exception{ 5 new Main().printValue(); 6 } 7 8 private void printValue(){ 9 int value = 3; 10 System.out.println(this.value); 11 } 12 } 33

這里面主要考察隊this和static的理解。this代表什么?this代表當前對象,那么通過new Main()來調(diào)用printValue的話,當前對象就是通過new Main()生成的對象。而static變量是被對象所享有的,因此在printValue中的this.value的值毫無疑問是33。在printValue方法內(nèi)部的value是局部變量,根本不可能與this關聯(lián),所以輸出結(jié)果是33。在這里永遠要記住一點:靜態(tài)成員變量雖然獨立于對象,但是不代表不可以通過對象去訪問,所有的靜態(tài)方法和靜態(tài)變量都可以通過對象訪問(只要訪問權(quán)限足夠)。

3.static能作用于局部變量么?

  在C/C++中static是可以作用域局部變量的,但是在Java中切記:static是不允許用來修飾局部變量。不要問為什么,這是Java語法的規(guī)定。


三.常見的筆試面試題

  下面列舉一些面試筆試中經(jīng)常遇到的關于static關鍵字的題目,僅供參考,如有補充歡迎下方留言。

1.下面這段代碼的輸出結(jié)果是什么?

1 public class Test extends Base{ 2 3 static{ 4 System.out.println("test static"); 5 } 6 7 public Test(){ 8 System.out.println("test constructor"); 9 } 10 11 public static void main(String[] args) { 12 new Test(); 13 } 14 } 15 16 class Base{ 17 18 static{ 19 System.out.println("base static"); 20 } 21 22 public Base(){ 23 System.out.println("base constructor"); 24 } 25 } base static test static base constructor test constructor

至于為什么是這個結(jié)果,我們先不討論,先來想一下這段代碼具體的執(zhí)行過程,在執(zhí)行開始,先要尋找到main方法,因為main方法是程序的入口,但是在執(zhí)行main方法之前,必須先加載Test類,而在加載Test類的時候發(fā)現(xiàn)Test類繼承自Base類,因此會轉(zhuǎn)去先加載Base類,在加載Base類的時候,發(fā)現(xiàn)有static塊,便執(zhí)行了static塊。在Base類加載完成之后,便繼續(xù)加載Test類,然后發(fā)現(xiàn)Test類中也有static塊,便執(zhí)行static塊。在加載完所需的類之后,便開始執(zhí)行main方法。在main方法中執(zhí)行new Test()的時候會先調(diào)用父類的構(gòu)造器,然后再調(diào)用自身的構(gòu)造器。因此,便出現(xiàn)了上面的輸出結(jié)果。

2.這段代碼的輸出結(jié)果是什么?

1 public class Test { 2 Person person = new Person("Test"); 3 static{ 4 System.out.println("test static"); 5 } 6 7 public Test() { 8 System.out.println("test constructor"); 9 } 10 11 public static void main(String[] args) { 12 new MyClass(); 13 } 14 } 15 16 class Person{ 17 static{ 18 System.out.println("person static"); 19 } 20 public Person(String str) { 21 System.out.println("person "+str); 22 } 23 } 24 25 26 class MyClass extends Test { 27 Person person = new Person("MyClass"); 28 static{ 29 System.out.println("myclass static"); 30 } 31 32 public MyClass() { 33 System.out

轉(zhuǎn)載于:https://www.cnblogs.com/DWVictor/p/10507657.html

總結(jié)

以上是生活随笔為你收集整理的【Java学习笔记之十五】Java中的static关键字解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。