byte,short,char—> int —> long—> float —> double
Java 變量類型
-
類變量:獨立於方法之外的變量,用 static 修飾。
-
實例變量:獨立於方法之外的變量,不過沒有 static 修飾。
-
局部變量:類的方法中的變量。
實例變量和靜態變量的區別
可以通過對對象屬性的更改來進行對類的靜態屬性的更改
選擇排序
int [] a = new int[]{(int)(Math.random()*100),(int)(Math.random()*100),
(int)(Math.random()*100),(int)(Math.random()*100),(int) (Math.random()*100)};
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.print("\n");
for (int j = 0; j < a.length-1; j++) {
for (int i = j+1; i < a.length; i++) { //收縮前邊界
if(a[i]<a[j]){
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
冒泡排序
for (int j = 0; j < a.length; j++) {
for (int i = 0; i < a.length-j-1; i++) { //收縮后邊界
if(a[i]>a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
//把內容打印出來
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println(" ");
類標識符
Java類初始化順序
-
靜態屬性:static 開頭定義的屬性
-
靜態方法塊: static {} 圈起來的方法塊
-
普通屬性: 未帶static定義的屬性
-
普通方法塊: {} 圈起來的方法塊
-
構造函數: 類名相同的方法
-
方法: 普通方法
關於 JAVA 基礎-類和對象-屬性初始化的提問屬性初始化的順序為: 1、聲明變量的時候的初始化 2、初始化塊 3、構造函數初始化 所以建立一個新的對象的時候,其屬性最終應該是構造函數中的賦給的值
單例模式
-
構造方法私有化
-
靜態屬性指向實例
-
public static的 getInstance方法,返回第二步的靜態屬性
類的多態條件
-
父類(接口)引用指向子類對象
-
調用的方法有重寫
實際上,是子類重寫的靜態方法被隱藏了。父類引用指向子類對象時,調用的是父類的靜態方法;子類引用指向子類對象時,調用的是子類重寫的靜態方法
類方法就是隱藏呀,對象方法才是重寫
方法的重寫是子類覆蓋父類的對象方法
隱藏,就是子類覆蓋父類的類方法
public class Hero {
public static void battleWin(){
System.out.println("hero battle win");
}
}
public class ADHero extends Hero {
//隱藏父類的battleWin方法/
public static void battleWin(){
System.out.println("ad hero battle win");
}
public static void main(String[] args) {
Hero.battleWin();
Hero h=new ADHero();
h.battleWin();
ADHero.battleWin();
}
}
public class ADHero extends Hero {
//隱藏父類的battleWin方法/
// public static void battleWin(){
// System.out.println("ad hero battle win");
// }
public static void main(String[] args) {
Hero.battleWin();
Hero h=new ADHero();
h.battleWin();
ADHero.battleWin();
}
抽象類與接口的區別
區別1:
-
子類只能繼承一個抽象類,不能繼承多個
-
子類可以實現多個接口
區別2:
抽象類可以定義 public,protected,package,private 靜態和非靜態屬性 final和非final屬性 但是接口中聲明的屬性,只能是 public 靜態 final的 即便沒有顯式的聲明
集合框架體系整理
java 堆、棧、堆棧區別
java 堆、棧、堆棧區別:只要是用new()來新建對象的,都會在堆中創建,而且其字符串是單獨存值的,即使與棧中的數據相同,也不會與棧中的數據共享。
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
String str3 = str1;
System.out.println(str3); //bcd
String str4 = "bcd";
System.out.println(str1 == str4); //true
---------------------------------------------------
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
總結:
(1)我們在使用諸如String str = "abc";的格式定義類時,總是想當然地認為,我們創建了String類的對象str。擔心陷阱!對象可能並沒有被創建!唯一可以肯定的是,指向 String類的引用被創建了。至於這個引用到底是否指向了一個新的對象,必須根據上下文來考慮,除非你通過new()方法來顯要地創建一個新的對象。因 此,更為准確的說法是,我們創建了一個指向String類的對象的引用變量str,這個對象引用變量指向了某個值為"abc"的String類。清醒地認 識到這一點對排除程序中難以發現的bug是很有幫助的。
(2)使用String str = "abc";的方式,可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對於String str = new String("abc");的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。這個思想應該是 享元模式的思想,但JDK的內部在這里實現是否應用了這個模式,不得而知。
(3)當比較包裝類里面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==。
(4)由於String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高效率。
棧(stack):是一個先進后出的數據結構,通常用於保存方法(函數)中的參數,局部變量. 在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).
堆(heap):是一個可動態申請的內存空間(其記錄空閑內存空間的鏈表由操作系統維護),C中的malloc語句所產生的內存空間就在堆中. 在java中,所有使用new xxx()構造出來的對象都在堆中存儲,當垃圾回收器檢測到某對象未被引用,則自動銷毀該對象.所以,理論上說java中對象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.
堆是全局的,堆棧是每個函數進入的時候分一小塊,函數返回的時候就釋放了,靜態和全局變量,new 得到的變量,都放在堆中,局部變量放在堆棧中,所以函數返回,局部變量就全沒了。 其實在實際應用中,堆棧多用來存儲方法的調用。而堆則用於對象的存儲。
Java把內存划分成兩種:一種是棧內存,一種是堆內存。
在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。
當在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。
堆內存用來存放由new創建的對象和數組。
在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
在堆中產生了一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。
引用變量就相當於是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。
1、語法層面的,以及最簡單的多線程、接口、抽象類、繼承、封裝、多態、jdbc這些基礎打扎實了 2、熟練使用框架,最重要的是Spring、Spring MVC,持久層框架Hibernate與MyBatis其中之一,當今企業級開發一般都是后者,這既是工作中要用到的,對這些框架的使用也可以強化你的基礎,為后面的研究打下基礎 3、開始逐步研究JDK源碼,重點是集合類的實現原理 4、設計模式,最常用的幾種 5、深入學習多線程知識,比如synchronized、ReentrantLock、、定時器、線程池和各種多線程組件 6、Java虛擬機 7、Java Web方面的一些知識(如果你是Web程序員的話)以及分布式相關知識體系