1. 程式人生 > >JAVA_TOJAVASE_Day0809(面向物件,陣列工具的建立和物件繼承、單例設計模式、抽象類)

JAVA_TOJAVASE_Day0809(面向物件,陣列工具的建立和物件繼承、單例設計模式、抽象類)

面向物件,陣列工具的建立和物件繼承

這裡寫圖片描述

這裡寫圖片描述

優化:

package com.ttzx.study.utils;
/**
 * 建立一個用於運算元組的工具類,其中包含著常見的對陣列操作的函式,如:最值排序等。
 * @author 子龍
 * @version V1.0
 *
 */
public class ArrayTool {

    private ArrayTool() {}//該類中的方法都是靜態的,所以該類是不需要建立物件的,為了保證不讓其他的建立該類物件可以將構函式私有化
    /**
     * 獲取整型陣列的最大值
     * @param arr 傳入整型陣列。
     * @return
返回該陣列中的最大元素值。 */
public static int getMax(int[] arr) { int maxIndex = 0; for (int x = 1; x < arr.length; x++) { if (arr[x] > arr[maxIndex]) { maxIndex = x; } } return arr[maxIndex]; } /** * 對陣列選擇排序 * @param
arr 接收一個int型別的陣列 */
public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = x + 1; y < arr.length; y++) { if (arr[x] > arr[y]) { swap(arr, x, y); } } } } /* * 用於給陣列進行元素的位置置換 * @param arr int型別的陣列 * @param x 需要置換元素的角標 * @param y 需要置換元素的角標 */
private static void swap(int[] arr, int x, int y) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } /** * 獲取指定的元素在指定陣列中的索引 * @param arr 要查詢的int陣列 * @param key 要找的元素 * @return 返回元素第一次出現的位置,如果不存在返回-1 */ public static int getIndex(int[] arr, int key) { for (int x = 0; x < arr.length; x++) { if (arr[x] == key) { return x; } } return -1; } /** * 整型陣列轉字串 格式是[ e,e2,e3.....] * @param arr 接收整型的int陣列 * @return 返回一個固定格式的字串 */ public static String arrayToString (int []arr) { String str=""; for(int i=0;i<arr.length;i++) { if(i!=arr.length-1) { str=str+arr[i]+","; }else { str=str+arr[i]+"]"; } } return str; } }

注意當使用javadoc 匯出文件註釋時,需要新增-encoding UTF-8 -charset UTF-8如下:

將-encoding UTF-8 -charset UTF-8這一段複製到elipse的相應輸入框中,如下圖:

這裡寫圖片描述

這裡寫圖片描述

面向物件 設計模式——單例設計模式 概述、體現

這裡寫圖片描述

輸出的結果是 true

這裡寫圖片描述

單例設計模式 ——懶漢式

這裡寫圖片描述

餓漢式(實際都用餓漢式較多。)

這裡寫圖片描述

面相物件之繼承

概述

這裡寫圖片描述

這裡寫圖片描述

java中支援單繼承,不直接支援多繼承,但對C++中的多繼承機制進行改良

這裡寫圖片描述

成員變數的體現:

這裡寫圖片描述

成員方法的體現:

這裡寫圖片描述

輸出的結果是:這裡寫圖片描述

什麼時候用覆蓋操作
這裡寫圖片描述

面向物件——繼承,子父類建構函式,子類的例項化過程

package com;
/**
 * 在子類構造物件時,發現訪問子類建構函式,父類也運行了。
 * 為什麼呢?
 * 原因是:在子類的建構函式中第一行有一個預設的隱式語句。super()
 * @author Administrator
 *
 */
public class ExtendsDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ExtendsDemo3().new Zi();
    }

    class Fu{

        public Fu() {
            // TODO Auto-generated constructor stub
            System.out.println("Fu...");
        }

    }
    class Zi extends Fu{
        public Zi() {
            //super();//呼叫的就是弗雷中的空引數的建構函式
            // TODO Auto-generated constructor stub
            System.out.println("Zi...");

        }
    }

}


package com;

public class ExtendsDemo33 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ExtendsDemo33().new Zi();
    }
    //為什麼子類例項化的時候要訪問父類中的建構函式?
    //那是因為子類繼承父類,獲取到了父類中內容,所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的。
    //所以子類在構造物件時,必須訪問父類中的建構函式。
    //為什麼完成這個必須的動作,就在子類的建構函式中加入super()語句
    //如果父類中沒有定義空引數建構函式,那麼子類的建構函式必須用super明確要呼叫父類中的那個建構函式。同時子類建構函式中如果使用this呼叫了本類建構函式時,那麼super就沒有了,因為super和this都只能定義第一行,所以只能有一個。
    但是可以保證的,子類中肯定會有其他的建構函式來訪問父類的建構函式
    //注意super語句必須要定義在子類建構函式的第一行,因為父類的初始化先完成。


    class Fu{

        public Fu() {
            // TODO Auto-generated constructor stub
            System.out.println("Fu...A");
        }
        public Fu(int x) {
            //super();//呼叫的就是父類中的空引數的建構函式
            // TODO Auto-generated constructor stub
            System.out.println("Fu...B"+x);

        }
    }
    class Zi extends Fu{
        public Zi() {
            //super();//呼叫的就是父類中的空引數的建構函式
            // TODO Auto-generated constructor stub
            System.out.println("Zi...C");

        }
        public Zi(int x) {

            System.out.println("Zi...D"+x);

        }
    }
}

面向物件——繼承,子父類建構函式,子類的例項化過程(細節)

package com;

public class T {

    public static void main(String[] args) {
        Zi z = new T().new Zi();
        z.show();
    }

    class Fu {

        public Fu() {
            super();
            show();
            return;
        }

        void show() {
            System.out.println("fu.....show");
        }

    }

    class Zi extends Fu {

        int num = 8;

        public Zi() {
            super();
            //通過super初始化父類內容時,子類的成員變數並未顯示初始化。等super()父類初始化完畢後,才進行初始化。
            System.out.println("zi cons run...."+num);
            return;
        }

        void show() {
            System.out.println("zi show " + num);
        }

    }

    /**
     * 一個物件例項化過程:
     * Person p=new Person();
     * 
     * 1.JVM 會讀取指定的路徑下的Person.class 檔案,並載入進記憶體,
     * 並會先載入Person的父類(如果有直接的父類的情況下)。
     * 2.在堆記憶體中開闢空間,分配地址。
     * 3.並在物件空間中,對物件中的屬性進行預設初始化。
     * 4.呼叫對應建構函式進行初始化
     * 5.在建構函式中,第一行會先呼叫父類中的建構函式,進行初始化。
     * 6.預設初始化完畢後,在對子類的屬性顯示初始化。
     * 7.在進行子類建構函式的特定初始化
     * 8.初始化完畢後,降低至值賦值給引用變數。
     *  
     */
    //輸出的結果是:
    zi show 0
    zi cons run....8
    zi show 8

}

final 關鍵字

package com.myfinal;

public class StudyFinal {
/*
 * 繼承弊端: 打破了封裝性
 * 
 */
    /**
     * final 關鍵字
     * 1.final 是一個修飾符,可以修飾類,方法,變數。
     * 2.final 修飾的類不可以被繼承。
     * 3.final修飾的方法不可以被覆蓋。
     * 4.final修飾的變數是一個常量,只能賦值一次。
     * 
     * 為什麼要用fianl 修飾變數,其實在程式如果一個數據是固定的。
     * 那麼直接使用這個資料就可以了,但是這樣閱讀性差,所以它該資料七個名稱。
     * 而且這個變數名稱值不能變化,所有加上final固定。
     * 
     * 寫法規範,常用所有字母大寫,如果多個單詞連線用_連線。
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

面向物件 抽象類

package myAbstract;

public class AbstractDemo {

    /*
     * 抽象類: 抽象:籠統、模糊,看不懂!不具體。
     */
    public static void main(String[] args) {

    }

    /**
     * DemoA和DemoB 具體功能不一樣
     * 
     * @author Administrator
     *
     */
    class DemoA extends Demo {

        @Override
        void show() {
            System.out.println("demoa show");
        }

    }

    class DemoB extends Demo {

        void show() {
            System.out.println("demob show");
        }
    }
}
package myAbstract;

public abstract class Demo {

    abstract void show();
}

面向物件抽象類的特點:

 * 特點:
     *  1.方法只有宣告沒有實現時,該方法就是抽象方法,需要被abstract修飾。
     * 抽象方法必須定義在抽象類中,該類必須也是abstract。
     *  2.抽象類不可以被例項化,為什麼?因為呼叫抽象方法沒有意義。
     * 3.抽象類必須有其子類覆蓋了所有的抽象方法後,該子類才可以例項化。否則這個子類還是抽象類。

面向物件抽象類細節:

/**
     * 1.抽象類中有建構函式嗎?
     * 
     * 有 ,用於給子類物件進行初始化。
     * 
     * 2.抽象類可以不定義抽象方法嗎?
     * 可以,目的是不讓這個類建立物件。AWT的介面卡物件就是這種類。
     * 通常這個類中的方法有方法體,但是卻沒有內容。
     * 
     * 
     * 3.抽象類關鍵字不可以和那些關鍵字共存?
     * 
     * private 不行,如修飾了抽象方法,不能被子類覆蓋了。
     * static 不行,如果能用static 就不需要在建立物件了,那就直接用類名.方法名。但是方法沒有方法體沒有任何意義。
     * final 不行,final 修飾的不能被繼承,所以這個抽象類也就不能繼承了,也就沒有啥意義
     * 
     * 
     * 4.抽象類和一般類的異同點?
     *  相同點:
     *      抽象類和一般來都是用類描述事物的,都在內部定義了成員。
     * 不同:
     * 1.一般類有足夠的資訊描述事物。
     * 抽象類描述事物的資訊可能不足。
     * 2.一般類中不能定義抽象方法,只能定義非抽象方法
     * 抽象類中可以定義抽象方法,也可以定義非抽象方法。
     * 3.一般類可以被例項化,抽象類不可以例項化。
     */

面向物件抽象類 ——練習