溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JDK10中本地變量類(lèi)型var的用法

發(fā)布時(shí)間:2020-07-23 17:23:26 來(lái)源:億速云 閱讀:169 作者:小豬 欄目:編程語(yǔ)言

這篇文章主要講解了JDK10中本地變量類(lèi)型var的用法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

簡(jiǎn)介

java以面向?qū)ο蟮奶匦燥@著于世并得到了蓬勃的發(fā)展。在語(yǔ)言的發(fā)展過(guò)程中,為了讓java語(yǔ)言更加簡(jiǎn)潔和方便使用,JDK也在不斷的進(jìn)行改進(jìn)。

今天本文將要介紹一下JDK10中引入的本地變量類(lèi)型var。

為什么我們需要var

類(lèi)型推斷是很多編程語(yǔ)言都具有的特性,編譯器可以在我們不指定具體變量類(lèi)型的情況下推斷出該變量的實(shí)際類(lèi)型。

類(lèi)型推斷的出現(xiàn),可以讓程序員的代碼更加靈活,利于維護(hù)和編寫(xiě)。其實(shí)我們一直都有使用到類(lèi)型推斷。

JDK8中引入的lambda表達(dá)式就是類(lèi)型推斷的一個(gè)非常有用的例子:

int maxWeight = blocks.stream().filter(b -> b.getColor() == BLUE).mapToInt(Block::getWeight)
.max();

上面的例子中blocks是一個(gè)Stream<Block>類(lèi)型,在filter中使用到的b實(shí)際上就沒(méi)有指定其類(lèi)型,它的類(lèi)型是從Stream中推斷出來(lái)的。

再看一個(gè)線(xiàn)程池的例子:

ExecutorService executorService= Executors.newSingleThreadExecutor();
Runnable runnable=new Runnable() {
 @Override
 public void run() {
  log.info("inside runnable");
  }
 };
 executorService.submit(runnable);

很多時(shí)候,我們從變量的名字就已經(jīng)知道了這個(gè)變量到底是什么類(lèi)型的,那么上面的例子如果用var來(lái)改寫(xiě)就可以像這樣:

var executorService= Executors.newSingleThreadExecutor();
var runnable=new Runnable() {
 @Override
 public void run() {
   log.info("inside runnable");
  }
 };
executorService.submit(runnable);

代碼更加簡(jiǎn)潔,程序員寫(xiě)起來(lái)也更加方便。

如果上面的例子還不能夠提起你使用var的興趣,那么下面的例子你一定很樂(lè)意使用var了。

假如我們有一個(gè)非常非常長(zhǎng)的類(lèi)名:

ItIsAVeryLongNameJavaClass itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();

寫(xiě)起來(lái)是不是超級(jí)麻煩,代碼看起也非常冗余,這時(shí)候我們就可以將其簡(jiǎn)化為:

var itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();

var使用在什么地方

首先var代表的是本地變量,所以,只有本地變量才能夠使用var。

其次var在定義的時(shí)候就必須被初始化:

var a; //Invalid Declaration - - Cannot use 'var' on variable without initializer
var a = 100; //Valid Declaration

var可以用在for loop中:

for ( var element : elementList){
  //do something for element
}

或者這種:

for ( var i = 0 ; i < elementList.size(); i++ ){
  System.out.println( elementList.get(i) );
}

var不能用在什么地方

因?yàn)関ar是本地變量類(lèi)型,它不能用在類(lèi)變量的定義中,不能用在方法變量中,不能用在構(gòu)造函數(shù)中,不能用在方法返回中,不能用在catch變量定義中。

public class VarIncorrectUsage {
   
  //var user;  //Not allowed as class fields
     
  //public VarIncorrectUsage(var param){  //Not allowed as parameter 
  //}
 
  /*try{
     
  } catch(var exception){  //Not allowed as catch formal 
 
  }*/
 
  /*public var returnMethod(){ //Not allowed in method return type
    return null;
  }*/
 
  /*public Integer parameterMethod( var input ){ //Not allowed in method parameters
    return null;
  }*/
}

注意,var在JVM無(wú)法推斷其類(lèi)型或者可以有很多類(lèi)型的情況下不能夠使用:

var ints = {1, 2, 3};
var lambda = a -> a;
var methodReference = String::concat;

上面例子中數(shù)組初始化,lambda表達(dá)式和方法引用都是不能用var的。

其他var的特點(diǎn)

var不是關(guān)鍵字,所以我們可以使用var來(lái)做變量名字:

var var = 2;  //Valid Declaration
     
int var = 2;  //Also valid Declaration

因?yàn)関ar是JDK10引入的概念,所以不是向下兼容的。不能夠用低版本的編譯器來(lái)編譯var。

var不會(huì)影響性能,因?yàn)関ar是在代碼編譯器進(jìn)行的類(lèi)型推斷,所以并不會(huì)影響到性能。

看完上述內(nèi)容,是不是對(duì)JDK10中本地變量類(lèi)型var的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI