1. 程式人生 > 其它 >java基礎筆記-面向物件2

java基礎筆記-面向物件2

8. static

8.1 概述

​ 希望屬性or方法不歸具體的物件所有,而是屬於類,

​ 隨著類的載入而載入

在記憶體池中,就存一份,在方法區的靜態域中

8.2 靜態屬性

​ static可以用來修飾: 屬性,方法,程式碼塊,內部類

class chinese{
    private static String contory; //全記憶體就一份,所有物件共享
    private String name;
}

8.3 靜態方法

​ 呼叫關係,看生命週期

​ 靜態方法中,不能使用this,super

8.4 單例模式

​ 單例:單獨的一個例項,某個類只能建立一個物件

​ 構造方法許可權為private,這樣不能在外部使用new來建立

​ 在內部使用一個靜態方法來建立一個物件,同時,由於靜態方法只能訪問靜態成員變數,所以類的所有成員都得是靜態的

8.4.1建立單例模式的兩種方法

​ 餓漢式 執行緒安全,但是物件載入時間過長

​ 懶漢式 延遲物件的建立 執行緒不安全(兩個執行緒同時想建立單例物件,倆人判斷都是null,就各自會new一個)

//餓漢式
class Singleton1{
    //私有構造方法
	private Singleton1(){
        pass;
    }
    //類內部建立物件
    private static Bank ins = new Singleton1();
    //提供共有方法返回類的物件
    public static Singleton1 getInstance(){
        return ins;
    }
}
//懶漢式
class A{
	private A(){
		pass;
	}
    //聲明當前類物件,不初始化
    private static A ins = null;
    //提供共有方法返回類的物件
    public static A getInsance(){
        if(ins==null){
            ins = new A();
        }
    	return ins;         
    }
}

8.4.2 使用場景

​ 資料庫連線池,網站計數器,日誌處理,配置檔案類,windows工作管理員,回收站,Application

9. 程式碼塊 ( 初始化塊 )

​ { 程式碼塊 } static{程式碼塊}

​ 通常都是用來初始化類或者物件的,

​ 只能用static修飾,或者不修飾

​ 程式碼塊可以有多個,按著先後順序先後執行(沒必要寫倆靜態程式碼塊吧。)(甚至,沒必要寫程式碼塊)

9.1靜態程式碼塊

​ 隨著類的載入而 執行

​ 就執行一次

9.2 非靜態程式碼塊

​ 隨著物件的建立而執行

​ 每建立一個物件都執行一次

​ 作用:可以在物件建立時,對屬性進行初始化

10. final

​ final可以用來修飾 :類(簡單的說,割了),方法(不可以被重寫,你爸爸給你用,但是不給你重寫),變數

10.1 final修飾方法和類

​ 許可權 [final] class A{ }

​ [許可權] [final] [static] [final] 返回值 方法名()

​ 被final修飾的類:String,System,StringBuffer

​ 被final修飾的方法:Object的getClass()

10.2 final修飾變數和屬性

​ 變數:變成常量了

​ 屬性:賦值可以放在:顯式初始化位置,程式碼塊中,構造器中。 不能用在物件.屬性處

​ 區域性變數: 方法內:變成常量

​ 形參:方法體內就不能再修改了

10.3 static+final

​ static final 修飾屬性:全域性常量 常見於介面中

11. 抽象類,抽象方法

​ 兒子太多,導致父類變成了一個公共東西的抽象,那麼實際使用對父類物件的使用就少了,那還要父類幹嘛,寫成抽象類,不做例項化了

​ abstract : 用來修飾 類 ,方法

abstract class  Person{
    String name;
    int age;
    public Person(){
        
    }
}
class Sun{
    
}

11.1抽象類

​ 一定要有構造方法,雖然自己不能用,但是可以給實現的子類來用

11.2 抽象方法

​ 該類必須是抽象類

​ 可以沒有抽象方法,可以有普通成員方法,這個成員方法還可以呼叫抽象方法

​ 不能修飾構造方法,私有方法,靜態方法,final方法

11.3抽象類的匿名子類

​ 真的很常見

​ 抽象類的方法太多了就別用了!

abstract class Person{
    public abstract void eat();
}

//方法宣告
public static void function(Person p){}
//呼叫
function(new Person{
    @override
    public void eat(){}
})

11,4 設計模式:模板方法

​ 功能內部的一部分是現實確定的,一部分是現實不確定的,這時可以把不確定的部分暴露出去,留給子類來實現

12. interface

​ 介面的最主要目的就是實現多繼承,次要目的就是單純的抽象多個類的公共特徵

​ implements 實現

​ 實現類如果沒有implements介面中的所有方法,則該類是一個抽象類

12.1 介面的成員:

​ JDK7:

​ 全域性常量: public static final

​ 抽象方法:public abstract

​ JDK8+:

​ 還可以定義:

​ 靜態方法: 可以有方法體(介面越來越像類靠齊了)

​ 但是有個介面A{ static func1()},實現類B b,呼叫時 b.func1()

​ 只能A.func1();

​ 預設方法:預設方法使用default修飾,可以通多實現類物件呼叫 ,可以重寫,但是要去掉default

​ 絕對不能定義構造方法

interface Flyable{
    //全域性常量
    public static final int MAX_SPEED =7900;
    int MIN_SPEED =7900; //同上,省略了(包括省略了public)
 	//抽象方法
    public abstract void fly();
    void stop();//省略同上
    //靜態方法
    public static void method1(){
        
    }
    //預設方法
    public default void method2(){} //default預設 得寫
    default void method3(){} //省略
}

12.2介面的繼承性

​ java可以多實現介面,介面之間可以多繼承!!!

12.3 (多繼承)帶來的重名問題

​ 父類和介面中有重名函式 ,規定,子類不重寫則預設用父類的 --類優先原則

​ class A extends B implements C{ }

​ 倆接口裡面有重名函式,規定:

​ <1>如果定義的是預設方法,則實現類必須重寫(介面衝突),如果想使用介面的預設方法,則B.super.func()

class A  implements B,C{  }

12.3 介面的使用(多型)

interface USB{
	void start();
    void stop();
}
class Flash implements USB{
    public void start(){}
    public void stop(){}
}
class Computer{
    public void transferData(USB sub){
        usb.start();
        ...
        usb.stop(); 
    }
}
main(){
    Computer com =new Computer();
    //非匿名實現類的物件
    Flash flash =new Flash();
    com.transferData(flash)
        
  
    //匿名實現類的匿名物件
    comg.transferData(new USB{
        public void start(){}
   	 	public void stop(){}
    });
}

12.4設計模式:代理模式

​ 使用較多

​ 就是為其他物件提供一種代理以控制對這個物件的訪問

​ 一個介面,被倆類實現,一個代理類,一個被代理類

interface NetWork{
	public void browse();
}
//被代理類
class Server implements NetWork{
    @oiverride
    public void browse(){}
}
//代理類
class ProxyServer implements NetWork{
    private NetWork work;
    public ProxyServer(NetWork work){
        this.work = work;
    }
    public void check(){
        sout("聯網前的檢測");
    }
    @override
    public void browse(){
        check();
        work.browse();
    }
}

main(){
    Server server = new Server();
    ProxyServer proxyServer = new ProxyServer(server);
    proxyServer.browse();
}

​ 應用場景: 安全代理,遮蔽對真實角色的直接訪問

​ 遠端代理:通過代理類處理遠端方法呼叫(RMI)

​ 延遲載入:先載入輕量級的代理物件,真正需要再載入真是物件

12.5設計模式:工廠模式

13. 內部類

​ 內部類 TM只出現在面試中吧。。。。

​ 自己做開發沒事閒的扯什麼犢子寫這玩意。。。

​ 活著不好麼???

​ 分類:成員內部類(static成員內部類,和非static成員內部類)

​ 區域性內部類(方法內,程式碼塊內,構造方法內),匿名內部類

class Person{
    public void method(){
        class A{}//方法體內區域性innerclass
    }
    {
        class B{}//程式碼塊內區域性innerclass
    }
    public Person(){
        class C{}//構造方法內區域性innerclass
    }
    class Heat{//成員內部類
        
    }
}

13.1成員內部類

​ 作為類的成員:

​ >能呼叫外部類的東西,但是要注意靜態的關係

​ >innerclass裡面的this指的是內部類,想要呼叫外部類的屬性,A.this.func()

​ >可以被四種許可權修飾

​ 作為一個類:

​ >類內可以定義的東西:當初普通類就行

​ >可以被繼承,可以被final修飾,可以抽象

class A{
	class B{
        int age;
        public void show(){}
    }	
    static class C{
        int age
    }
}

13.2內部類的例項化 及區分

class Person{
	String name;
	public void eat(){sout("人吃飯")}
    static class Dog{
        String name;
        public void eat(){sout("狗吃飯")}
    }
    class Bird{
        String name;
        public void eat(){sout("鳥吃食")}
        //區分同名屬性
        public void display( String name){
            sout(name);
            sout(this.name);
            sout(Person.this.name);
        }
    }
}
main(){
    Person.Dog dog = new Person.Dog(); //建立靜態成員內部類
    dog.eat();
    
    Person p = new Person();
    Person.Bird bird = p.new Bird();//建立 非靜態成員內部類
    bird.eat();
}

13.3 區域性內部類

注意:方法體內的內部類,使用了方法體裡面的區域性變數,這個變數必須是final,哪怕你不宣告,它也會預設final,你敢改變數值,他就敢報錯

JDK6之前,不寫final也報錯

why:區域性變數的宣告週期,除了函式,就沒了,而類呢,哪怕是區域性類,他也是直到不用了才銷燬的,問題來了,類還在,變數沒了,咋辦? 只能final

class Person{
    
    //開發中巨少見
    public void method(){
        class A{}//方法體內區域性innerclass
    }
    
    //真實情況,返回一個實現了Comparable介面的類的物件
    //方法1
    public Comparable getComparable(){
        class MyComparable implements Comparable{
            ...
        }
        return new MyComparable();
    }
    //方法2,不標準
    public Comparable getComparable(){
        return new Comparable(){
            @override
            ...
        };
    }
    
    {
        class B{}//程式碼塊內區域性innerclass
    }
    public Person(){
        class C{}//構造方法內區域性innerclass
    }
}