java匿名对象赋初值_不想进BAT的Java程序员不是好程序员,BAT后端Java岗面试真题分享
一. JDK/JRE/JVM 三者之間的聯(lián)系與區(qū)別
- JDK:開(kāi)發(fā)者提供的開(kāi)發(fā)工具箱,是給程序開(kāi)發(fā)者用的。它包括完整的JRE(Java Runtime Environment),Java運(yùn)行環(huán)境,還包含了其他供開(kāi)發(fā)者使用的工具包。
- JRE:(Java Runtime Environment) JVM運(yùn)行時(shí)所須的包依賴的環(huán)境都在JRE中。
- JVM:當(dāng)我們運(yùn)行一個(gè)程序時(shí),JVM負(fù)責(zé)將字節(jié)碼轉(zhuǎn)換為特定機(jī)器代碼,JVM提供了內(nèi)存管理、垃圾回收和安全機(jī)制等。這種獨(dú)立于硬件和操作系統(tǒng),正是Java程序可以一次編寫多處執(zhí)行的原因。
二. Java 面向?qū)ο缶幊痰娜筇匦?/h1>
2.1 封裝
封裝把一個(gè)對(duì)象的屬性私有化,同時(shí)提供一些可以被外界訪問(wèn)的屬性和方法,如果屬性不想被外界訪問(wèn),我們大可不必提供方法給外界訪問(wèn)。但是如果一個(gè)類沒(méi)有供外界訪問(wèn)的方法,那么這個(gè)類也就沒(méi)有什么意義了。
2.2 繼承
繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或者新的功能,也可以用父類的功能,但不能選擇性的繼承父類。通過(guò)使用繼承我們能夠非常方便地復(fù)用以前的代碼。
關(guān)于繼承如下三點(diǎn)需要記住:
- 子類擁有父類非private的屬性和方法。
- 子類可以擁有自己的屬性和方法,即子類可以對(duì)父類進(jìn)行擴(kuò)展。
- 子類可以用自己的方式實(shí)現(xiàn)父類的方法。
2.3 多態(tài)
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過(guò)該引用變量發(fā)出的方法調(diào)用,在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定。即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承(多個(gè)子類對(duì)同一方法的重寫)和接口(實(shí)現(xiàn)接口并覆蓋接口中的同一方法)
三. 面向?qū)ο笈c面向過(guò)程
3.1、面向過(guò)程
- 優(yōu)點(diǎn):性能比面向?qū)ο髲?qiáng),因?yàn)轭愓{(diào)用時(shí)需要實(shí)例化,開(kāi)銷比較大,比較消耗資源;比如單片機(jī)、嵌入式開(kāi)發(fā)、Linux/Unix等一般采用面向過(guò)程開(kāi)發(fā),性能是最重要的因素。
- 缺點(diǎn):沒(méi)有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展。
3.2、面向?qū)ο?/strong>
- 優(yōu)點(diǎn):易維護(hù)、易復(fù)用、易擴(kuò)展。由于面向?qū)ο笥蟹庋b、繼承、多態(tài)的三大特性,可以設(shè)計(jì)出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù)。
- 缺點(diǎn):性能比面向過(guò)程低。
四. Java 語(yǔ)言有哪些特點(diǎn)
- 簡(jiǎn)單易學(xué);
- 面向?qū)ο?封裝、繼承、多態(tài));
- 平臺(tái)無(wú)關(guān)性(Java虛擬機(jī)實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性);
- 可靠性;
- 安全性;
- 支持多線程;
- 很方便的支持網(wǎng)絡(luò)編程;
- 編譯與解釋并存;
五. Java和C++的區(qū)別
沒(méi)學(xué)過(guò)C++,不代表面試官也沒(méi)學(xué)過(guò)
- 都是面向?qū)ο蟮恼Z(yǔ)言,都支持封裝、繼承和多態(tài)
- Java不提供指針來(lái)直接訪問(wèn)內(nèi)存,程序內(nèi)存更加安全
- Java的類是單繼承的,C++支持多重繼承;雖然Java的類不可以多繼承,但是接口可以多繼承。
- Java有自動(dòng)內(nèi)存管理機(jī)制,不需要程序員手動(dòng)釋放無(wú)用內(nèi)存。
六. Java 基本數(shù)據(jù)類型
Javabyteshortintlongdoublefloatcharboolean字節(jié)大小12488421占位大小81632646432168
- 整數(shù)類型:byte、short、int、long
- 字符型:char
- 浮點(diǎn)類型:float、double
- 布爾型:boolean
注意:
整數(shù)型默認(rèn)int型。小數(shù)型默認(rèn)是double型。float和long類型必須加后綴。
比如:float f=100f。
七. 成員變量與局部變量的區(qū)別
從語(yǔ)法形式上看:
- 成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);
- 成員變量可以被public、private、static等修飾符所修飾,而局部變量不能被訪問(wèn)控制修飾符及static所修飾。但是,成員變量和局部變量都能被final所修飾。
從變量在內(nèi)存中的存儲(chǔ)方式來(lái)看:
- 如果成員變量是使用的 static修飾的,那么這個(gè)成員變量是屬于類的,如果沒(méi)有使用 static修飾,這個(gè)成員變量是屬于實(shí)例(對(duì)象)的。而對(duì)象存在與堆內(nèi)存中、局部變量則存在于棧內(nèi)存中。
從變量在內(nèi)存中的生存時(shí)間上看:
- 成員變量是對(duì)象的一部分。它隨著對(duì)象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動(dòng)消失。
- 成員變量如果沒(méi)有被賦初值,則會(huì)自動(dòng)以類型的默認(rèn)值而賦值(一種情況例外:被final修飾的成員變量也必須顯示的賦值),而局部變量則不會(huì)自動(dòng)賦值。
八. 靜態(tài)方法和實(shí)例方法有何不同
在外部調(diào)用靜態(tài)方法時(shí),可以使用“類名.方法名”的方式,也可以使用“對(duì)象名.方法名”的方式。而實(shí)例方法只有后面這種方式。也就是說(shuō),調(diào)用靜態(tài)方法可以無(wú)需創(chuàng)建對(duì)象。
靜態(tài)方法在訪問(wèn)本類的成員時(shí),只允許訪問(wèn)靜態(tài)成員(即靜態(tài)成員變量和靜態(tài)方法),而不允許訪問(wèn)實(shí)例成員變量和實(shí)例方法;實(shí)例方法則無(wú)此限制。
九. 構(gòu)造方法
9.1、特性
- 名字與類名相同;
- 沒(méi)有返回值。但是不能用void聲明構(gòu)造函數(shù)(方法);
- 生成類的對(duì)象時(shí)自動(dòng)執(zhí)行,無(wú)需調(diào)用。
9.2、構(gòu)造方法是否可以被override
在繼承中我們就知道父類的私有屬性和構(gòu)造方法不能被繼承,所以Constructor也就不能被override(重寫),但是可以overload(重裝),所以你可以看到一個(gè)類中有多個(gè)構(gòu)造函數(shù)的情況。
9.3、父子關(guān)系的構(gòu)造方法的執(zhí)行順序
- 父類有無(wú)參構(gòu)造方法,子類才可以寫無(wú)參構(gòu)造方法;父類有含參構(gòu)造方法,子類才可以寫含參構(gòu)造方法。
- 構(gòu)造方法不能被繼承、重寫。
- 當(dāng)進(jìn)行無(wú)參構(gòu)造時(shí),先調(diào)用父類無(wú)參構(gòu)造方法,然后調(diào)用子類無(wú)參構(gòu)造方法;當(dāng)進(jìn)行有參構(gòu)造時(shí),先調(diào)用父類有參構(gòu)造,然后調(diào)用子類有參構(gòu)造。
十. this和super關(guān)鍵字
- super關(guān)鍵字用于從子類訪問(wèn)父類的變量和方法,也包含構(gòu)造方法。
- this關(guān)鍵字用于引用類的當(dāng)前實(shí)例。此關(guān)鍵字是可選的。這意味著如果上面的實(shí)例在不使用此關(guān)鍵字的情況下表現(xiàn)相同。但是,使用此關(guān)鍵字可能會(huì)使代碼更易讀或易懂。this也可以調(diào)用當(dāng)前類的構(gòu)造方法。
- super調(diào)用父類中的其他構(gòu)造方法時(shí),調(diào)用時(shí)要放在構(gòu)造方法的首行!this調(diào)用本類中的其他構(gòu)造方法時(shí),也要放在首行。
- this、super不能用在靜態(tài)方法中。因?yàn)楸籹tatic修飾的成員屬于類,不屬于單個(gè)這個(gè)類的某個(gè)對(duì)象,被類中所有對(duì)象共享。而this代表對(duì)本類對(duì)象的引用,指向本類對(duì)象;而super代表對(duì)父類對(duì)象的引用,指向父類對(duì)象;所以,this和super是屬于對(duì)象范疇的東西,而靜態(tài)方法是屬于類范疇的東西。
十一. 重載和重寫的區(qū)別
- 重載:發(fā)生在同一個(gè)類中,方法名必須相同,參數(shù)類型不同,個(gè)數(shù)不同,順序不同,方法返回值和訪問(wèn)修飾符可以不同,發(fā)生在編譯時(shí)。
- 重寫:發(fā)生在子父類中,方法名、參數(shù)列表必須相同,返回值范圍小于等于父類,拋出的異常范圍小于等于父類,訪問(wèn)修飾符范圍大于等于父類;如果父類方法訪問(wèn)修飾符為private則子類就不能重寫該方法。
十二. String和StringBuffer、StringBuidler
12.1 可變性
String類中使用final關(guān)鍵字修飾的字符數(shù)組保存字符串private final char value[],所以String對(duì)象是不可變的。
而StringBuidler與StringBuffer都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符串?dāng)?shù)組保存字符串 char value[] 但是由于沒(méi)有用final關(guān)鍵字修飾,所以這兩個(gè)類都是可變的。
12.2 線程安全性
- String中的對(duì)象是不可變的,也就是可以理解為常量,線程安全。
- AbstractStringBuilder 是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
- StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以是線程安全的。
- StringBuilder并沒(méi)有對(duì)方法進(jìn)行加同步鎖,所以是非線程安全的。
12.3 性能
每次對(duì)String類型進(jìn)行改變的時(shí)候,都會(huì)生成一個(gè)新的String對(duì)象,然后將地址引用指向新的String對(duì)象。
StringBuffer每次都會(huì)對(duì)StringBuffer對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象并改變對(duì)象引用。相同情況下使用StingBuilder相比使用StringBuffer僅能獲得10%~15%左右的性能提升,但卻要冒著多線程不安全的風(fēng)險(xiǎn)。
12.4 對(duì)于三者的使用總結(jié)
- 操作少量的數(shù)據(jù):String
- 單線程在字符串緩沖區(qū)下操作大量數(shù)據(jù):StringBuidler
- 多線程在字符串緩沖區(qū)下操作大量數(shù)據(jù):StringBuffer
十三. 自動(dòng)裝箱與拆箱
- 裝箱:將基本類型用它們對(duì)應(yīng)的引用類型包裝起來(lái);
- 拆箱:將包裝類型轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型;
十四. HashCode、equals與==
14.1 HashCode()介紹
hashcode()的作用是獲取哈希碼,也成為散列碼。它實(shí)際上返回的是一個(gè)int類型的整數(shù)。這個(gè)哈希碼的作用是確定該對(duì)象在哈希表中的索引位置。hashcode()定義在JDK的Object類中,這就意味著Java中任何類都包含有hashcode()函數(shù)。另外需要注意的是:Object的hashcode方法是本地方法,也就是用c或c++實(shí)現(xiàn)的,該方法通常用來(lái)將對(duì)象在內(nèi)存中的內(nèi)存地址轉(zhuǎn)換為整數(shù)之后返回。
14.2 為什么需要hashCode
以"HashSet如何保證唯一"為例子來(lái)說(shuō)明為什么要有hashcode:
當(dāng)你把對(duì)象加入HashSet時(shí),jvm會(huì)先去檢索HashCode方法,如果返回值是相等的,進(jìn)而調(diào)用equals方法比較內(nèi)容,如果內(nèi)容(各種字段值)相同,那么返回true,數(shù)據(jù)就不往里面添加,因?yàn)槔锩嬉呀?jīng)存有該實(shí)例,如果返回是false就說(shuō)明,是不同的實(shí)例對(duì)象,就往里面存。
因此,保證每個(gè)類的HashCode的值的唯一性,有助于提高效率,這也就是下面第三條約定所談及的內(nèi)容,因?yàn)?#xff0c;一旦判斷出來(lái)hashcode不同,就相當(dāng)于不用比較equals里面的字段,直接存入即可。因此提高了效率。
14.3 hashCode()與equals()的相關(guān)規(guī)定
- 如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的。
- 兩個(gè)對(duì)象相等,對(duì)兩個(gè)對(duì)象分別調(diào)用equals方法都返回true。
- 兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的。
- 因此,equals方法被重寫過(guò),則hashcode方法也必須被重寫。
- hashcode()的默認(rèn)行為是對(duì)堆內(nèi)存上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫hashcode(),則該class的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù))。
14.4 為什么兩個(gè)對(duì)象有相同的hashCode值,它們也不一定相等的?
hashCode() 所使用的雜湊算法也許剛好會(huì)讓多個(gè)對(duì)象傳回相同的雜湊值。越糟糕的雜湊算法越容易碰撞,但這也與數(shù)據(jù)值域分布的特性有關(guān)(所謂碰撞也就是指的是不同的對(duì)象得到相同的hashCode)。在HashSet中,在作對(duì)比的時(shí)候,同樣的hashCode有多個(gè)對(duì)象,它會(huì)使用equals()來(lái)判斷是否真的相同。也就是說(shuō)hashCode只是用來(lái)縮小查找成本的。
14.5 ==與euqals
==:它的作用是判斷兩個(gè)對(duì)象的地址是不是相等。即:判斷兩個(gè)對(duì)象是不是同一個(gè)對(duì)象。(基本數(shù)據(jù)類型""比較的是值,引用數(shù)據(jù)類型""比較的是內(nèi)存地址)
equals():它的作用也是判斷兩個(gè)對(duì)象是否相等。但它一般有兩種使用情況:
- 類沒(méi)有重寫equals()方法。則通過(guò)equals()比較該類的兩個(gè)對(duì)象時(shí),等價(jià)于通過(guò)“==”比較這兩個(gè)對(duì)象。
- 類重寫了equals()方法。一般,我們都通過(guò)重寫equals()方法來(lái)比較兩個(gè)對(duì)象的內(nèi)容是否相等;如果內(nèi)容相等,則返回true(即,認(rèn)為這兩個(gè)對(duì)象相等)。
說(shuō)明:
- String中的equals方法是被重寫過(guò)的,因?yàn)镺bject類的equals方法是比較的對(duì)象的內(nèi)存地址,而String的equals方法比較的是對(duì)象的值。
- 當(dāng)創(chuàng)建String類型的對(duì)象時(shí),虛擬機(jī)會(huì)在常量池中查找有沒(méi)有已經(jīng)存在的值和要?jiǎng)?chuàng)建的值相同的對(duì)象,如果有就把它賦給當(dāng)前引用。如果沒(méi)有就在常量池中重寫創(chuàng)建一個(gè)String對(duì)象。
十五. 關(guān)于final關(guān)鍵字的一些總結(jié)
final關(guān)鍵字主要用在三個(gè)地方:變量、方法、類。
對(duì)于一個(gè)final變量:
- 如果是基本數(shù)據(jù)類型的變量,則其數(shù)組一旦初始化以后就不能更改;
- 如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。
當(dāng)用final修飾一個(gè)類時(shí),表面這個(gè)類不能被繼承。final類中的所有成員方法都會(huì)被隱式的指定為final方法。
使用final修飾方法的原因:
- 把方法鎖定,以防任何繼承類修改它的含義
- 效率:在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過(guò)于龐大,可能看不到內(nèi)嵌調(diào)用帶來(lái)的任何性能提升(現(xiàn)在的Java版本已經(jīng)不需要使用final方法進(jìn)行這些優(yōu)化了)。類中所有的private方法都隱式地指定為final。
十六. 接口和抽象類的區(qū)別
- 接口的方法默認(rèn)是public,所有的方法在接口中不能有實(shí)現(xiàn)(Java8開(kāi)始接口方法可以有默認(rèn)實(shí)現(xiàn)),抽象類可以有非抽象的方法。
- 接口中的實(shí)例變量默認(rèn)是final類型的,而抽象類中則不一定。
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但最多只能實(shí)現(xiàn)一個(gè)抽象類。
- 一個(gè)類實(shí)現(xiàn)接口的話要實(shí)現(xiàn)接口中的所有方法,而抽象類不一定。
- 接口不能用new 實(shí)例化,但可以聲明,但是必須引用一個(gè)實(shí)現(xiàn)該接口的對(duì)象;從設(shè)計(jì)層面來(lái)說(shuō),抽象是對(duì)類的抽象,是一種模板設(shè)計(jì),接口是行為的抽象,是一種行為的規(guī)范。
備注:在JDK8中,接口也可以定義靜態(tài)方法,可以直接用接口名調(diào)用。實(shí)現(xiàn)類和實(shí)現(xiàn)是不可以調(diào)用的。如果同時(shí)實(shí)現(xiàn)兩個(gè)接口,接口中定義了一樣的默認(rèn)方法,必須重寫,不然會(huì)報(bào)錯(cuò)。
十七. static關(guān)鍵字
17.1 修飾成員變量和成員方法
被static修飾的成員變量屬于靜態(tài)成員變量,靜態(tài)變量存放在Java內(nèi)存區(qū)域的方法區(qū)中。
調(diào)用格式:類名.靜態(tài)變量名
被static修飾的成員方法屬于類,不屬于這個(gè)類的某個(gè)對(duì)象,被類中所有的對(duì)象共享,并且建議通過(guò)類名調(diào)用。
調(diào)用格式:類名.靜態(tài)方法名()
17.2 靜態(tài)代碼塊
靜態(tài)代碼塊定義在類中方法外,靜態(tài)代碼塊在非靜態(tài)代碼塊之間執(zhí)行(靜態(tài)代碼塊-->非靜態(tài)代碼塊-->構(gòu)造方法)。該類不管創(chuàng)建多少對(duì)象,靜態(tài)代碼塊只執(zhí)行一次。
靜態(tài)代碼塊的格式是:static{語(yǔ)句體;}
一個(gè)類中的靜態(tài)代碼塊可以有多個(gè),位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊,如果靜態(tài)代碼塊有多個(gè),JVM將按照它們?cè)陬愔谐霈F(xiàn)的先后順序依次執(zhí)行它們,每個(gè)代碼塊只會(huì)被執(zhí)行一次。
靜態(tài)代碼塊對(duì)于定義在它之后的靜態(tài)變量,可以賦值,但是不能訪問(wèn)。
靜態(tài)代碼塊定義在類中方法外,靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊-->非靜態(tài)代碼塊-->構(gòu)造方法)。
該類不管創(chuàng)建多少對(duì)象,靜態(tài)代碼塊只執(zhí)行一次。
17.3 靜態(tài)內(nèi)部類(static修飾類的話,只能修飾內(nèi)部類)
? 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個(gè)巨大的區(qū)別:非靜態(tài)內(nèi)部類在編譯完成之后會(huì)隱含地保存著一個(gè)引用,該引用是指向創(chuàng)建它的外圍類,但是靜態(tài)內(nèi)部類卻沒(méi)有。沒(méi)有這個(gè)引用就意味著:
- 它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建。
- 它不能使用任何外圍類的非static成員變量和方法。
17.4 靜態(tài)導(dǎo)包(用來(lái)導(dǎo)入類中的靜態(tài)資源,1.5之后的新特性)
格式為:import static
這兩個(gè)關(guān)鍵字連用可以指定導(dǎo)入某個(gè)類中的指定靜態(tài)資源,并且不需要使用類名調(diào)用類中靜態(tài)成員,可以直接使用類中靜態(tài)成員變量和成員方法。
17.5 靜態(tài)方法和非靜態(tài)方法
靜態(tài)方法屬于類本身,非靜態(tài)方法屬于從該類生成的每個(gè)對(duì)象。如果你的方法執(zhí)行的操作不依賴于其類的各個(gè)變量和方法,請(qǐng)將其設(shè)置為靜態(tài)(這將使程序的占用空間更小)。否則,它應(yīng)該是非靜態(tài)的。
總結(jié):
- 在外部調(diào)用靜態(tài)方法時(shí),可以使用“類名.方法名”的方式,也可以使用“對(duì)象名.方法名”的方式。而實(shí)例(非靜態(tài))方法只有后面這種方式。也就是說(shuō),調(diào)用靜態(tài)方法可以無(wú)需創(chuàng)建對(duì)象。
- 靜態(tài)方法在訪問(wèn)本類的成員時(shí),只允許訪問(wèn)靜態(tài)成員(即靜態(tài)成員變量和靜態(tài)方法),而不允許訪問(wèn)實(shí)例成員變量和實(shí)例方法;實(shí)例(非靜態(tài))方法則沒(méi)有這個(gè)限制。
17.6 靜態(tài)代碼塊和非靜態(tài)代碼塊
- 相同點(diǎn):都是在JVM加載類時(shí)且在構(gòu)造方法執(zhí)行之前執(zhí)行,在類中都可以定義多個(gè),定義多個(gè)時(shí)按定義的順序執(zhí)行,一般在代碼塊中對(duì)一些static變量進(jìn)行賦值。
- 不同點(diǎn):靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊->非靜態(tài)代碼塊->構(gòu)造方法)。靜態(tài)代碼塊只在第一次new 的時(shí)候執(zhí)行一次,之后不再執(zhí)行,而非靜態(tài)代碼塊每new一次就執(zhí)行一次。非靜態(tài)代碼塊可在普通方法中定義(不過(guò)作用不大);而靜態(tài)代碼塊不行。
一般情況下,如果有些代碼,比如一些項(xiàng)目最常用的變量或?qū)ο蟊仨氃陧?xiàng)目啟動(dòng)的時(shí)就執(zhí)行的時(shí)候,需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的。如果我們想要設(shè)計(jì)不需要?jiǎng)?chuàng)建對(duì)象就可以調(diào)用類中的方法,例如:Arrays類,Character類,String類等,就需要使用靜態(tài)方法,兩者的區(qū)別是:靜態(tài)代碼塊是自動(dòng)執(zhí)行的而靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的。
17.7 非靜態(tài)代碼塊和構(gòu)造函數(shù)
- 非靜態(tài)代碼塊與構(gòu)造函數(shù)的區(qū)別是:
- 非靜態(tài)代碼塊是給所有對(duì)象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對(duì)應(yīng)的對(duì)象初始化。
因?yàn)闃?gòu)造函數(shù)是可以多個(gè)的,運(yùn)行哪個(gè)構(gòu)造函數(shù)就會(huì)建立什么樣的對(duì)象,但無(wú)論建立哪個(gè)對(duì)象,都會(huì)先執(zhí)行相同的構(gòu)造代碼塊。也就是說(shuō),構(gòu)造代碼塊中定義的是不同對(duì)象共性的初始化的內(nèi)容。
17.8 在一個(gè)靜態(tài)方法內(nèi)調(diào)用一個(gè)非靜態(tài)成員為什么是非法的
由于靜態(tài)方法可以不通過(guò)對(duì)象進(jìn)行調(diào)用,因此在靜態(tài)方法里,不能調(diào)用其他非靜態(tài)變量,也不可以訪問(wèn)非靜態(tài)變量成員。
Java程序員福利:我把2019近一年經(jīng)歷過(guò)的Java崗位面試,和一些刷過(guò)的面試題都做成了PDF,PDF都是可以免費(fèi)分享給大家的,關(guān)注私信我:【101】,免費(fèi)領(lǐng)取!
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java匿名对象赋初值_不想进BAT的Java程序员不是好程序员,BAT后端Java岗面试真题分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows出现不是正版怎么解决办法
- 下一篇: ajax如何提交多表单的值_Java W