访问修饰符作用范围由大到小是_9个java基础小知识
一、面向?qū)ο蠛兔嫦蜻^程的區(qū)別
1. 面向過程 : 面向過程性能比面向?qū)ο蟾摺R驗(yàn)轭愓{(diào)用時需要實(shí)例化,開銷比較大,比較消耗資源,所以當(dāng)性能是最重要的考慮因素時(例如單片機(jī)、嵌入式開發(fā)、Linux/Unix等一般采用面向過程開發(fā)),但是,面向過程沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展。
2.面向?qū)ο?: 面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展。因?yàn)槊嫦驅(qū)ο笥蟹庋b、繼承、多態(tài)性的特性,所以可以設(shè)計出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù)。但是面向?qū)ο蟮男阅鼙让嫦蜻^程低。
說明:這個并不是根本原因,面向過程也需要分配內(nèi)存,計算內(nèi)存偏移量,Java性能差的主要原因并不是因?yàn)樗敲嫦驅(qū)ο笳Z言,而是Java是半編譯語言,最終的執(zhí)行代碼并不是可以直接被CPU執(zhí)行的二進(jìn)制機(jī)械碼。而面向過程語言大多都是直接編譯成機(jī)械碼在電腦上執(zhí)行,并且其它一些面向過程的腳本語言性能也并不一定比Java好。
二、關(guān)于JVM、JDK和JRE最詳細(xì)通俗的解答
java虛擬機(jī)(JVM)是運(yùn)行java字節(jié)碼的虛擬機(jī)。JVM有針對不同系統(tǒng)的特定實(shí)現(xiàn)(Windows、Linux、MacOS),目的是使用相同的字節(jié)碼,它們都會給出相同的結(jié)果。
2. 什么是字節(jié)碼?采用字節(jié)碼的好處是什么?
在java中,JVM可以理解的代碼就叫做 字節(jié)碼 (即擴(kuò)展名為.class的文件),它不面向任何特定的處理器,只面向虛擬機(jī)。java語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同事又保留了解釋型語言的可移植性的特點(diǎn)。所以java程序運(yùn)行時比較高效,而且由于字節(jié)碼并不針對一種特定的機(jī)器,因此java程序無須重新編譯便可在多種不同的操作系統(tǒng)下運(yùn)行。
2. 1 java程序從源代碼到運(yùn)行的執(zhí)行步驟:
說明: 特別注意的是.class到機(jī)器碼這一步,在這一步JVM類加載器首先加載字節(jié)碼文件,然后通過解釋器逐行解釋執(zhí)行,這種方式的執(zhí)行速度會相對較慢。而且有些方法和代碼塊是經(jīng)常需要被調(diào)用的(也就是所謂的熱點(diǎn)代碼),所以后面引進(jìn)了JIT編譯器,而JIT屬于運(yùn)行時編譯。當(dāng)JIT編譯器完成第一次編譯之后,其會將字節(jié)碼對應(yīng)的機(jī)器碼保存下來,下次可以直接使用。
2.2 JDK
JDK是Java Development Kit,它是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠創(chuàng)建和編譯程序。
2.3 JRE
JRE 是 Java運(yùn)行時環(huán)境。它是運(yùn)行已編譯 Java 程序所需的所有內(nèi)容的集合,包括 Java虛擬機(jī)(JVM),Java類庫,java命令和其他的一些基礎(chǔ)構(gòu)件。但是,它不能用于創(chuàng)建新程序。
3. java和c++的區(qū)別?
3.1 都是面向?qū)ο蟮恼Z言,都支持封裝、繼承和多態(tài)。
3.2 java不提供指針來直接訪問內(nèi)存,程序內(nèi)存更加安全。
三、重載和重寫的區(qū)別
3.1、重載: 發(fā)生在一個類中,方法名稱必須相同,參數(shù)類型不同,個數(shù)不同,順序不同,方法返回值和訪問修飾符可以不同,發(fā)生在編譯時。
3.2、重寫: 發(fā)生在父子類中,方法名、參數(shù)列表必須相同,返回值的范圍小于等于父類,拋出的異常范圍小于等于父類,訪問修飾符范圍大于等于父類。如果父類的方法訪問修飾符為private,那么子類就不能重寫改方法。
想要了解領(lǐng)取更多關(guān)于java知識點(diǎn)的可以點(diǎn)擊下方鏈接
java資料包?pan.baidu.com提取碼:poom
四、Java 面向?qū)ο缶幊倘筇匦? 封裝 繼承 多態(tài)
4.1、封裝:
封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果屬性不想被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類也沒有什么意義了。
4.2、繼承:
繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承我們能夠非常方便地復(fù)用以前的代碼。
繼承說明:
5.2.1、 子類擁有父類對象所有的屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法子類是無法訪問,只是擁有。
5.2.2、 子類可以擁有自己屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展。
5.2.3、 子類可以用自己的方式實(shí)現(xiàn)父類的方法。(以后介紹)。
4.3、多態(tài):
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運(yùn)行期間才確定,即一個引用變量到底會指向哪個類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。
在Java中有兩種形式可以實(shí)現(xiàn)多態(tài):繼承(多個子類對同一方法的重寫)和接口(實(shí)現(xiàn)接口并覆蓋接口中同一方法)。
五、String、StringBuffer和StringBuilder的區(qū)別
5.1 可變性
String類中使用了final關(guān)鍵字修飾字符數(shù)組來保存字符串(private finalchar value[ ]),所以String對象時不可變的。而StringBuffer和StringBuilder都是繼承AbstractStringBuilder類,在AbstractStringBuilder類中沒有使用final關(guān)鍵字修飾,所以這兩種對象時可變的。(他們兩個的構(gòu)造方法都是使用的是父類的構(gòu)造方法)。
5.2 線程安全性
String中的對象時不可變的,故String對象時線程安全的。
AbstractStringBuilder 是 StringBuilder 與 StringBuffer 的公共父類,定義了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的。StringBuilder 并沒有對方法進(jìn)行加同步鎖,所以是非線程安全的。
5.3 性能
StringBuilder > StringBuffer > String
相同情況下StringBuilder 僅能比StringBuffer 獲得10%-15%的性能,但卻要冒多線程不安全的風(fēng)險。
5.4 總結(jié)
5.4.1 操作少量的數(shù)據(jù): 適用String
5.4.2 單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù): 適用StringBuilder
5.4.3 多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù): 適用StringBuffer
六、在一個靜態(tài)方法內(nèi)調(diào)用一個非靜態(tài)成員為什么是非法的?
因?yàn)殪o態(tài)方法從程序編譯完成時就已經(jīng)存在了,而非靜態(tài)成員得先通過實(shí)例化才能存在,那么如果在一個靜態(tài)方法里調(diào)用了一個非靜態(tài)成員,就有可能這個非靜態(tài)成員壓根還沒實(shí)例化出來,程序也就無法得知是個啥,所以必須是非法的。
七、接口和抽象類的區(qū)別
8.1、 接口的方法默認(rèn)是 public,所有方法在接口中不能有實(shí)現(xiàn)(Java 8 開始接口方法可以有默認(rèn)實(shí)現(xiàn)),而抽象類可以有非抽象的方法。
8.2、 接口中除了static、final變量,不能有其他變量,而抽象類中則不一定。
8.3、 一個類可以實(shí)現(xiàn)多個接口,但只能實(shí)現(xiàn)一個抽象類。接口自己本身可以通過extends關(guān)鍵字?jǐn)U展多個接口。
8.4、 接口方法默認(rèn)修飾符是public,抽象方法可以有public、protected和default這些修飾符(抽象方法就是為了被重寫所以不能使用private關(guān)鍵字修飾!)。
8.5、 從設(shè)計層面來說,抽象是對類的抽象,是一種模板設(shè)計,而接口是對行為的抽象,是一種行為的規(guī)范。
八、成員變量與局部變量的區(qū)別有哪些?
9.1、 從語法形式上看:成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);成員變量可以被 public,private,static 等修飾符所修飾,而局部變量不能被訪問控制修飾符及 static 所修飾;但是,成員變量和局部變量都能被 final 所修飾。
9.2、 從變量在內(nèi)存中的存儲方式來看:如果成員變量是使用static修飾的,那么這個成員變量是屬于類的,如果沒有使用static修飾,這個成員變量是屬于實(shí)例的。而對象存在于堆內(nèi)存,局部變量則存在于棧內(nèi)存。
9.3、 從變量在內(nèi)存中的生存時間上看:成員變量是對象的一部分,它隨著對象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動消失。
9.4、 成員變量如果沒有被賦初值:則會自動以類型的默認(rèn)值而賦值(一種情況例外:被 final 修飾的成員變量也必須顯式地賦值),而局部變量則不會自動賦值。
九、== 與 equals區(qū)別(重要)
10.1、==
它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同一個對象(基本數(shù)據(jù)類型 == 比較的是值,引用數(shù)據(jù)類型 == 比較的是內(nèi)存地址)。
10.2、equals()
它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:
情況1: 類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價于通過“==”比較這兩個對象。
情況2: 類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來比較兩個對象的內(nèi)容是否相等;若它們的內(nèi)容相等,則返回 true (即,認(rèn)為這兩個對象相等)。
例子展示:
public class test1 { public static void main(String[] args) {
String a = new String("ab"); // a 為一個引用
String b = new String("ab"); // b為另一個引用,對象的內(nèi)容一樣
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 從常量池中查找
if (aa == bb) // true System.out.println("aa==bb");
if (a == b) // false,非同一對象 System.out.println("a==b");
if (a.equals(b)) // true System.out.println("aEQb");
if (42 == 42.0) { // true System.out.println("true");
}
}
}
說明:
1、 String 中的 equals 方法是被重寫過的,因?yàn)?object 的 equals 方法是比較的對象的內(nèi)存地址,而 String 的 equals 方法比較的是對象的值。
2、 當(dāng)創(chuàng)建 String 類型的對象時,虛擬機(jī)會在常量池中查找有沒有已經(jīng)存在的值和要創(chuàng)建的值相同的對象,如果有就把它賦給當(dāng)前引用。如果沒有就在常量池中重新創(chuàng)建一個 String 對象。
java資料包?pan.baidu.com提取碼:poom
總結(jié)
以上是生活随笔為你收集整理的访问修饰符作用范围由大到小是_9个java基础小知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中读取txt文件、统计其中所
- 下一篇: pip命令提示unknow or uns