【 java 基礎知識 第一篇 】

目錄

1.概念

1.1.java的特定有哪些?

1.2.java有哪些優勢哪些劣勢?

1.3.java為什么可以跨平臺?

1.4JVM,JDK,JRE它們有什么區別?

1.5.編譯型語言與解釋型語言的區別?

2.數據類型

2.1.long與int類型可以互轉嗎?

2.2.數據類型轉變形式有哪些?

2.3.類型轉換會出現哪些問題?

2.4.為什么用bigDecimal 不用double?

2.5.裝箱與拆箱會出現什么問題?

2.6.Integer為什么會存在一個緩存池?

3.面向對象

3.1.怎么理解面向對象?

3.2.說一下封裝繼承多態?

3.3.多態體現在哪幾個方面?

3.4.重寫與重載的區別?

3.5.抽象類與普通類的區別?

3.6.抽象類與接口的區別?

3.7.抽象類可以加final關鍵字嗎?

3.8.解釋一下靜態變量與靜態方法?

3.9.為什么靜態不能調用非靜態?

3.10.為什么非靜態內部類可以訪問外部類?

4.關鍵字

4.1.final


1.概念

1.1.java的特定有哪些?

  • 平臺無關性:"一次編譯終身運行",就是說java編譯器會將源代碼先編譯成字節碼(不同機器上只要源代碼相同,那么就字節碼一定相同),然后JVM會將字節碼翻譯成對應的機器碼(JVM有不同系統的版本,JVM會根據你的環境進行翻譯),總的來說就是字節碼保證編譯一致,然后根據不同的JVM翻譯對應機器碼
  • 面向對象:java是一個面向對象的語言,更方便代碼的維護和使用
  • 內存管理:java擁有垃圾回收機制,開發人員不需要自己手動刪除內存(不需要考慮這么多),由垃圾回收機制來自動實現內存釋放

1.2.java有哪些優勢哪些劣勢?

優勢:(特定那里)

  • 跨平臺:java有平臺無關性
  • 內存管理:擁有垃圾回收機制
  • 面向對象:使代碼更好維護和使用
  • 強大的生態系統:如Spring全家桶,其他的工具包等等
  • 穩定性:支持企業長期使用,版本向后兼容

劣勢:

  • 內存消耗大:JVM虛擬機本身就需要一定的內存
  • 啟動時間長:由于需要JVM將字節碼翻譯成機器碼
  • 代碼復雜:由于java過于面向對象,一個簡單的程序的代碼復雜(麻煩)

1.3.java為什么可以跨平臺?

java在編譯時,java編譯器會直接將源代碼編寫成字節碼文件,等到你需要運行時,會根據你的JVM虛擬機版本不同,然后通過不同的JVM將字節碼翻譯成機器碼(讓機器識別)

1.4JVM,JDK,JRE它們有什么區別?

JVM:JVM是java虛擬機,是java程序運行的環境

JDK:JDK是java的一個開發工具包(各種類,工具)

JRE:JRE是java運行的環境,是java程序所需的最小環境

1.5.編譯型語言與解釋型語言的區別?

編譯型:在運行之前需要編譯,將源代碼編寫成字節碼或者機器碼(C++),如果它編寫成機器碼,在本機上可以直接識別機器碼,從而它的運行速度快,跨平臺性差

解釋性:不需要編譯,它會在運行時逐行解釋代碼,因運行速度慢,跨平臺性好

2.數據類型

2.1.long與int類型可以互轉嗎?

可以:但是你需要考慮數據的溢出與丟失

比如:你將long類型轉成int類型,如果你的long類型的數很大,大到int無法全部接收,那么就會出現數據的丟失

比如:你將int類型轉成long類型,如果你的int類型的數很小,那么用long接收,由于long精度大,其他位將用0填充,出現數據溢出

public class TypeConversion {public static void main(String[] args) {long bigLong = 2147483648L; // 超出 int 最大值(2147483647)int intValue = (int) bigLong; // 強制轉換System.out.println("原始 long 值: " + bigLong);  // 輸出 2147483648System.out.println("轉換后的 int 值: " + intValue); // 輸出 -2147483648(溢出)}
}

2.2.數據類型轉變形式有哪些?

自動類型轉換(隱式轉換):假如:你使用long類型與int類型進行相加,它會默認將int類型隱式轉換成long,再進行運算

public class AutoConversion {public static void main(String[] args) {int a = 10;long b = 20L;long result = a + b;  // int 自動提升為 longSystem.out.println(result);  // 輸出 30}
}

強制類型轉換(顯示轉換):假如:你使用long類型與int類型進行相加,那么最后的結果只能用long類型接收,如果你想要使用int類型接收,那么需要強制類型轉換

public class ForceConversion {public static void main(String[] args) {long a = 2147483648L;  // 超過 int 最大值(2147483647)int b = (int) a;       // 強制轉換System.out.println(b);  // 輸出 -2147483648(高位截斷)}
}

字符串轉換:使用包裝類里面的方法進行轉換,比如:你將char類型轉換成int,那么它會根據ASCII碼對應表轉成對應數

public class StringConversion {public static void main(String[] args) {// 1. 字符串 → 數值類型(需處理異常)String str = "123";int num = Integer.parseInt(str);  // 字符串轉 intdouble d = Double.parseDouble(str);  // 字符串轉 double// 2. 數值類型 → 字符串String s1 = Integer.toString(num);  // 方法1String s2 = String.valueOf(d);      // 方法2String s3 = "" + num;              // 方法3(隱式轉換)// 3. char → int(ASCII 碼轉換)char c = 'A';int ascii = c;  // 直接賦值,輸出 65int numericValue = Character.getNumericValue('9');  // 輸出 9}
}

2.3.類型轉換會出現哪些問題?

數據丟失:小類型轉大類型(精度不同,造成數據丟失)

數據溢出:大類型轉小類型(高位全用0填充)

精度不同:float是單精度,double是雙精度,兩者轉換精度會出現丟失

類型不同:不同類型的轉換會出現編譯錯誤

2.4.為什么用bigDecimal 不用double?

舉例:你能使用十進制表示1/3嗎?無法表示,一直在循環,而double是進行二進制運算的,比如:0.1你能使用二進制進行表示嗎?也是一直循環,而double是有精度的,到達它的精度限度后,它不會在循環下去,因此會出現精度丟失問題

解決:使用bigDecimal(注意:如果你還是使用浮點數賦值給它,還是會出現該問題(默認浮點數就是double類型),因此使用字符串賦值)

System.out.println(0.1 + 0.2); // 輸出 0.30000000000000004(精度丟失)
import java.math.BigDecimal;public class BadExample {public static void main(String[] args) {BigDecimal a = new BigDecimal(0.1); // 用 double 初始化(錯誤!)BigDecimal b = new BigDecimal(0.2);BigDecimal result = a.add(b);System.out.println(result); // 輸出 0.3000000000000000166533453694...}
}
import java.math.BigDecimal;public class GoodExample {public static void main(String[] args) {BigDecimal a = new BigDecimal("0.1"); // 用字符串初始化(正確!)BigDecimal b = new BigDecimal("0.2");BigDecimal result = a.add(b);System.out.println(result); // 輸出 0.3}
}

2.5.裝箱與拆箱會出現什么問題?

裝箱:就是將基本類型包裝成包裝類

拆箱:就是將包裝類拆成基本類型

問題:由于java可以實現自動裝箱與拆箱,如果你定義一個Integer類型,但是沒有給它賦值,它會默認null,然后將它拆箱,但是null值是無法拆箱的,因此會出現空指針異常

2.6.Integer為什么會存在一個緩存池?

由于我們需要使用對應的包裝類,但是每次都需要重新創建對象(消耗內存),并且進行一個運算就會創建一個對象(無關內存),因此為了節省內存,java將我們常使用的-128到127的對象已經創建好了,放在靜態緩存池中,你使用.valueInt()這個方法進行賦值,它就會去復用池中對象(地址相同)

Integer a = Integer.valueOf(100);  // 從緩存池獲取(地址相同)
Integer b = 100;                   // 隱式調用 valueOf(),復用緩存
Integer c = new Integer(100);      // 強制創建新對象(地址不同)System.out.println(a == b);  // true(同一對象)
System.out.println(a == c);  // false(不同對象)

3.面向對象

3.1.怎么理解面向對象?

面向對象就是將現實生活中的各個事務抽象成對象

3.2.說一下封裝繼承多態?

封裝:就是將共性的屬性與方法封裝到類中,隱藏類中的細節,僅暴露出你想要暴露的接口來與外界交互,增加了代碼的安全性和擴展性

繼承:子類共享父類的屬性與方法,是代碼實現復用,建立了類與類之間的聯系,是類之間的結構更加清晰

多態:不同類對應不同消息的不同操作方式,是代碼更加靈活

3.3.多態體現在哪幾個方面?

方法重載:同一個類可以有多個方法名相同的方法(參數不同)

方法重寫:子類重寫父類的方法

接口實現:不同的類實現同一個接口,那么創建對象時,可以使用接口創建,調用方式一致

向上與向下轉型:向上:父類轉子類? ?向下:子類轉父類

3.4.重寫與重載的區別?

重寫:子類重寫父類方法,需要與父類方法名,返回類型,參數保持一致,只能修改其內部的代碼

重載:在同一個類中你可以重載多個方法名相同的方法,但是區別在于參數不同(1.參數類型不同,2.參數數量不同,3.參數順序不同),滿足一個即可

3.5.抽象類與普通類的區別?

實例化:抽象類不可以實例化,普通類可以

-----

方法實現:抽象類方法可以實現可以只定義,而普通類需要具體的方法實現

3.6.抽象類與接口的區別?

實現方式:抽象類需要繼承extends,接口需要實現implements

-----

訪問修飾符不同:兩者的屬性與方法默認修飾符不同

-----

方法實現不同:抽象類方法可以定義可以實現,接口只能定義

-----

變量:抽象類可以有實例變量和靜態變量,而接口只有靜態變量

-----

特點:接口是定義類的功能或行為,抽象類是描述類的共性和行為的

3.7.抽象類可以加final關鍵字嗎?

不可以,抽象類本身就是一個基類就是讓其他類繼承的,而類加上final會讓該類無法被繼承

因此兩者互斥

3.8.解釋一下靜態變量與靜態方法?

靜態的東西只有當類加載完后,它就會加載,只會在內存中加載一次

3.9.為什么靜態不能調用非靜態?

靜態只有當類加載完就會加載,因此靜態會優先于非靜態加載(需要實例化),你一個沒加載的怎么能被調用呢?

比如:靜態方法里面調用非靜態方法,我靜態方法都已經加載完了,而你非靜態方法必須要實例化才能加載,沒有實例化不加載,那么我怎么調用你呢?(不能確定非靜態是否加載)

比如:反過來,就可以解釋為什么非靜態可以調用靜態,因為非靜態加載慢,它加載完就一定有靜態加載完,因此可以調用

public class Example {static int staticVar = 10;  // 類加載時初始化int instanceVar = 20;      // 對象實例化時初始化
}
public class Example {static void staticMethod() {instanceMethod();  // 編譯錯誤:無法調用非靜態方法System.out.println(instanceVar);  // 編譯錯誤:無法訪問非靜態變量}void instanceMethod() {System.out.println("非靜態方法");}
}
public class Example {static int staticVar = 10;void instanceMethod() {System.out.println(staticVar);  // 合法:靜態成員已加載staticMethod();                // 合法:靜態方法已加載}static void staticMethod() {System.out.println("靜態方法");}
}

3.10.為什么非靜態內部類可以訪問外部類?

就是當外部類實例化后,會將外部類的實例化地址(引用)當作參數傳給非靜態內部類,因此它可以根據引用來訪問

4.關鍵字

4.1.final

修飾類代表類不能被繼承
修飾方法代表方法不能被重寫
修飾變量如果是基本類型,值不能被修改,是引用類型,值可以被修改,地址不能修改

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高效背誦英語四級范文

以下是結合認知科學和實戰驗證的 ??高效背誦英語作文五步法??,助你在30分鐘內牢固記憶一篇作文,特別適配考前沖刺場景: 📝 ??一、解構作文(5分鐘)?? ??拆解邏輯框架?? 用熒光筆標出&#xff…

RHEL7安裝教程

RHEL7安裝教程 下載RHEL7鏡像 通過網盤分享的文件:RHEL 7.zip 鏈接: https://pan.baidu.com/s/1ExLhdJigj-tcrHJxIca5XA?pwdjrrj 提取碼: jrrj --來自百度網盤超級會員v6的分享安裝 1.打開VMware,新建虛擬機,選擇自定義然后下一步 2.點擊…

結構型設計模式之Decorator(裝飾器)

結構型設計模式之Decorator(裝飾器) 前言: 本案例通過李四舉例,不改變源代碼的情況下 對“才藝”進行增強。 摘要: 摘要: 裝飾器模式是一種結構型設計模式,允許動態地為對象添加功能而不改變其…

Kotlin委托機制使用方式和原理

目錄 類委托屬性委托簡單的實現屬性委托Kotlin標準庫中提供的幾個委托延遲屬性LazyLazy委托參數可觀察屬性Observable委托vetoable委托屬性儲存在Map中 實踐方式雙擊back退出Fragment/Activity傳參ViewBinding和委托 類委托 類委托有點類似于Java中的代理模式 interface Base…

SpringBoot接入Kimi實踐記錄輕松上手

kimi簡單使用 什么是Kimi API 官網:https://platform.moonshot.cn/ Kimi API 并不是一個我所熟知的廣泛通用的術語。我的推測是,你可能想問的是關于 API 的一些基礎知識。API(Application Programming Interface,應用程序編程接…

書籍在其他數都出現k次的數組中找到只出現一次的數(7)0603

題目 給定一個整型數組arr和一個大于1的整數k。已知arr中只有1個數出現了1次,其他的數都出現了k次,請返回只出現了1次的數。 解答: 對此題進行思路轉換,可以將此題,轉換成k進制數。 k進制的兩個數c和d,…

React 項目初始化與搭建指南

React 項目初始化有多種方式,可以選擇已有的腳手架工具快速創建項目,也可以自定義項目結構并使用構建工具實現項目的構建打包流程。 1. 腳手架方案 1.1. Vite 通過 Vite 創建 React 項目非常簡單,只需一行命令即可完成。Vite 的工程初始化…

大模型模型推理的成本過高,如何進行量化或蒸餾優化

在人工智能的浪潮中,大模型已經成為推動技術革新的核心引擎。從自然語言處理到圖像生成,再到復雜的多模態任務,像GPT、BERT、T5這樣的龐大模型展現出了驚人的能力。它們在翻譯、對話系統、內容生成等領域大放異彩,甚至在醫療、金融等行業中也開始扮演重要角色。可以說,這些…

機器學習在多介質環境中多污染物空間預測的應用研究

機器學習在多介質環境中多污染物空間預測的應用研究 1. 引言 1.1 研究背景與意義 隨著工業化和城市化進程加速,環境中多種污染物的共存已成為全球性環境問題。重金屬(如鉛、汞、鎘)、有機污染物(如多環芳烴、農藥殘留)和新興污染物(如微塑料、藥品殘留)在空氣、水體、…

圖解深度學習 - 激活函數和損失函數

激活函數和損失函數在深度學習中扮演著至關重要的角色。通過選擇合適的激活函數和損失函數,可以顯著提高神經網絡的表達能力和優化效果。 其中激活函數是神經網絡中的非線性函數,用于在神經元之間引入非線性關系,從而使模型能夠學習和表示復…

影響服務器穩定性的因素都有什么?

服務器的穩定性會影響到業務是否能夠持續運行,用戶在進行訪問網站的過程中是否出現頁面卡頓的情況,本文就來了解一下都是哪些因素影響著服務器的穩定性。 服務器中的硬件設備是保證服務器穩定運行的基礎,企業選擇高性能的處理器和大容量且高速…

TopCode之最大子數組和

題目鏈接 53. 最大子數組和 - 力扣(LeetCode) 題目解析 算法原理 解法1: 暴力(一個循環用來固定,一個用來找最大的子數組O(n^2),每次往后拓展一個元素就判斷是否是最長的),枚舉出每一種情況, 然后不斷更新最大的 解法二: dp 1> dp的含義: dp[i]記…

深入解析 Flask 命令行工具與 flask run命令的使用

Flask 是一個輕量級的 Python Web 應用框架,其內置的命令行工具(CLI)基于 Click 庫,提供了方便的命令行接口,用于管理和運行 Flask 應用程序。本文將詳細介紹 Flask 命令行工具的功能,以及如何使用 flask r…

QFramework v1.0 Guide: 工具篇——ViewControllor, ActionKit時序動作執行系統,ResKit資源管理開發解決方案

目錄 一、QFramework.Toolkits簡介 二、View Controllor 1、作用 2、應用場景 3、示例 三、ActionKit時序動作執行系統 1. 用法 (1)延時回調 (2)序列執行 (3)幀延時 (4)條…

GLIDE論文閱讀筆記與DDPM(Diffusion model)的原理推導

Abstract 擴散模型(Diffusion model)最近被證明可以生成高質量的合成圖像,尤其是當它們與某種引導技術結合使用時,可以在生成結果的多樣性與保真度之間進行權衡。本文探討了在文本條件圖像生成任務中使用擴散模型,并比…

@Pushgateway 數據自動清理

文章目錄 Pushgateway 數據自動清理一、Pushgateway 數據清理的必要性二、自動清理方案方案1:使用帶TTL功能的Pushgateway分支版本方案2:使用Shell腳本定期清理方案3:結合Prometheus記錄規則自動清理 三、最佳實踐建議四、驗證與維護五、示例…

QML視圖組件ListView、TableView、GridView介紹

1 MVD模型 Model:模型,包含數據及其結構。View:視圖,用于顯示數據。Delegate:代理,規定數據在視圖中的顯示方式。2 ListView 以列表形式展示數據。2.1 屬性 model:設置或獲取列表視圖的數據模型delegate:定義了列表中每一項的外觀和行為currentIndex:獲取或設置當前選…

解決vscode打開一個單片機工程文件(IAR/keil MDK)因無法找到頭文件導致的結構體成員不自動補全問題。

最近一直在用vscode安裝c/c插件后編輯STM32標準庫(keil MDK)項目源文件,因為我感覺vscode在代碼編輯方面比keil MDK本身優秀太多。發現打開工程后,結構體變量的成員在輸入“.”后不自己彈出的問題,后來查找各方資料&am…

5分鐘申請edu郵箱【方案本周有效】

這篇文章主要展示的是成果。如果你是第1次看見我的內容,具體的步驟請翻看往期的兩篇作品。先看更正補全,再看下一個。 建議你邊看邊操作。 【更正補全】edu教育申請通過方案 本周 edu教育郵箱注冊可行方案 #edu郵箱 偉大無需多言 我已經驗證了四個了…

零知開源——STM32F407VET6驅動ILI9486 TFT顯示屏 實現Flappy Bird游戲教程

簡介 本教程使用STM32F407VET6零知增強板驅動3.5寸 ILI9486的TFT觸摸屏擴展板實現經典Flappy Bird游戲。通過觸摸屏控制小鳥跳躍,躲避障礙物柱體,挑戰最高分。項目涉及STM32底層驅動、圖形庫移植、觸摸控制和游戲邏輯設計。 目錄 簡介 一、硬件準備 二…