1. 程式人生 > >Java學習筆記03--main方法詳解;單例設計模式;繼承;instanceof 關鍵字

Java學習筆記03--main方法詳解;單例設計模式;繼承;instanceof 關鍵字

===============java相關講解=============

main函式的詳解:

public : 公共的。 許可權是最大,在任何情況下都可以訪問。 
    原因: 為了保證讓jvm在任何情況下都可以訪問到main方法。

static:  靜態。靜態可以讓jvm呼叫main函式的時候更加的方便。不需要通過物件呼叫。

void:  沒有返回值。 因為返回的資料是 給 jvm,而jvm使用這個資料是沒有意義的。所以就不要了。


main: 函式名。   注意: main並不是關鍵字,只不過是jvm能識別的一個特殊的函式名而已。


arguments :擔心某些程式在啟動需要引數。
class Demo4 {

    public static  void main(String[] args) 
    {
        System.out.println("陣列的長度:"+ args.length);
        for(int i = 0 ; i <args.length ; i++){
            System.out.print(args[i]+",");
        }

        Scanner scanner = new Scanner(System.in);


    }
}

單例設計模式

單例設計模式的步驟:

餓漢單例設計模式

  • 私有化建構函式。
  • 宣告本類的引用型別變數,並且使用該變數指向本類物件。
  • 提供一個公共靜態的方法獲取本類的物件。

懶漢單例設計模式:

  • 私有化建構函式。
  • 宣告本類的引用型別變數,但是不要建立物件,
  • 提供公共靜態 的方法獲取本類 的物件,獲取之前先判斷是否已經建立了本類 物件
    ,如果已經建立了,那麼直接返回物件即可,如果還沒有建立,那麼先建立本類的物件,
    然後再返回。

推薦使用: 餓漢單例設計模式。 因為懶漢單例設計模式會存線上程安全問題,目前還不能保證一類在記憶體中只有一個物件。

//餓漢單例設計模式 ----> 保證Single在在記憶體中只有一個物件。
class Single{ //宣告本類的引用型別變數,並且使用該變數指向本類物件 private static Single s = new Single(); //私有化建構函式 private Single(){} //提供一個公共靜態的方法獲取本類的物件 public static Single getInstance(){ return s; } }
//懶漢單例設計模式 ----> 保證Single在在記憶體中只有一個物件。

class Single2{

    //宣告本類的引用型別變數,不建立本類的物件
    private static Single2 s;

    //私有化了建構函式
    private Single2(){}

    //
    public static Single2 getInstance(){
        if(s==null){
            s = new Single2();
        }
        return s;
    }
}

java繼承

繼承:繼承是通過關鍵字extends體現的。

繼承的格式:

class 類名1 extends 類名2{

}

繼承要注意的事項:

  • 千萬不要為了減少重複程式碼而去繼承,只有真正存在著繼承關係的時候才去繼承。
  • 父類私有的成員不能被繼承。
  • 父類的建構函式不能被繼承。
  • 建立子類物件時預設會先呼叫父類無參的建構函式。
//人類 
class Person{

    String name;

    private int age;

    public  Person(String name){
        this.name = name;
    }

    public Person(){
        System.out.println("Person類的構造方法被呼叫了....");
    }

    public void eat(){
        System.out.println(name+"在吃飯...");
    }
}

//學生類
class Student extends Person {  // Student 就稱作為Person類的子類, Person類就稱作為Student的父類(超類、基類)

    int num; //學號

    public Student(){
        System.out.println("Student類的構造方法被呼叫了....");
    }

    public void study(){
        System.out.println(name+"good good study , day day up");
    }   
}

疑問: 為什麼要呼叫父類的構造方法啊?這樣子做的意義在那?

呼叫父類 的構造方法是可以初始化從父類繼承下去的屬性的。

class Fu{

    int x = 10;

    String name;

    public Fu(String name){
        this.name = name;
        System.out.println("Fu類d帶參的構造方法...");
    }

    public Fu(){
        System.out.println("Fu類無參的構造方法...");
    }
}


class Zi extends Fu{

    int x = 20;

    public Zi(String name){
        super(name); //指定呼叫父類一個引數的建構函式。
    }


    public void print(){
        System.out.println("x1 = "+ x);
    }

}


class Demo8 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi("大頭兒子"); 
        System.out.println("name= "+z.name);

    }
}

instanceof 關鍵字

  • instanceof關鍵字的作用:判斷一個物件是否屬於指定的類別。

  • instanceof關鍵字的使用前提:判斷的物件與指定的類別必須要存在繼承或者實現的關係。

  • instanceof關鍵字的使用格式:

    `物件  instanceof 類別`
    
  • 一般我們做強制型別轉換之前都會使用該關鍵字先判斷一把,然後在進行轉換的。

class Demo{

    public static void main(String[] args) 
    {
        Dog d = new Dog("哈士奇","白色");
        System.out.println("狗是狗類嗎?"+ (d instanceof Dog));
        System.out.println("狗是動物類嗎?"+ (d instanceof Animal));   
        //System.out.println("狗是老鼠類嗎?"+ (d instanceof Mouse));      
        Animal a = new Animal("狗娃","黃色"); //狗娃是人
        System.out.println("動物都是狗嗎?"+ (a instanceof Dog));


    }
}

——————————————————————————————————————————————————

===============與上方java相關的iOS技術關聯理解==========

ios程式啟動原理

iOS單例 –Singleton

單例模式的意思就是隻有一個例項。單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。

  • 單粒:保證程式執行過程中,永遠只有一個物件例項

  • 目的是:全域性共享一份資源、節省不必要的記憶體開銷

單例的特點:

  • 1.單例物件可以儲存一些共享的資訊,每個物件都能訪問和修改
  • 2.如果一個類的建立非常耗費效能,那麼這個類最好設計為單列,只建立一次,節約效能;
    缺點:單例物件一旦建立,物件指標是儲存在靜態區的,單例物件在堆中分配的記憶體空間,會在應用程式終止後才會被釋放;
#import "ServiceManager.h"

static ServiceManager *defaultManager;

@implementation ServiceManager

+(ServiceManager *)defaultManager{
    if(!defaultManager)
        defaultManager=[[self allocWithZone:NULL] init];
    return  defaultManager;
}

@end
#import "ServiceManager.h"


@implementation ServiceManager


+(ServiceManager *)sharedManager{
    static dispatch_once_t predicate;
    static ServiceManager * sharedManager;
    dispatch_once(&predicate, ^{
        sharedManager=[[ServiceManager alloc] init];
    });
    return sharedManager;
}

@end