更新時間:2022-08-19 09:18:05 來源:動力節點 瀏覽1287次
Java 語言的開發方式使其不依賴于任何硬件或軟件,因為編譯器會編譯代碼,然后將其轉換為可以在多個系統上運行的與平臺無關的字節碼。
運行該字節碼的唯一條件是機器安裝了運行時環境 (JRE)
Java 支持原始數據類型 - byte、boolean、char、short、int、float、long 和 double,因此它不是純面向對象的語言。
堆棧內存是分配給每個單獨程序的內存部分。它是固定的。另一方面,堆內存是未分配給 java 程序的部分,但在需要時可供 java 程序使用,主要是在程序運行時。
Java將此內存用作-
當我們編寫一個java程序時,所有的變量、方法等都存儲在堆棧內存中。
當我們在 java 程序中創建任何對象時,該對象就會在堆內存中創建。它是從堆棧內存中引用的。
示例 -考慮下面的 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 是完整的面向對象的編程語言,那并沒有錯。因為Java中的一切都在類之下。我們可以通過創建對象來訪問它。
但是,如果我們說 java 不是一種完全面向對象的編程語言,因為它支持原始數據類型,如 int、float、char、boolean、double 等。
現在的問題是:Java 是完全面向對象的編程語言嗎?我們可以說——Java 不是一種純粹的面向對象的編程語言,因為它可以直接訪問原始數據類型。而且這些原始數據類型不直接屬于 Integer 類。
C++ 只是一種編譯語言,而 Java 既是編譯語言又是解釋語言。
Java 程序與機器無關,而 c++ 程序只能在編譯它的機器上運行。
C++ 允許用戶在程序中使用指針。而java不允許它。Java 在內部使用指針。
C++ 支持多重繼承的概念,而 Java 不支持這一點。正是由于避免了導致鉆石問題的名稱歧義的復雜性。
指針對于初學者來說非常復雜且不安全。Java 專注于代碼的簡單性,而指針的使用可能使其具有挑戰性。指針的使用也可能導致潛在的錯誤。此外,如果使用指針,安全性也會受到影響,因為用戶可以在指針的幫助下直接訪問內存。
因此,通過在 Java 中不包括指針來提供一定程度的抽象。此外,指針的使用會使垃圾收集過程變得非常緩慢和錯誤。Java 使用引用,因為這些不能被操縱,不像指針。
java中的變量沒有默認值。我們需要在使用它之前初始化該值。否則會拋出編譯錯誤(變量可能未初始化)。
但是例如,如果我們創建對象,則默認值將由默認構造函數根據數據類型進行初始化。
如果它是一個引用,那么它將被分配給 null。
如果它是數字,那么它將分配為 0。
如果它是一個布爾值,那么它將被賦值為 false。等等。
無限循環是那些在沒有任何中斷條件的情況下無限運行的循環。有意識地聲明無限循環的一些例子是:
使用 For 循環:
for (;;)
{
// Business logic
// Any break logic
}
使用 while 循環:
while(true){
// Business logic
// Any break logic
}
使用 do-while 循環:
do{
// Business logic
// Any break logic
}while(true);
構造函數重載是在同名但構造函數參數不同的類中創建多個構造函數的過程。根據參數的數量及其對應的類型,不同類型的構造函數的區分由編譯器完成。
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
}
}
這里定義了三個構造函數,但它們根據參數類型及其數量而有所不同。
Copy Constructor 是當我們想將值從同一個類的舊對象初始化到新對象時使用的構造函數。
class InterviewBit{
String department;
String service;
InterviewBit(InterviewBit ib){
this.departments = ib.departments;
this.services = ib.services;
}
}
在這里,我們從構造函數中的舊對象值初始化新對象值。雖然,這也可以在對象克隆的幫助下實現。
是的,可以存在多個 catch 塊,但特定方法應該先于一般方法,因為只有滿足 catch 條件的第一個 catch 塊被執行。給定的代碼說明了相同的情況:
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 塊將因為除以 0 (i / x) 而被執行。如果 x 大于 0,則將執行第一個 catch 塊,因為 for 循環運行到 i = n 并且數組索引直到 n-1。
在 Java 中,final 關鍵字用于定義常量 /final 并表示非訪問修飾符。
最終變量:
當一個變量在 Java 中聲明為 final 時,它的值一旦被賦值就不能被修改。
如果任何值尚未分配給該變量,則只能由類的構造函數分配。
最終方法:
聲明為 final 的方法不能被其子類覆蓋。
構造函數不能被標記為最終的,因為無論何時繼承一個類,構造函數都不會被繼承。因此,將其標記為最終沒有意義。Java拋出編譯錯誤說 -modifier final not allowed here
最后一課:
不能從聲明為 final 的類繼承任何類。但是該最終類可以擴展其他類以供其使用。
是的。'finally' 塊可能不會被執行。這些案例是——
假設我們在上面的語句中使用System.exit() 。
如果出現堆棧溢出、內存訪問錯誤等致命錯誤。
int[] n1 = 新的 int[0];
布爾[] n2 = 新布爾[-200];
雙[] n3 = 新雙[2241423798];
字符[] ch = 新字符[20];
我們在第 3 行得到一個編譯時錯誤。我們將在第 3 行得到的錯誤是 - integer number too large。這是因為數組需要大小為整數。Integer 在內存中占用 4 個字節。并且數字(2241423798)超出了整數的容量。我們可以聲明的最大數組大小是 - ( 2147483647 )。
因為數組需要整數大小,所以沒有一行(1、2 和 4)會給出編譯時錯誤。該程序將編譯良好。但是我們在第 2 行得到了運行時異常。異常是 - NegativeArraySizeException。
這里會發生什么 - 當 JVM 在運行時分配所需的內存時,它會發現大小為負。并且數組大小不能為負數。所以JVM會拋出異常。
盡管 HashSet 和 TreeSet 都沒有同步并確保不存在重復項,但有一些屬性可以將 HashSet 與 TreeSet 區分開來。
實現:對于HashSet,哈希表用于無序存儲元素。然而,TreeSet 使用紅黑樹以有序的方式存儲元素。
復雜性/性能:對于添加、檢索和刪除元素,HashSet 的時間攤銷復雜度為 O(1)。對于 TreeSet,執行相同操作的時間復雜度稍高一些,等于 O(log n)。總體而言,HashSet 的性能比 TreeSet 更快。
方法: hashCode() 和 equals() 是 HashSet 用于在對象之間進行比較的方法。相反,TreeSet 使用 compareTo() 和 compare() 方法來促進對象比較。
對象類型:可以借助 HashSet 存儲異構和空對象。在 TreeSet 的情況下,插入異構對象或空對象時會發生運行時異常。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習