更新時間:2022-08-19 09:18:05 來源:動力節(jié)點(diǎn) 瀏覽1404次
Java 語言的開發(fā)方式使其不依賴于任何硬件或軟件,因?yàn)榫幾g器會編譯代碼,然后將其轉(zhuǎn)換為可以在多個系統(tǒng)上運(yùn)行的與平臺無關(guān)的字節(jié)碼。
運(yùn)行該字節(jié)碼的唯一條件是機(jī)器安裝了運(yùn)行時環(huán)境 (JRE)
Java 支持原始數(shù)據(jù)類型 - byte、boolean、char、short、int、float、long 和 double,因此它不是純面向?qū)ο蟮恼Z言。
堆棧內(nèi)存是分配給每個單獨(dú)程序的內(nèi)存部分。它是固定的。另一方面,堆內(nèi)存是未分配給 java 程序的部分,但在需要時可供 java 程序使用,主要是在程序運(yùn)行時。
Java將此內(nèi)存用作-
當(dāng)我們編寫一個java程序時,所有的變量、方法等都存儲在堆棧內(nèi)存中。
當(dāng)我們在 java 程序中創(chuàng)建任何對象時,該對象就會在堆內(nèi)存中創(chuàng)建。它是從堆棧內(nèi)存中引用的。
示例 -考慮下面的 java 程序:
class Main {
public void printArray(int[] array){
for(int i : array)
System.out.println(i);
}
public static void main(String args[]) {
int[] array = new int[10];
printArray(array);
}
}
如果我們聲稱 java 是完整的面向?qū)ο蟮木幊陶Z言,那并沒有錯。因?yàn)镴ava中的一切都在類之下。我們可以通過創(chuàng)建對象來訪問它。
但是,如果我們說 java 不是一種完全面向?qū)ο蟮木幊陶Z言,因?yàn)樗С衷紨?shù)據(jù)類型,如 int、float、char、boolean、double 等。
現(xiàn)在的問題是:Java 是完全面向?qū)ο蟮木幊陶Z言嗎?我們可以說——Java 不是一種純粹的面向?qū)ο蟮木幊陶Z言,因?yàn)樗梢灾苯釉L問原始數(shù)據(jù)類型。而且這些原始數(shù)據(jù)類型不直接屬于 Integer 類。
C++ 只是一種編譯語言,而 Java 既是編譯語言又是解釋語言。
Java 程序與機(jī)器無關(guān),而 c++ 程序只能在編譯它的機(jī)器上運(yùn)行。
C++ 允許用戶在程序中使用指針。而java不允許它。Java 在內(nèi)部使用指針。
C++ 支持多重繼承的概念,而 Java 不支持這一點(diǎn)。正是由于避免了導(dǎo)致鉆石問題的名稱歧義的復(fù)雜性。
指針對于初學(xué)者來說非常復(fù)雜且不安全。Java 專注于代碼的簡單性,而指針的使用可能使其具有挑戰(zhàn)性。指針的使用也可能導(dǎo)致潛在的錯誤。此外,如果使用指針,安全性也會受到影響,因?yàn)橛脩艨梢栽谥羔樀膸椭轮苯釉L問內(nèi)存。
因此,通過在 Java 中不包括指針來提供一定程度的抽象。此外,指針的使用會使垃圾收集過程變得非常緩慢和錯誤。Java 使用引用,因?yàn)檫@些不能被操縱,不像指針。
java中的變量沒有默認(rèn)值。我們需要在使用它之前初始化該值。否則會拋出編譯錯誤(變量可能未初始化)。
但是例如,如果我們創(chuàng)建對象,則默認(rèn)值將由默認(rèn)構(gòu)造函數(shù)根據(jù)數(shù)據(jù)類型進(jìn)行初始化。
如果它是一個引用,那么它將被分配給 null。
如果它是數(shù)字,那么它將分配為 0。
如果它是一個布爾值,那么它將被賦值為 false。等等。
無限循環(huán)是那些在沒有任何中斷條件的情況下無限運(yùn)行的循環(huán)。有意識地聲明無限循環(huán)的一些例子是:
使用 For 循環(huán):
for (;;)
{
// Business logic
// Any break logic
}
使用 while 循環(huán):
while(true){
// Business logic
// Any break logic
}
使用 do-while 循環(huán):
do{
// Business logic
// Any break logic
}while(true);
構(gòu)造函數(shù)重載是在同名但構(gòu)造函數(shù)參數(shù)不同的類中創(chuàng)建多個構(gòu)造函數(shù)的過程。根據(jù)參數(shù)的數(shù)量及其對應(yīng)的類型,不同類型的構(gòu)造函數(shù)的區(qū)分由編譯器完成。
class Hospital {
int variable1, variable2;
double variable3;
public Hospital(int doctors, int nurses) {
variable1 = doctors;
variable2 = nurses;
}
public Hospital(int doctors) {
variable1 = doctors;
}
public Hospital(double salaries) {
variable3 = salaries
}
}
這里定義了三個構(gòu)造函數(shù),但它們根據(jù)參數(shù)類型及其數(shù)量而有所不同。
Copy Constructor 是當(dāng)我們想將值從同一個類的舊對象初始化到新對象時使用的構(gòu)造函數(shù)。
class InterviewBit{
String department;
String service;
InterviewBit(InterviewBit ib){
this.departments = ib.departments;
this.services = ib.services;
}
}
在這里,我們從構(gòu)造函數(shù)中的舊對象值初始化新對象值。雖然,這也可以在對象克隆的幫助下實(shí)現(xiàn)。
是的,可以存在多個 catch 塊,但特定方法應(yīng)該先于一般方法,因?yàn)橹挥袧M足 catch 條件的第一個 catch 塊被執(zhí)行。給定的代碼說明了相同的情況:
public class MultipleCatch {
public static void main(String args[]) {
try {
int n = 1000, x = 0;
int arr[] = new int[n];
for (int i = 0; i <= n; i++) {
arr[i] = i / x;
}
}
catch (ArrayIndexOutOfBoundsException exception) {
System.out.println("1st block = ArrayIndexOutOfBoundsException");
}
catch (ArithmeticException exception) {
System.out.println("2nd block = ArithmeticException");
}
catch (Exception exception) {
System.out.println("3rd block = Exception");
}
}
}
在這里,第二個 catch 塊將因?yàn)槌?0 (i / x) 而被執(zhí)行。如果 x 大于 0,則將執(zhí)行第一個 catch 塊,因?yàn)?for 循環(huán)運(yùn)行到 i = n 并且數(shù)組索引直到 n-1。
在 Java 中,final 關(guān)鍵字用于定義常量 /final 并表示非訪問修飾符。
最終變量:
當(dāng)一個變量在 Java 中聲明為 final 時,它的值一旦被賦值就不能被修改。
如果任何值尚未分配給該變量,則只能由類的構(gòu)造函數(shù)分配。
最終方法:
聲明為 final 的方法不能被其子類覆蓋。
構(gòu)造函數(shù)不能被標(biāo)記為最終的,因?yàn)闊o論何時繼承一個類,構(gòu)造函數(shù)都不會被繼承。因此,將其標(biāo)記為最終沒有意義。Java拋出編譯錯誤說 -modifier final not allowed here
最后一課:
不能從聲明為 final 的類繼承任何類。但是該最終類可以擴(kuò)展其他類以供其使用。
是的。'finally' 塊可能不會被執(zhí)行。這些案例是——
假設(shè)我們在上面的語句中使用System.exit() 。
如果出現(xiàn)堆棧溢出、內(nèi)存訪問錯誤等致命錯誤。
int[] n1 = 新的 int[0];
布爾[] n2 = 新布爾[-200];
雙[] n3 = 新雙[2241423798];
字符[] ch = 新字符[20];
我們在第 3 行得到一個編譯時錯誤。我們將在第 3 行得到的錯誤是 - integer number too large。這是因?yàn)閿?shù)組需要大小為整數(shù)。Integer 在內(nèi)存中占用 4 個字節(jié)。并且數(shù)字(2241423798)超出了整數(shù)的容量。我們可以聲明的最大數(shù)組大小是 - ( 2147483647 )。
因?yàn)閿?shù)組需要整數(shù)大小,所以沒有一行(1、2 和 4)會給出編譯時錯誤。該程序?qū)⒕幾g良好。但是我們在第 2 行得到了運(yùn)行時異常。異常是 - NegativeArraySizeException。
這里會發(fā)生什么 - 當(dāng) JVM 在運(yùn)行時分配所需的內(nèi)存時,它會發(fā)現(xiàn)大小為負(fù)。并且數(shù)組大小不能為負(fù)數(shù)。所以JVM會拋出異常。
盡管 HashSet 和 TreeSet 都沒有同步并確保不存在重復(fù)項(xiàng),但有一些屬性可以將 HashSet 與 TreeSet 區(qū)分開來。
實(shí)現(xiàn):對于HashSet,哈希表用于無序存儲元素。然而,TreeSet 使用紅黑樹以有序的方式存儲元素。
復(fù)雜性/性能:對于添加、檢索和刪除元素,HashSet 的時間攤銷復(fù)雜度為 O(1)。對于 TreeSet,執(zhí)行相同操作的時間復(fù)雜度稍高一些,等于 O(log n)。總體而言,HashSet 的性能比 TreeSet 更快。
方法: hashCode() 和 equals() 是 HashSet 用于在對象之間進(jìn)行比較的方法。相反,TreeSet 使用 compareTo() 和 compare() 方法來促進(jìn)對象比較。
對象類型:可以借助 HashSet 存儲異構(gòu)和空對象。在 TreeSet 的情況下,插入異構(gòu)對象或空對象時會發(fā)生運(yùn)行時異常。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743