程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中的static症結字周全解析

Java中的static症結字周全解析

編輯:關於JAVA

Java中的static症結字周全解析。本站提示廣大學習愛好者:(Java中的static症結字周全解析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中的static症結字周全解析正文


static症結字是許多同伙在編寫代碼和浏覽代碼時碰著的比擬難以懂得的一個症結字,也是各年夜公司的面試官愛好在面試時問到的常識點之一。上面就先講述一下static症結字的用法戰爭常輕易誤會的處所,最初羅列了一些面試口試中罕見的關於static的考題。以下是本文的目次年夜綱:

  一.static症結字的用處

  二.static症結字的誤區

  三.罕見的口試面試題

  如有不正的地方,願望原諒並迎接批駁斧正。

  請尊敬作者休息結果,轉載請標明原文鏈接:

  http://www.cnblogs.com/dolphin0520/p/3799052.html

一.static症結字的用處

  “static辦法就是沒有this的辦法。在static辦法外部不克不及挪用非靜態辦法,反過去是可以的。並且可以在沒有創立任何對象的條件下,僅僅經由過程類自己來挪用static辦法。這現實上恰是static辦法的重要用處。”

  這段話固然只是解釋了static辦法的特別的地方,然則可以看出static症結字的根本感化,簡而言之,一句話來描寫就是:

  便利在沒有創立對象的情形上去停止挪用(辦法/變量)。

  很明顯,被static症結字潤飾的辦法或許變量不須要依附於對象來停止拜訪,只需類被加載了,便可以經由過程類名去停止拜訪。

  static可以用來潤飾類的成員辦法、類的成員變量,別的可以編寫static代碼塊來優化法式機能。

1)static辦法

  static辦法普通稱作靜態辦法,因為靜態辦法不依附於任何對象便可以停止拜訪,是以關於靜態辦法來講,是沒有this的,由於它不依靠於任何對象,既然都沒有對象,就談不上this了。而且因為這個特征,在靜態辦法中不克不及拜訪類的非靜態成員變量和非靜態成員辦法,由於非靜態成員辦法/變量都是必需依附詳細的對象能力夠被挪用。

  然則要留意的是,固然在靜態辦法中不克不及拜訪非靜態成員辦法和非靜態成員變量,然則在非靜態成員辦法中是可以拜訪靜態成員辦法/變量的。舉個簡略的例子:

  在下面的代碼中,因為print2辦法是自力於對象存在的,可以直接用過類名挪用。假設說可以在靜態辦法中拜訪非靜態辦法/變量的話,那末假如在main辦法中有上面一條語句:

  MyObject.print2();

  此時對象都沒有,str2基本就不存在,所以就會發生抵觸了。異樣關於辦法也是一樣,因為你沒法預知在print1辦法中能否拜訪了非靜態成員變量,所以也制止在靜態成員辦法中拜訪非靜態成員辦法。

  而關於非靜態成員辦法,它拜訪靜態成員辦法/變量明顯是毫無窮制的。

  是以,假如說想在不創立對象的情形下挪用某個辦法,便可以將這個辦法設置為static。我們最多見的static辦法就是main辦法,至於為何main辦法必需是static的,如今就很清晰了。由於法式在履行main辦法的時刻沒有創立任何對象,是以只要經由過程類名來拜訪。

  別的記住,即便沒有顯示地聲明為static,類的結構器現實上也是靜態辦法。

2)static變量

  static變量也稱作靜態變量,靜態變量和非靜態變量的差別是:靜態變量被一切的對象所同享,在內存中只要一個正本,它當且僅當在類首次加載時會被初始化。而非靜態變量是對象所具有的,在創立對象的時刻被初始化,存在多個正本,各個對象具有的正本互不影響。

  static成員變量的初始化次序依照界說的次序停止初始化。

3)static代碼塊

  static症結字還有一個比擬症結的感化就是 用來構成靜態代碼塊以優化法式機能。static塊可以置於類中的任何處所,類中可以有多個static塊。在類首次被加載的時刻,會依照static塊的次序來履行每一個static塊,而且只會履行一次。

  為何說static塊可以用來優化法式機能,是由於它的特征:只會在類加載的時刻履行一次。上面看個例子:

class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
} 

  isBornBoomer是用來這小我能否是1946-1964年出身的,而每次isBornBoomer被挪用的時刻,都邑生成startDate和birthDate兩個對象,形成了空間糟蹋,假如改成如許效力會更好:

class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}

  是以,許多時刻會將一些只須要停止一次的初始化操作都放在static代碼塊中停止。

二.static症結字的誤區

1.static症結字會轉變類中成員的拜訪權限嗎?

  有些初學的同伙會將java中的static與C/C++中的static症結字的功效混雜了。在這裡只須要記住一點:與C/C++中的static分歧,Java中的static症結字不會影響到變量或許辦法的感化域。在Java中可以或許影響到拜訪權限的只要private、public、protected(包含包拜訪權限)這幾個症結字。看上面的例子就明確了:

  提醒毛病"Person.age 弗成視",這解釋static症結字其實不會轉變變量和辦法的拜訪權限。

2.能經由過程this拜訪靜態成員變量嗎?

  固然關於靜態辦法來講沒有this,那末在非靜態辦法中可以或許經由過程this拜訪靜態成員變量嗎?先看上面的一個例子,這段代碼輸入的成果是甚麼?

public class Main {  
static int value = 33; 
public static void main(String[] args) throws Exception{
new Main().printValue();
}
private void printValue(){
int value = 3;
System.out.println(this.value);
}
}

33

  這外面重要考核隊this和static的懂得。this代表甚麼?this代表以後對象,那末經由過程new Main()來挪用printValue的話,以後對象就是經由過程new Main()生成的對象。而static變量是被對象所享有的,是以在printValue中的this.value的值毫無疑問是33。在printValue辦法外部的value是部分變量,基本弗成能與this聯系關系,所以輸入成果是33。在這裡永久要記住一點:靜態成員變量固然自力於對象,然則不代表弗成以經由過程對象去拜訪,一切的靜態辦法和靜態變量都可以經由過程對象拜訪(只需拜訪權限足夠)。

3.static能感化於部分變量麼?

  在C/C++中static是可以感化域部分變量的,然則在Java中切記:static是不許可用來潤飾部分變量。不要問為何,這是Java語法的劃定。

三.罕見的口試面試題

  上面羅列一些面試口試中常常碰到的關於static症結字的標題,僅供參考,若有彌補迎接下方留言。

1.上面這段代碼的輸入成果是甚麼?

public class Test extends Base{
static{
System.out.println("test static");
}
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args) {
new Test();
}
}
class Base{
static{
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
}

base static
test static
base constructor
test constructor

  至於為何是這個成果,我們先不評論辯論,先來想一下這段代碼詳細的履行進程,在履行開端,先要尋覓到main辦法,由於main辦法是法式的進口,然則在履行main辦法之前,必需先加載Test類,而在加載Test類的時刻發明Test類繼續自Base類,是以會轉去先加載Base類,在加載Base類的時刻,發明有static塊,便履行了static塊。在Base類加載完成以後,便持續加載Test類,然後發明Test類中也有static塊,便履行static塊。在加載完所需的類以後,便開端履行main辦法。在main辦法中履行new Test()的時刻會先挪用父類的結構器,然後再挪用本身的結構器。是以,便湧現了下面的輸入成果。

2.這段代碼的輸入成果是甚麼?

public class Test {
Person person = new Person("Test");
static{
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}

test static 1
test static 2

  固然在main辦法中沒有任何語句,然則照樣會輸入,緣由下面曾經講述過了。別的,static塊可以湧現類中的任何處所(只需不是辦法外部,記住,任何辦法外部都不可),而且履行是依照static塊的次序履行的。

以上所述是小編給年夜家引見的Java中的static症結字周全解析,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved