JAVA_TOJAVASE_Day0809(面向物件,陣列工具的建立和物件繼承、單例設計模式、抽象類)
阿新 • • 發佈:2019-01-10
面向物件,陣列工具的建立和物件繼承
優化:
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.一般類可以被例項化,抽象類不可以例項化。
*/