java問題積累
Java基礎知識點
基本資料型別值傳遞傳遞的是值,形參改變,實參不變
引用資料型別值傳遞傳遞的是地址值,形參改變,實參也變
特殊:String 在值傳遞時,形參改變,實參不會改變(字串是常量,不允許改變)
== 比較
基本資料型別:比較的是基本資料型別的值是否相同
引用資料型別:比較的是引用資料型別的地址值是否相同
棧裡面存的變數或者引用資料名屬於實參,給方法裡面傳的是形參(在方法小括號裡面)
形參:用於接收實際資料的變數
實參:實際參與運算的變數
計算機儲存裝置的最小資訊單元叫“位(bit)”,我們又稱之為“位元位”,通常用小寫的字母b表示。而計算機最小的儲存單元叫“位元組(byte)”,通常用大寫字母B表示,位元組是由連續的8個位組成。
字串是一個常量,一經賦值,不允許改變,字串直接賦值(String s=“abc”)存放在字串常量池中,(String s=new String()),new出來的東西都是存在堆記憶體中,每一次new都是宣告一個新的變數
字串的拼接操作本質上並不是修改字串,(常量池裡面的內容一經宣告,不允許修改)拼接操作是在常量池裡重新宣告一個新的字串,然後將字串的指向修改為指向這個新宣告的字串(修改字串的指向,並沒有修改字串的地址值字串的地址也發生了改變),以此達到拼接字串的目的
-
String str1 = new String(); str1 += "abc"; System.out.println(str1); //abc String str2 = str1.concat("abc"); System.out.println(str2); //abcabc String str = "ankcj"; //獲取字串的地址 Integer.toHexString(str.hashCode()) System.out.println("@" +Integer.toHexString(str.hashCode()));//@58a86c5
char 預設值’\u0000’ (空格) int 預設值 0 boolean預設值false double預設值0.0
資料型別轉換
我們在做運算的時候,一般要求參與運算的資料型別必須一致。
隱式轉換 byte,short,char --> int --> long --> float --> double
強制轉換 目標型別 變數名 = (目標型別) (被轉換的資料);
不建議強制轉換,因為會有精度的損失。
一旦運算當中有不同型別的資料,那麼結果將會是資料型別範圍大的那種(隱式轉換)
只有變數才能使用自增、自減運算子。常量不可發生改變,所以不能用
只有變數才能使用賦值運算子(=,+=,-=,*=,/=),常量不能進行賦值。
複合賦值運算子其中隱含了一個強制型別轉換。(+=,-=,/=,)
邏輯運算子
& 邏輯與:有false則false。
| 邏輯或:有true則true。
^ 邏輯異或:相同為false,不同為true。
! 邏輯非:非false則true,非true則false。
&& 與(並且):全都是true,才是true;否則就是false
|| 或(或者):至少一個是true,就是true;全都是false,才是false
! 非(取反):本來是true,變成false;本來是false,變成true
注意:
- &&和||具有短路效果,左邊如果已經確定結果,則右邊語句不會再執行
- |和& 沒有短路效果,左邊程式碼和右邊程式碼都會執行
switch(表示式) {case…default…}
表示式的取值:byte,short,int,char(long不可以做switch的表示式)
JDK5以後可以是列舉
JDK7以後可以是String
注意:
- 在switch語句中,如果case的後面不寫break,將出現穿透現象,也就是不會在判斷下一個case的值,直接向後執行,直到遇到break,或者整體switch結束。 break表示中斷,結束的意思,可以結束switch語句。
- default語句表示所有情況都不匹配的時候,就執行該處的內容,和if語句的else相似。
for迴圈語句和while迴圈語句的小區別:
控制條件語句所控制的那個變數,在for迴圈結束後,就不能再被訪問到了,而while迴圈結束還可以繼續使用,如果你想繼續使用,就用while,否則推薦使用for。原因是for迴圈結束,該變數就從記憶體中消失,能夠提高記憶體的使用效率。
迴圈的使用推薦:for – while – do…while
隨機數
Random類 需要導包、建立物件、使用
Math.random() 無需導包,直接使用,產生的是0~1 [0,1) 之間的隨機小數
JVM記憶體劃分
-
棧 儲存區域性變數
-
堆 儲存new出來的東西
-
方法區 (物件導向進階講)
-
本地方法區 (和系統相關)
-
暫存器 (給CPU使用)
類的五大成分
1.成員變數
2.構造器
3.成員方法
4.程式碼塊
5.內部類
四大修飾符
-
public:可以修飾類、屬性、方法
-
protected:可以修飾屬性、方法
-
default:可以修飾類、屬性、方法
-
private:可以修飾屬性、方法
-
注意:1.如果public修飾外部類,那麼外部類名要和檔名保持一致
2.protected的受保護的方法,在同包下、本類中可以直接呼叫;但是在不同包的子類中,建立父類物件訪問不到父類的保護方法,只能用子類物件來訪問受保護方法,且子類物件要重防寫方法
public 公開的 | protected 受保護的 | default 預設的 | private 私有的 | |
---|---|---|---|---|
本類中 | OK | OK | OK | OK |
同包下 | OK | OK | OK | |
不同包下的子類 | OK | OK | ||
不同包下的其他類 | OK |
方法的過載
-
在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可
-
與返回值型別無關,只有引數個數,引數型別,引數順序有關
-
int ----> String
-
String---->int
//int ---> String
int a = 10;
String s = ""+a; //10
//int ---> String
String str = Integer.toString(100);
System.out.println(str); //100
//String ---> int 當String內容全是十進位制數字時才能轉化
String s3 = "30";
Integer c = Integer.valueOf(s3);
System.out.println("c = " + c); //30
int d = Integer.parseInt(s3); //30
int max = Integer.MAX_VALUE; //2147483647
int min = Integer.MIN_VALUE; //-2147483648
區域性變數,成員變數,成員方法
- 成員變數 就是事物的屬性 ,可以不初始化,會提供預設值 位置:類中,方法外
- 成員方法 就是事物的行為 位置:類中
區別 | |
---|---|
區域性變數 | 棧記憶體中,在使用前要賦初始值,在方法內宣告或者作為方法的形參 隨著方法的呼叫而存在,隨著方法的呼叫結束而結束 |
成員變數 | 堆記憶體中,在類中方法外宣告,可不賦初始值,會提供預設值 隨著物件的存在而存在,隨著物件的消失而消失 |
成員方法 | 描述事物的行為,在類中定義 |
什麼是封裝
-
物件導向的三大特性之一
-
將不需要對外提供的內容都隱藏(private)起來(隱藏其內部結構)
-
把屬性隱藏,提供公共方法對其訪問
-
屬性私有化,提供對應公開的getXxx()/setXxx()方法
-
通過方法來控制成員變數的操作,提高了程式碼的安全性
-
把程式碼用方法進行封裝,提高了程式碼的複用性,實現程式碼的元件化設計
什麼是繼承 extends
- is-a 類與類之間的關係 extends關鍵字
- 物件導向的三大特性之一
- java支援單繼承,也支援多層繼承
- 父類定義了共性內容,子類定義該類的個性內容
- 子類繼承父類後,(子類就是”父類“ is-a)子類會繼承父類的一些屬性和方法,子類可以直接訪問父類非私有的成員屬性和成員方法
- 父類的構造方法、靜態方法不會被子類繼承
- 父類可以使用自己的屬性及行為,但是不可以使用子類新擴充的屬性和行為.
- 父類的私有成員屬性、私有成員方法會被子類繼承,私有成員屬性可以通過公開的getter/setter來訪問,私有成員方法子類訪問不到,但是會被子類繼承(理解:父親給兒子一個保險箱,但是沒給鑰匙,但兒子確實繼承了這個保險箱,只是打不開而已)
- 注意事項:繼承中子父類構造方法呼叫順序(先父後子)
- 在每次建立子類物件時,我們先初始化父類內容,再初始化其子類的內容。在子類物件的記憶體空間中,會開闢一塊父類空間,用來存父類中的內容,這樣便可以包含父類的成員,如果父類成員是非私有的,那麼子類可以直接使用。(建立子類物件時,只是在子類空間中開闢了一塊父類空間,但是並沒有建立父類的物件)
什麼是多型
-
物件導向的三大特性之一
-
最終體現形態為:父類的引用變數指向子類物件(子類例項)
-
多型程式碼格式: 父類型別變數名 = new 子類型別();
-
多型的前提是必須有子父類關係或者類實現介面關係,否則無法完成多型
-
多型的使用場景:
1.為變數賦值時使用多型,達到父類應用指向子類物件的賦值
2.直接為變數賦值
3.呼叫方法時,為方法引數賦值
4.方法返回值,可以定義父類型別,但是返回子類物件.當該方法被調 用 時,用父類型別接收
-
多型的好處:大大提高了程式的擴充套件性;提高了程式的複用性
-
多型的弊端:多型編譯階段是看左邊父類型別的,如果子類有些獨有的功能,此時多型的寫法就無法訪問子類獨有功能了。
-
多型引數:實際開發的過程中,父類型別作為方法形式引數,傳遞子類物件給方法,進行方法的呼叫,更能體現出多型的擴充套件性與便利。
-
多型轉型:
向上轉型: 多型本身是子類型別向父類型別向上轉型
使用格式:父類型別 變數名 = new 子類型別();
如:Person p = new Student();
向下轉型(使用強制型別轉換):
使用格式:子類型別 變數名 = (子類型別) 父類型別的變數;
父類型別 f = new 子類型別();
子類型別 z = (子類型別)f;
如:Student stu = (Student) p; //變數p 實際上指向Student物件
instanceof關鍵字:用來判斷執行期型別;判斷物件是否屬於某種資料型別
關聯關係 has-a
- 物件和物件之間的連線
- 程式碼表現形式:一個類做為另一個類的屬性存在(即“有”的關係)
依賴關係 use-a
- 含義:指一個類A使用到了另一個類B(比如說一個類做為一個類中方法的形參)
- 特性:這種關係是具有偶然性的、臨時性的、非常弱的,但是類B的變化會影響到類A。
對比this和super
對比 | 區別 |
---|---|
this | 代表所在類的物件引用 理解:方法被哪個物件呼叫,this就代表那個物件 訪問本類的成員變數或者成員方法 |
super | 訪問父類的成員變數或者成員方法 |
一般會遵循一個大原則:就近原則 區域性 > 本類成員 > 父類成員 |
static關鍵字
- 含義:靜態
- static修飾變數和方法都是屬於類的,不再屬於某一個特定的物件(直接通過類名點來訪問,不需要建立物件來訪問,可以但沒必要);沒有static修飾的變數和方法都是屬於類的每一個物件(需要建立物件後,通過物件名點來訪問)
- 靜態變數和方法會隨著類的載入而載入,存放在方法區中的靜態區(全域性區)中
final關鍵字
- 含義:最終的意思,可以修飾類、變數、方法
- 修飾類:類不能被繼承
- 修飾方法:方法不能被重寫
- 修飾變數:變數能且只能被賦值一次
抽象類 abstract
-
抽象類用來描述一種型別應該具備的基本特徵與功能,具體如何去完成這些行為由子類通過方法重寫來完成
-
不能被例項化,不能建立物件,只能做為模板類等待被繼承
-
抽象類中可以有構造方法、成員屬性、抽象方法(沒有方法體)
-
抽象類中可以沒有抽象方法,但是有抽象方法的類一定是抽象類
-
抽象類中構造方法的作用:供子類建立物件時(預設的super()),初始化父類成員使用
-
抽象類的實現類要求:要麼重寫抽象父類的所有抽象方法,要麼就做為一個抽象類等待被繼承
-
抽象類存在的意義是為了被子類繼承,抽象類體現的是模板思想
注意事項:
1.抽象類一定是個父類,因為抽象類是不斷抽取共性需求而來的
2.設計時由具體類抽取出抽象類,而開發階段應該先定義抽象父類,再根據不同需求由父類定義子類
單例設計模式
- 將建構函式私有化,使其不能在類外通過new建立物件
- 在類內部產生一個唯一的例項化物件,並將其封裝為private static型別的成員變數
- 定義一個公開的靜態方法,返回給外界唯一的物件
- 分類:餓漢單例設計模式、懶漢單例設計模式
內部類
1.內部類基本概念
- 內部類就是在一個類中定義另一個類,是一個相對概念
- 內部類分為:成員內部類和區域性內部類
- 定義內部類的時候,和正常定義類的過程一樣,同樣包含各種修飾符、繼承與實現關係等
- 內部類可以直接訪問外部類的所有成員
- 外部類編譯後,在方法區中會出現兩個class檔案
- (注:在日常的企業級開發中,我們很少會使用到內部類來實現業務邏輯)
- 可以使用的修飾符:訪問許可權修飾符、static、final、abstract
2.匿名內部類
使用:在建立一個類時沒有類名,簡化程式碼時建立,在實現一個介面或new一個類的例項 化物件時使用匿名內部類是區域性內部類的一種
過程:臨時定義一個型別的子類,定義後立刻建立剛剛定義的這個類的物件
目的:匿名內部類是建立某個型別子類物件的快捷方式,我們為了臨時定義一個類的子類, 並建立這個子類的物件而使用匿名內部類
理解:將定義子類與建立子類物件兩個步驟由一個格式一次完成。雖然是兩個步驟,但是兩 個步驟是連在一起的、即時的。匿名內部類如果不定義變數引用,則也是匿名物件。
格式:
new 父類(){
//重寫需要重寫的方法
};
3.靜態內部類
定義:在一個類的內部宣告一個用static修飾的類,當你使用內部類時,可以通過外部類訪 問,和使用靜態成員屬性、靜態成員方法一樣
定義格式:
public class Outer{
static class Inner{
//其他程式碼
}
}
訪問格式:
//同類中可以省略外部類名訪問
Inner x = new Inner();
//不同類中
Outer.Inner i = new Outer.Inner();
4.成員內部類
定義:在一個類的內部申明一個類,當你使用內部類時,可以通過外部類物件訪問,就跟操 作成員屬性、成員方法一樣。
定義格式:
public class Outer{
class Inner{
//其他程式碼
}
}
訪問格式:
Outer.Inner x = new Outer().new Inner();
5.區域性內部類
定義:在一個類的方法中申明內部類,當你呼叫這個方法時,才可以使用內部類(用的少)
定義格式:
public class Outer{
public void method{
class Inner{
//其他程式碼
}
}
}
訪問格式: 只能在外部類的方法中建立物件並訪問。
程式碼塊
1.靜態程式碼塊
定義:必須有static修飾,必須放在類下。與類一起載入執行。
格式:
static{
// 執行程式碼
}
特點:
- 每次執行類,載入類的時候都會先執行靜態程式碼塊一次。
- 靜態程式碼塊是自動觸發執行的,只要程式啟動靜態程式碼塊就會先執行一次。
- 作用:在啟動程式之前可以做資源的初始化,一般用於初始化靜態資源
2.例項程式碼塊
定義:沒有static修飾,必須放在類下。與物件初始化一起載入。
格式:
{
// 執行程式碼
}
特點:
-
無static修飾。屬於物件,與物件的建立一起執行的。
-
每次呼叫構造器初始化物件,例項程式碼塊都要自動觸發執行一次。
-
例項程式碼塊實際上是提取到每一個構造器中去執行的。
-
作用:例項程式碼塊用於初始化物件的資源。
只能在外部類的方法中建立物件並訪問。
程式碼塊
1.靜態程式碼塊
定義:必須有static修飾,必須放在類下。與類一起載入執行。
格式:
static{
// 執行程式碼
}
特點:
- 每次執行類,載入類的時候都會先執行靜態程式碼塊一次。
- 靜態程式碼塊是自動觸發執行的,只要程式啟動靜態程式碼塊就會先執行一次。
- 作用:在啟動程式之前可以做資源的初始化,一般用於初始化靜態資源
2.例項程式碼塊
定義:沒有static修飾,必須放在類下。與物件初始化一起載入。
格式:
{
// 執行程式碼
}
特點:
-
無static修飾。屬於物件,與物件的建立一起執行的。
-
每次呼叫構造器初始化物件,例項程式碼塊都要自動觸發執行一次。
-
例項程式碼塊實際上是提取到每一個構造器中去執行的。
-
作用:例項程式碼塊用於初始化物件的資源。
相關文章
- java web dev知識積累JavaWebdev
- java知識大全積累篇Java
- java日常知識點積累Java
- 測試面試題-積累篇面試題
- postfix配置積累(不斷的積累)
- Oracle積累Oracle
- 【技術積累】如何處理Feign的超時問題
- hadoop 執行期間偶發的各種問題積累(簡單問題不展示)Hadoop
- 大資料的不斷積累,網路面臨哪些安全問題?大資料
- vue 個人積累Vue
- lunix 命令積累
- 日期操作積累
- linux 積累Linux
- JAVA學習筆記及知識積累Java筆記
- 最近積累的幾個關於 PHP 類與 MySQL 的小問題PHPMySql
- 工作點滴積累
- 日常知識積累
- 機器學習知識積累機器學習
- javascript程式碼積累JavaScript
- LINUX命令積累Linux
- 正則命令積累
- 快取框架積累快取框架
- 日常技術積累
- vue 個人積累(元件,工具)Vue元件
- 常用前端知識積累前端
- MySQL知識-積累篇MySql
- 併發總結累積
- 新的GFS累積降水變數-兩種不同的累積降水記錄變數
- Java基礎知識日積月累(Tip of the Day20)Java
- js基礎知識積累JS
- 個人積累linux 日常命令Linux
- 深度學習程式碼積累深度學習
- angularjs 使用中的積累AngularJS
- 學會總結和積累
- 常用Sql語句積累(二)SQL
- ubuntu點選知識積累Ubuntu
- 統計模型機器學習模型領域相關知識,指標概念及問題點積累模型機器學習指標
- 【知識積累】DES演算法之C#加密&Java解密演算法C#加密Java解密