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