記錄從一些視頻博客之類的學習到的一些經驗,不斷添加,當成本身的儲備倉庫
經過異或運算實現,屬於有必定技巧性的代碼,實際開發仍是用常規的那種.(另外如果遇到n和m引用自同一個變量的狀況的話,則會出錯,n就至關於對本身作了三次異或運算)java
int n = 8,m = 9;
n = n ^ m;
m = n ^ m;
n = n ^ m;
System.out.println("N="+n+"M="+m);
分爲堆內存和棧內存,棧內存主要保存變量,堆內存保存對象和數組.下面舉個例子數組
int[] a = new int[5];
簡單來講對於a是存放在棧內存,對於new int[5]是存放在堆內存,a只是對堆內存的引用,也就是說堆內存是new出來的東西,棧內存是定義出來的東西,而引用則是能夠賦值爲null的變量就是對堆內存的引用,這樣一想,原來String的對象是引用啊markdown
若是程序中常常用到進制轉換,應該用查表法寫一個通性方法.多線程
public static void toHex(int num) {
int temp = 0;
StringBuffer sb = new StringBuffer();
int x = 0;
while(++x<8){
//轉幾進制則對進制的最大值按位與
temp = num & 15;
if (temp>9) {
sb.append((char)(temp-10+'A'));
}else {
sb.append(temp);
}
num = num >>>4;
}
System.out.println(sb.reverse());
}
1.當前對象只使用一次,不會在重複使用,這樣使用匿名對象比較簡介,當對象須要調用多個其方法,則必須創建對象名 2.對象做爲實際參數來傳遞的時候
Car a1 = new Car();
a1.color = "RED";
a1.show();
//匿名對象的使用
new Car().show();
//匿名對象做爲參數使用
useCar(new Car());
1.做用: 給對象進行初始化,用於全部對象公用的初始化
2.執行時間: 一創建對象就執行,且優先於構造函數執行
3.和構造函數的區別: 構造代碼塊用於全部對象共同的初始化,構造函數只是針對於特定的這一種對象app
class Car{
//構造代碼塊先執行
{
System.out.println("我是代碼塊");
}
//構造函數在代碼塊以後執行
public Car() {
System.out.println("我是構造函數");
}
}
this能夠用於構造函數之間的調用,可是隻能定義在構造函數的第一行,由於初始化須要先執行,不然報錯
class Car{
String name;
int num;
public Car() {
name = "haha";
}
public Car(int num) {
this();//調用無參的構造函數
this.num = num;
}
}
1.特色:
A.隨着類的創建而創建,隨着類的消失而消失,而且存在於方法區內存中
B.優先於對象存在,先有靜態變量,再有對象
C.被全部類成員共享,也就是在內存中只有一個
D.能夠被類名直接調用
2.注意事項
A.靜態方法只能訪問靜態成員,由於其在對象以前建立.非靜態方法既能夠訪問靜態成員也能夠訪問非靜態成員,也能夠用建立的前後順序解釋
B.靜態方法中不能夠用this,super關鍵字,緣由仍是自己先於對象建立
C.靜態成員優勢節省內存,缺點生命週期過長,訪問有侷限性(只能訪問靜態成員)ide
接口中常見的定義有常量和抽象方法.其中每一類成員都有本身的固定的修飾符,
常量: public static final
方法: public abstract
接口就至關於對目前類的額外擴展函數
多態性的提現主要是父類的引用指向了子類,或者父類承載了子類
使用多態性的前提:
1.必須類和類之間有關係,要麼繼承,要麼實現
2.一般還一個前提就是存在覆蓋,這樣使用多態纔有意義.
使用多態性的弊端:
1.雖然提升了擴展性,可是隻能使用父類的引用訪問父類中的成員
2.多態性開發通常都會配合instanceof關鍵字來判斷所屬類型,這樣就能夠解決上述弊端
另外,多態牽扯到轉型:
1.不管怎麼轉型都是對子類的轉型,因此把父類轉換成子類是大大不可取的作法學習
內部類能夠直接訪問外部類中的成員,包括私有,是由於內部類持有了一個外部類的引用,格式爲 外部類名.this.若是外部類要訪問內部類,則必需要創建內部類的對象
另外內部類的使用通常是事務當中又包含了事務,由於類是對事務的描述,因此這樣內部類纔有意義this
public static void main(String[] args){
NewThread thread = new NewThread();
thread.start();//調用start開啓線程,而且運行子類複寫的run方法
// thread.run();//僅僅是對象的調用,雖然建立了線程,可是並無運行該線程
}
}
class NewThread extends Thread{
@Override
public void run() {
System.out.println("AAAAAAAA");
}
同步代碼能夠防止因cup片斷獲取問題而帶來的共享變量判斷的錯誤問題,最簡單的案例就是賣票的案例,這裏很少說,
同步形式:spa
Object obj = new Object();
synchronized (obj) {
//須要同步的代碼
}
或者同步函數
public synchronized void Test() {
//同步代碼塊
}
其中obj就至關於鎖,獲取鎖的才能夠進去運行.
同步的要求:哪裏用到了共享變量哪裏就要同步,因此也就是多線程的時候要注意同步問題,同時同步機制帶來必定的資源消耗,由於每次運行線程都須要判斷是否有鎖.
wait()
notify()
notifyAll()
三個方法都是使用在同步中,被相應的鎖調用便可,由於要對持有的監視器(鎖)的線程操做,且只有同步中才有鎖,因此要使用在同步中.
爲何這些操做線程的方法要定義在object中?
由於鎖能夠是任意對象,因此能夠被任意對象調用的方法定義在object中
這些方法在操做同步線程的時候,都必須標識他們所操做的線程所持有的鎖,由於同一個鎖上的被等待線程能夠被同一個鎖上的notify喚醒,不能夠對不一樣鎖中的線程進行喚醒.