日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用java实现面向对象编程

發布時間:2024/1/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用java实现面向对象编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ??第一章:抽象和封裝 學習面向對象,理解其中的概念只是前提,靈活應用才是目的 面向對象編程比較抽象,想要真正掌握,需要一個漫長,積累經驗的的過程,在學習中不能操之過急,要多思考,多總結,遇到問題盡量自己解決?
面向過程的的核心是函數,以功能為中心,實現了函數級別的代碼重用, 面向對象的核心是封裝了屬性和方法的,以數據為中心,實現了類級別的代碼重用,面向對象因為采用了類,所以具有繼承和多態性
面向對象設計的過程就是抽象的過程,分以下三步來完成 第一步:發現類 第二步:發現類的屬性 第三步:發現類的方法
面向對象的三大特性: 封裝、繼承、多態,還有一個抽象(應該是指類) 類(class)和對象(object)是面向對象中的兩個核心概念: 類是對一類事物的描述, 是抽象的,對象是實際存在的,是具體的; 類和對象就好比模具和鑄件的關系; 一個類可以實例化多個對象,而一個對象只能屬于一個類 類主要由屬性和行為組成,屬性和行為又稱為類的成員變量和成員方法 統稱為類的成員(除此之外,類的成員的還包括構造方法,代碼塊{}
封裝:將類的狀態信息隱藏在類的內部,不允許外部程序直接訪問, ? ? ?而通過該類提供的方法來實現對隱藏信息的操作和訪問
? ? ?像stu.age=200;是不允許的,這個時候就要把字段age封裝起來 ? ? ? ,使用getter和setter方法封裝字段 ==》步驟:將字段私有化,接下來按右鍵,選擇源代碼(source)--> ? ? ? 選擇生成getter和setter ==》好處:可以方便的加入存取控制語句,限制不合理操作 訪問修飾符: private:只可在本類中訪問 public: 默認:只能被同一個包里的類訪問 protected 能被同一個包里的類訪問,也可以被不同包中的子類訪問
屬性 方法 代碼塊,內部類 可用static 修飾,但不能修飾普通類 static{ ????????//類的靜態修飾的代碼塊,只在最初調用一次 ????????System.out.println("該類Circle是由我完成編寫!"); ????}??
static : ?數據在整個程序中只有一個空間,大家共享 ? ? ? ? 通常把 static ?修飾的屬性和方法稱為 類屬性 類方法, ? ? ? ? 沒用 static ?修飾的 屬性和方法稱為 實例屬性 實例方法 ? ? ? ? ? 被申明為static的屬性方法代碼塊 ? ? ? ? 先于實例化的對象而存在,而且是貫穿整個程序 ? ? ? ? 不可以修飾類和局部變量 ? ? ? ? 在加載類的過程中,先完成靜態變量的內存分配,再執行靜態塊 ? ? ? ? 靜態的屬性或方法可以通過類名或對象名訪問? ? ? ? ? 靜態的方法中不能使用 this super 關鍵字 常量:全部大寫
類名:每個單詞首字母大寫 屬性名和方法名:第一個單詞首字母小寫其余首字母大寫
構造方法(Constructor)及其重載: 構造方法: 名稱和類名相同,沒有返回值類型, 如果寫了返回值,等同于一般的方法 構造方法的主要作用就是在創建對象時,執行一些初始化操作 面試題常考要注意:構造方法不能被繼承,所以不能被重寫 還要答出什么是構造器
public?class?Circle?{? ? ? private ? double ?r; ? ?? public? Circle? (){} ? //無參構造函數 ? ? public ?Circle( double ?r){? ?//帶參構造函數 ????????this.r?=?r; ????} ? //無參構造函數與帶參構造函數形成重載關系
}??
//注意:當類中一個構造函數也沒有的時候,系統會默認提供一個空的構造函數,以上面的例子
?public?Circle?(){}
//但是如果類中已經寫了帶參構造函數時,默認提供的構造函數會消失 //所以最好將無參構造函數和有參構造函數一起寫 重載:
在同一個類中,方法名相同,參數列表不同的方法形成重載。 與方法返回值和方法修飾符無關。 在使用this調用自身的其他構造方法時,只能做第一條非注釋語句。 就像這樣: public?class?Person{ ????private?static??String?name; ????private?static??int?age; ????public? Person ()?{ ????????this(name,age);// 只能做第一條非注釋語句 ????} ????public? Person (String?name,? int ?age)?{ ????????this.name?=?name; ????????this.age?=?age; ????} }??
??第二章: ?繼承 inheritance ?:繼承
constructor:構造器 abstract:抽象 override:覆蓋、重寫 overload:重載 繼承(inheritance)是Java OOP中一個非常重要的概念。繼承是在復用已存在的類的方法和屬性 的基礎上,還可以添加新的方法和屬性 Java用extends關鍵字來表示繼承關系(is-a)。被繼承的類稱為超類(superclass)、基類(base class)、父類(parent class),而新類被稱為子類(subclass)、派生類(derived class)或孩子類(child class)。 java支持單繼承支持多實現

例如:

Manager?is a?Employee

class?Manager?extends?Employee{ ? ? ? super (); 默認調用父類的構造方法,加不加都一樣 ? ? ? ?//Manager?類繼承Employee類,同時添加新的方法? ? ? ? //setBonus和新的屬性 bonus ??????public?void?setBonus(double?s){ ????????????bonus?=?s; ??????} ? ? ? ??????private?double?bonus;? } ??

1. 子類方法覆蓋(override)超類方法

假設Manager類繼承于Employee類,Employee有name、salary和hireDay三個屬性,Manager又新增了bonus一個屬性。Employee有方法getSalary(),現在Manager的計算薪水的方式不一樣,需要重寫getSalary(),以覆蓋Employee類的此方法。

需要注意的是子類不能直接訪問超類的私有屬性(假設salary為私有屬性),

那么就不能使用下面這種方法:

public?double?getSalary(){ ??????return?salary?+?bonus;?//error.?salary?不能被訪問到 }??

Java利用另一個方法解決上面這個問題,即使用超類的方法獲取屬性的值。

public?double?getSalary(){ ??????return?super.getSalary()?+?bonus;? //super.方法名 } ??

注釋: super不能把它覆給另一個對象變量,

? ? ? ?它只是一個指示編譯器調用超類方法的特有關鍵字。

? ? ? ?super的另一個應用就是在構造器中。子類構造器需要調用超類的某些構造器

? ? ? ?以初始化一些超類的屬性(尤其是私有屬性)。

public?Manager(String?n,?double?s,?int?year,?int?month,?int?day){ ???????//父類已經做完了,子類不必再做了 ??????super(n,?s,?year,?month,?day); ??????bonus?=?0; }?? ??

2.? 繼承層次

由一個公共超類派生出來的所有類的集合被稱為繼承層次(inheritance hierarchy),

在繼承層次中由某個特定類到其祖先的路徑被稱為該類的繼承鏈(inheritance chain)。

重寫與重載有什么區別和聯系:

重載:要求方法名相同,參數列表不同即可

重寫:方法名、參數列表、返回值類型相同(或是其子類,這里指的是多態)、訪問修飾符不能嚴于父類

3.? 多態(polymorphism)和動態綁定(dynamic binding

一個對象變量可以引用多種實際類型的現象稱多態;

在運行時能夠自動地選擇調用哪個方法的現象稱為動態綁定。

例如:

Manager?boss?=?new?Manager("boss",?80000,?1987,?12,?15); boss.setBonus(5000); Employee[]?staff?=?new?Employee[3]; staff[0]?=?boss; staff[1]?=?new?Employee("employee_1",50000,?1989,3,23); staff[2]?=?new?Employee("employee_2",50000,?1990,4,22); //多態:變量e既可以引用Manager對象,又可以引用Employee對象 //動態綁定:變量e引用Employee對象時調用Employee類的getSalary()方法 //而引用Manager對象時調用Manager類的getSalary()方法 for(Employee?e?:?staff) ??????System.out.println(e.getName()?+?"?"?+?e.getSalary()); 多態 Employee?e; e?=?new?Employee(...);?//OK e?=?new?Manager(...);???//OK //但是超類變量不能引用子類對象 Employee?a?=?new?Employee(...); Manager?m?=?a;?//error動態綁定:????
① 編譯器查看對象的聲明類型和方法名,獲取所有可能被調用的候選方法;對象方法執行過程的詳細:

② 編譯器查看那調用方法時提供的參數類型,如果與某個候選方法的參數類型完全相同,則選擇這個方法。這個過程被稱為重載解析(overloading resolution);

③ 前面兩步已經獲得需要調用的方法名字和參數類型,接下來如果是private方法、static方法、final方法或者構造器,那么編譯器將可以準確地知道應該調用哪個方法,這種調用方式被稱為靜態綁定(static binding)。與此對應的是,調用的方法依賴于隱式參數的實際類型,并且在運行時實現動態綁定;

④ 哪個動態綁定調用方法時,虛擬機一定調用與隱式參數所引用對象的實際類型最合適的那個類的方法。

注:虛擬機為了避免每次都進行搜索方法,所以預先為每個類創建一個方法表(method table),其中列舉了所有方法的簽名和實際調用的方法。只需查表,所以更快。

4.? 阻止繼承:final類和方法

將類聲明為final,則阻止會其他類對該類進行繼承。將類中的方法聲明為final,子類就不能覆蓋這個方法了。final類中的所有方法自動地稱為final方法。

?代碼如下 復制代碼
final?class?Executive?extends?Manager { } class?Employee { ??????public?final?String?getName() ??????{ ????????????return?name; ??????} ???? }??

注釋:屬性也可以聲明為final。對于final屬性來說,只是在構造對象之后不能再修改它的值而已。我們將方法或者類聲明為final的主要原因是確保他們不會在子類中改變語義。有些程序員建議是除非我們有足夠的理由使用多態性,否則應該將所有的方法聲明為final。這樣可以減少動態綁定過程帶來的系統開銷,提高程序性能。但是,隨著Java虛擬機的發展,其處理能力越來越強,編譯器已經可以很短的時間內知道類之間的繼承關系,并且能夠很快地檢測出是否存在覆蓋的方法。

5.? 強制類型轉換

?只能在繼承層次內進行類型轉換
?在將超類轉換成子類之前,應該使用instanceof進行檢查

?代碼如下 復制代碼
Employee[] staff = new Employee[3];
staff[0] = new Manager(...);
staff[1] = new Employee(...);
staff[2] = new Employee(...);
?
Manager boss;
if(staff[1] instanceof Manager)
{
????? boss = (Manager) staff[1];
}

6. 抽象類

什么是抽象類?

? ?類是對一類事物的描述,如果一個類中沒有包含足夠的

? 信息?來描繪象,那么這個類就是抽象類

什么時候用抽象類?

一般抽象類都是父類基類


抽象類和抽象方法都用abstract關鍵字聲明。不能用來修飾屬性和構造方法

抽象類不是不能實例化,而是不能直接實例化,可以通過子類間接實例化

public?class?ui?implements?usbInterface{ ????public?void?serivce()?{ ????????System.out.println("連接USB接口,開始傳輸數據"); ????} }??

public?interface?usbInterface?{ ???void?serivce(); }??

? ? ? public ? static ? void ?main(String[]?args)?{ ? ? ? ? usbInterface? ?u= new ?ui(); ????????if(u?instanceof?usbInterface) ?????????sop("true"); //true ???????? ????}???

面試題:抽象類和接口的區別是什么?何時用抽象類,何時用接口

與接口比較區別:

抽象類表示該類中可能已經有一些方法的具體定義,但是接口就僅僅只能定義各個方法的界面(方法名,參數列表,返回類型),并不關心具體細節。 接口是引用類型的,和抽象類的相似之處有三點:
  • 不能直接實例化;
  • 包含未實現的方法聲明;
  • 派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)。 [2]
  • 抽象類與接口緊密相關。然而接口又比抽象類更抽象,這主要體現在它們的差別上:
  • 類可以實現無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現接口,從而得出接口是用來解決 多重繼承問題的。
  • 抽象類當中可以存在非抽象的方法,可接口不能,且它里面的方法只是一個聲明必須用public來修飾沒有具體實現的方法。
  • 抽象類中的 成員變量可以被不同的 修飾符來修飾,可接口中的成員變量默認的都是靜態 常量(static final)。
  • 抽象類是對象的抽象,然而接口是一種行為規范。
  • 抽象類里面可以有非抽象方法但接口里只能有抽象方法 聲明方法的存在而不去實現它的類被叫做抽像類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。 然而可以創建一個變量,其類型是一個抽像類,并讓它指向具體子類的一個實例。不能有抽像構造函數或抽像靜態方法。Abstract 類的子類為它們父類中的所有抽像方法提供實現,否則它們也是抽像類。 取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。 接口(interface)是抽像類的變體。在接口中,所有方法都是抽像的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽像的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對像上調用接口的方法。由于有抽像類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口

    ?何時用抽象類,何時用接口:
    共同點是他們都可以實現多態。
    不同點在于設計抽象類和接口的目的和使用方式有所不同,抽象類是為繼承而精心設計的,接口則更多以組合的方式使用。

    如果你的業務中可以抽象出一個通用的處理過程,只是某些局部傳遞的狀態或參數有所不同,這時可以考慮使用抽象類。否則在一般的情況下,優先使用接口和組合的形式,這樣使代碼之間的耦合度降低。

    一個比較典型的抽象類使用范例是模板模式,當然也有使用組合來實現的模板。另一個使用抽象類的情形,比如很多場合下特別是對一個聲明了相當數量方法的接口,提供一個類似模板的默認實現類是很有好處的,比如spring提供的一些template,dom4j提供的VisitorSupport等。甚至在effective java里已經將這種方式提倡成一種最佳實踐。



    abstract不能和private、final、static修飾同一個方法

    抽象類中可以有構造方法,用來初始化子類信息
    包含一個或多個抽象方法的類必須聲明為抽象類。
    在抽象類中還可以有屬性和具體方法的實現。

    抽象方法沒有方法體

    若要強迫子類重寫父類的方法就讓父類的方法變成抽象方法

    若要讓子類不能重寫父類的方法就讓父類的方法變成最終方法

    ?代碼如下 復制代碼

    abstract?class?Person{ ??????public?Person(String?n)?{ ?????????????name?=?n; ??????} ?????? ??????public?abstract?String?getDescription(); ??????public?String?getName()?{ ?????????????return?name; ??????} ??????private?String?name; }??

    一、final

      final類不能被繼承,沒有子類,final類中的方法默認是final的。

      不是final類里的final方法不能被子類的方法覆蓋,但可以被子類繼承

      final不能用于修飾構造方法。final修飾符的主要目的是防止被修改,如父類要防止子類重寫其方法,就使用final修飾符 ? ? ? ?而構造方法子類無法繼承,所以使用final修飾符沒意義

      final成員變量表示常量,只能被賦值一次,賦值后值不再改變。

      注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

      1、final類

      final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,并且確信這個類不會載被擴展,那么就設計為final類。

      2、final方法

      如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。

      使用final方法的原因有二:

      1.把方法鎖定,防止任何繼承類修改它的意義和實現。

      2.高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。

      3、final變量(常量)

      用final修飾的成員變量表示常量,值一旦給定就無法改變!

      final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。

      從下面的例子中可以看出,一旦給final變量初值后,值就不能再改變了。

      另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什么情況,編譯器都確保空白final在使用之前必須被初 始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同, 卻有保持其恒定不變的特征。

      4、final參數

      當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

     

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第三章:多態(polymorphism)

    什么是多態?答:不同對象對同一操作的不同實現

    子類到父類的轉換(向上轉型)

    類到類的轉換(向下轉型)?

    使用 父類作為方法的形參實現多態

    使用 父類作為方法的返回值實現多態 使用多態的優勢:可以減少代碼量,提高代碼的可擴展性和可維護性 繼承是多態的基礎,沒有繼承就沒有多態? instanceof 運算符 語法:對象名 ? instanceof 類或接口 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ??? 第四章:接口(interface) 防盜門 is a 門 has a 鎖 的功能 ??|----繼承?? ? ?? ?|-----接口(相當于擴展功能)-------------------手機的功能擴展 接口是一套規范和標準,他們可以約束類的行為,是一些方法特征的集合,但是沒有方法的實現 抽象類利于代碼復用,接口利于代碼的擴展和維護
    接口類中,定義的是方法,在不同子類中有不同的實現,也就是要被子類重寫,接口類的方法就可設計為抽象方法,實現了多態,實現了多實現 接口的命名規則與類名相同,如果修飾符是public,則該接口在整個項目中可見; 如果省略修飾符,則該接口只在當前包可見 接口中可以定義常量,不可以定義變量,接口中的屬性都會自動用public static final 修飾?,即接口中的屬性都是全局靜態常量,接口中的常量必須在定義時指定初始值 接口中所有的方法都是抽象方法,不得有方法體,不得私有化,因為抽象方法要強迫子類重寫其方法, 接口中的方法都會自動用public abstract修飾 ,即接口中的方法都是全局抽象方法 接口不能實例化,不能有構造方法 接口之間可用關鍵字extends實現繼承關系 接口的實現類必須實現接口的的全部方法,否則必須定義為抽象類 extends關鍵字必須在implements關鍵字之前
    通過以上我們解了接口表示一種能力,一個類實現了某個接口,就表示這個類具備了某種能力 打印機打印小貓小狗,學生、老師、校長、學校等對象,而這個接口必須有傳遞信息的能力? 從使用的角度講:接口和抽象類的區別在于抽象類利于代碼復用,接口利于代碼維護,接口類似于一個組件,需要時可以自由組裝 繼承的時候同時實現 接口表示一種約定:使用接口實現打印機打印 在面向對象編程中提倡面向接口編程,而不是面向實現編程 接口體現了約定和實現相分離的原則,通過面向接口編程,可以降低代碼間的耦合性,提高代碼的可擴展性和可維護性。面向接口編程就意味著:開發系統時 ,主體架構是使用接口,接口構成系統的骨架,這樣就可以通過更換 實現接口的類來實現更換系統
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? 第六章:異常中的throw throws 幾個常見的異常: 2A:ArithmeticException、ArrayIndexOutOfBounds Exception 2C:ClassNotFoundException(不是運行時異常)、CalssCastException 2I:InputMismatchException、IllegalArgumentException 2N:NullPointer Exception、NumberFormatException 常用的異常方法: void printStackTrace():輸出異常的堆棧信息 String getMessage():返回異常信息描述的字符串,該信息只是 printStackTrace():輸出信息的一部分 throws : 如果在方法聲明的同時聲明了可能發生的異常( throws Exception),throws可以同時聲明多個異常類,用逗號分開,父異常類放最后 有兩種處理方式: 1:讓調用者通過try-catch?捕獲并處理異常 2:如果調用者也不打算處理異常,就可以通過throws 繼續聲明異常,讓上一級調用者處理 throw:果在用于方法體內部,拋出的是異常對象
    運行時異常: Check異常(非運行時異常):檢查異常: 凡是在API中在構造方法詳細信息里有聲明異常類型,該異常類型就是檢查異常 常見的檢查異常有IOExceptin 檢查異常必須要做處理,否則編譯不通過,處理方式是要么繼續聲明異常類,要么try ? ? ? ? ?try?{ ?????????????throw?new?Exception("輸入錯誤!"); ????????}?catch?(Exception?e)?{ //? 想把項目中出現的異常以文件的形式記錄下來 ????????????e.printStackTrace(new?PrintStream(new?FileOutputStream("C:\\Users\\hp\\Desktop\\1.txt"),?true)); ????????}??
    》》》如果想把項目中出現的異常以文件的形式記錄下來,甚至記錄程序正常運行的關鍵步驟信息,以便日后查看,就需要使用開源日志記錄工具?log4j 開源日志記錄工具:log four(for 4) java 縮寫 log4j 在項目中創建一個與src同級的 libs目錄,然后把相應的jar包復制進來,然后右鍵這個 jar包,選擇構建路徑,會生成一個引用的庫

    接下來就是右鍵src目錄,新建一個文件,文件名為log4j.properties,雙擊打開這個文件,在下面點擊source進行文件配置 /*stdout(Standardoutput)標準輸出 stdin(Standardinput)標準輸入 stderr(Standarderror)標準錯誤*/
    ######
    ######


    ### 設置Logger的 輸出級別和輸出目的###
    log4j.rootLogger=info,stdout,fileout ?? ### 把日志信息輸出到控制臺###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout ### 把日志信息輸出到文件stu.log ###
    log4j.appender.fileout=org.apache.log4j.FileAppender log4j.appender.fileout.File=stu.log log4j.appender.fileout.layout=org.apache.log4j.PatternLayout log4j.appender.fileout.layout.Conversion.Pattern=%d?%F?%1?%m?%n

    日志及分類 SQL日志: 異常日志: 業務日志:記錄系統運行過程,如用戶登錄、操作記錄 log4j是Apache的一個開源項目,是一個非常優秀的日志記錄工具,通過使用log4j,我們可以控制日志輸出的級別,以及日志信息輸送的目的地,還可以控制每一條日志的輸出格式 Logger 對象是用來替代System.out或者System.err的日志記錄器 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 第七章:?java ?集合框架


    List:有序可重復 Set:無序不可重復 Map:無序不可重復 Dog dog=(Dog)list.get(i);必須強轉,否則會編譯錯誤! 當長度需要增長時,Vector默認增長為原來的一倍,而ArrayList只增長50% //先進先出與后進先出
    ?import?java.util.*//第一步導入包 ?class?Queue?{ ?????private?LinkedList?list?=?new?LinkedList();//非泛型不安全 ?????public?void?add(Object?obj){ ?????????list.addFirst(obj); ?????} ?????//先進先出 ?????public?Object?get(){ ?????????Object?obj?=?list.getLast(); ?????????list.removeLast(); ?????????return?obj; ?????} ?????//后進先出 ?????public?Object?get2(){ ?????????Object?obj?=?list.getFirst(); ?????????list.removeFirst(); ?????????return?obj; ?????} ?????public?int?size(){ ?????????return?list.size(); ?????} ?????@Override ??????//重寫Object的toString方法 ?????public?String?toString()?{ ?????????StringBuffer?str?=?new?StringBuffer(""); ?????????for?(Object?obj?:?list)?{ ?????????????str.append(obj.toString()).append("?"); ?????????}???????? ?????????return?str.toString(); ?????} ?} ?public?class?Test3?{ ?????public?static?void?main(String[]?args)?{ ?????????Queue?qu=new?Queue(); ?????????qu.add("Jack"); ?????????qu.add("Lucy"); ?????????qu.add("Lily"); ?????????qu.add("Tom"); ?????????qu.add("Tomas"); ?????????System.out.println(qu); ?????????System.out.println(qu.size()); ?????????String?name?=?qu.get().toString();//先進先出 //?????????String?name?=?qu.get2().toString();//后進先出 ?????????System.out.println(name); ?????????System.out.println(qu); ?????????System.out.println(qu.size()); ?????} ?}??

    ?int?num?=Integer.parseInt("36"); ?boolean?Boolean.parseBoolen("true");??
    第八章:JDBC(Java ?DataBase Connectivity) JDBC:Java 數據庫連接,由一組類和接口組成,可以為多種關系數據庫提供統一的訪問。Sun公司(現在已經被Oracle公司收購)提供了JDBC 的接口規范?JDBC API?,而數據庫廠商或第三方中間件廠商根據該接口規范提供針對不同不同數據庫的具體實現---------JDBC 驅動
    ?JDBC的工作原理: java的應用程序可以集成在JDK中的java.sql和javax.sql包中的JDBC API 來連接和操作數據庫?

    1:JDBC API?提供了Java 應用程序與各種不同數據庫交互的標準接口,如Connection接口、Statement接口、ResultSet接口、PreparedStatement接口、等 2:JDBC Driver Manager:負責管理各種不同的JDBC驅動,位于JDK的java的java.sql包中 3:JDBC 驅動:負責連接各種不同的數據庫 JDBC API 主要做三件事:連接數據庫、發送sql語句、處理結果
    JDBC 訪問數據庫的步驟: 1:加載驅動 2:與數據庫建立連接 3:發送sql語句,并得到返回結果 4:處理返回結果 package?com.JulySeven.DAO; import?java.sql.*; /** ?*?@author?ljh ?*?這個類搞定數據庫連接和數據庫的增刪改 ?*?*/ public?class?DataBaseDao?{ ????//創建一個返回一個連接對象的方法 ????public?Connection?getCon(){ ????????Connection?con=null; ???????? ????????final?String?URL="jdbc:sqlserver://localhost:1433;DatabaseName=epet"; ????????final?String?UNAME="sa"; ????????final?String?UPWD="123"; ????????try?{ ? ? ? ? ? ? ? ? //加載驅動
    ????????????Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ? ? ? ? ? ? ? //與數據庫建立連接 ????????????con=DriverManager.getConnection(URL,UNAME,UPWD); ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????} ????????return?con; ????} ????//關閉所有連接資源 ????public?void?closeAll(Connection?con,Statement?smtm,ResultSet?rs){ ????????try?{ ????????????if(rs!=null){ ????????????????rs.close(); ????????????} ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????} ????????try?{ ????????????if(smtm!=null){ ????????????????smtm.close(); ????????????} ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????} ????????try?{ ????????????if(con!=null &&!con.isClosed() ){ ????????????????con.close(); ????????????} ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????} ????} ????//一個方法搞定增刪改 ????public?int?executeUpdate(String?sql,Object[]?params){ ????????int?result=0; ????????Connection?con=null; ????????PreparedStatement?pstmt=null; ????????try?{ ????????????con=getCon(); ????????????pstmt=con.prepareStatement(sql); ????????????for(int?i=0;i<params.length;i++){ ????????????????pstmt.setObject(i+1,?params[i]); ????????????} ????????????result=pstmt.executeUpdate(); ???????? ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????}finally{ ????????????closeAll(con,pstmt,null); ????????} ????????return?result; ????} } --------------------------------------------------------- package?com.JulySeven.DAO; import?java.sql.Connection; import?java.sql.PreparedStatement; import?java.sql.ResultSet; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.List; import?java.util.Map; import?com.JulySeven.Entity.Menu; /** ?*?前面的都是鋪墊,這個才是真正的數據庫訪問層 ? *二級菜單 使用問號作為占位符 ?*?*/ //防盜門是一個門有鎖的功能 public?class?MenuImplement?extends?DataBaseDao?implements?MenuInterface?{ ???? ????public?Map<Integer,?List<Menu>>?getAllMenu()?{ ????????Map<Integer,?List<Menu>>?map=new?HashMap<Integer,?List<Menu>>(); ?????????Connection?con=null; ?????????PreparedStatement?pstmt=null; ?????????ResultSet?rs=null; ?????????try?{ ????????????con=getCon(); ????????????String?sql="select?*?from?Menu?order?by?pid"; ????????????pstmt=con.prepareStatement(sql); ????????????rs=pstmt.executeQuery(); ????????????int?myPid=0; ????????????List<Menu>?list=new?ArrayList<Menu>(); ????????????map.put(new?Integer(myPid),?list); ????????????while(rs.next()){ ????????????????Menu?menu=new?Menu(rs.getInt("id"),rs.getString("name"),?rs.getInt("pid")); ????????????????//myPid會改變 ????????????????if(menu.getPid()==myPid){ ????????????????????list.add(menu); ????????????????}else{ ????????????????????myPid=menu.getPid(); ????????????????????//只new?四次 ????????????????????list=new?ArrayList<Menu>(); ????????????????????map.put(new?Integer(myPid),?list); ????????????????????list.add(menu); ????????????????} ????????????} ????????}?catch?(Exception?e)?{ ????????????e.printStackTrace(); ????????}finally{ ????????????closeAll(con,?pstmt,?rs); ????????} ????????return?map; ???????? ????} ??public?static?void?main(String[]?args)?{ ??????Map<Integer,?List<Menu>>?map; ??????MenuImplement?m=new?MenuImplement(); ??????map?=m.getAllMenu(); ????List<Menu>?list=map.get(new?Integer(0)); ????for?(Menu?menu?:?list)?{ ????????StringBuilder?sb=new?StringBuilder(); ????????for?(Menu?m1:?map.get(menu.getId()))?{ ????????????sb.append(m1).append("?"); ????????} ????????System.out.println(menu+"::"+sb.toString()); ???????? ????} ?} } ? ? ? ? ? 第9章:數據訪問層 將大腦中所思考的事情記錄到本子上,這個過程就是持久化 相對應的是:內存數據------以文件的形式保存到硬盤 JDBC 就是一種持久化機制,將程序保存成文件也是持久化機制的一種實現,但是通常我們將數據保存到數據庫中 進行數據庫持久化時采用別人的總結出的解決方案,既可以保證代碼的質量, 又可以省去自己摸索的時間,何樂不為 思考一個問題:你用的是別人的方案,萬一別人總結的方案不行怎么辦? 所以是優先考慮使用別人的 public interface petDaoInterface{ ? ? ?int save (Pet pet); ? ? ?int ?del ?(Pet pet); ? int update?(Pet pet); ?List<Pet> ?getAllPet(); } 盡量以對象為單位,而不是以屬性為單位來傳遞參數,給調用者提供面向對象的接口 DAO就是DataAccessObjecs數據存取對象,位于業務邏輯持久化數據之間,實現對持久哈數據的訪問。 DAO模式提供了訪問關系型數據庫系統所需的的操作接口,將數據訪問和業務邏輯分離,對上層提供面向對象數據訪問接口。
    一個典型的DAO模式主要由DAO接口、 DAO實現類、實體類組成,基于代碼的復用考慮,通常創建一個數據庫連接和關閉工具類。 使用分層開發便于代碼的復用、程序的擴展、降低代碼的耦合性、提高開發質量和開發效率。分層開發的種種優勢都是建立在合理分層的基礎上的,分層時應該堅持封裝性原則和順序訪問原則。 在分層結構中,不同層之間通過實體類傳輸數據。在程序中把實體類作為方法的輸入參數或返回結果,實現數據傳遞,非常方便。 ? ? ? ? ? ? ? ? ? ? ??? ? 第10章:File IO流 import java.io.* 使用File類操作文件或目錄 File類四個重要的方法: 1:boolean exists()//判斷文件是否存在 2: long length()//返回文件的長度,若文件不存在,則返回0L 3: boolean ??delete() 4:?boolean createNewFile()//創建一個空文件,不創建文件夾 通過流來讀寫文件: 讀文件:是指把文件中的數據讀取到內存中 寫文件: 是指把內存中的數據寫入文件中 練習: 將一個GBK編碼的文本文件轉存為一個UTF-8編碼的文本文件。
    關鍵是要用到轉換流
    import? java.io.*; public? class? ChangeEncoding { ???? public? static? void? changeEncoding (String inEncoding, String outEncoding, ???????????? String inFileName, String outFileName)? throws? IOException { ???????? BufferedReader reader = new? BufferedReader( ???????????? new? InputStreamReader( ???????????? new? FileInputStream(inFileName), inEncoding)); ???????? BufferedWriter writer = new? BufferedWriter( ???????????? new? OutputStreamWriter( ???????????? new? FileOutputStream(outFileName), outEncoding)); ???????? String s = null ; ???????? while? ((s = reader.readLine()) != null ) { ???????????? writer.write(s, 0 , s.length()); ???????????? writer.newLine(); ???????? } ???????? writer.flush();//一定要刷新緩沖區 ???????? writer.close(); ???????? reader.close(); ???? } ???? public? static? void? main(String[] args) { ???????? try? { ???????????? changeEncoding( "GBK" , "UTF-8" , "gbk.txt" , "utf8.txt" ); ???????? } catch? (IOException e) { ???????????? System.out.println( "轉換失敗,原因:"? + e.getMessage()); ???????? } ???? } }
    import?java.io.ByteArrayOutputStream;? import?java.io.File;? import?java.io.FileOutputStream;? import?java.io.IOException;? import?java.io.InputStream;? import?java.net.HttpURLConnection;? import?java.net.URL;? ?????/** ??????*?@author?ljh ??????*?通過代碼從網站上下載一張圖片到指定的目錄 ??????*?*/ public?class?ImageRequest?{ ????public?static?void?main(String[]?args)?throws?IOException?{? ????????URL?url?=?new?URL("http://pic36.nipic.com/20131128/11748057_141932278338_2.jpg");? ????????HttpURLConnection?conn?=?(HttpURLConnection)url.openConnection();? ????????//讀進來,寫出去 ????????InputStream?inputStream?=?conn.getInputStream();???//通過輸入流獲得圖片數據? ????????byte[]?getData?=?readInputStream(inputStream);?????//獲得圖片的二進制數據? ????????File?imageFile?=?new?File("D://myFirstpic.jpg"); ????????FileOutputStream?fos?=?new?FileOutputStream(imageFile);???? ????????fos.write(getData);? ????????fos.close();? ????????????? ????????System.out.println("?read?picture?successfulluy!");? ????}? ????? ????public?static??byte[]?readInputStream(InputStream?inputStream)?throws?IOException?{? ????????byte[]?buffer?=?new?byte[1024];? ????????int?len?=?0;? ?????????/*這個類實現了一個輸出流,其中的數據被寫入一個字節數組。當數據被寫入時,緩沖區會自動生長。數據可以用toByteArray()和toString()檢索。 ???????????????????????????關閉寫入字節數組的輸出流沒有影響。這個類中的方法可以在流一直沒有發生IOException閉叫。*/ ????????ByteArrayOutputStream?bos?=?new?ByteArrayOutputStream();? ????????while((len?=?inputStream.read(buffer))?!=?-1)?{? ????????????bos.write(buffer,?0,?len);? ????????}? ????????bos.close();?? ????????return?bos.toByteArray();? ????}? } 構造方法摘要
    BufferedWriter(Writer?out)?
    ??????????創建一個使用默認大小輸出緩沖區的緩沖字符輸出流。
    BufferedWriter(Writer?out, int?sz)?
    ??????????創建一個使用給定大小輸出緩沖區的新緩沖字符輸出流。
    ? 方法摘要
    ?void close()?
    ??????????關閉此流,但要先刷新它。
    ?void flush()?
    ??????????刷新該流的緩沖。
    ?void newLine()?
    ??????????寫入一個行分隔符。
    ?void write(char[]?cbuf, int?off, int?len)?
    ??????????寫入字符數組的某一部分。
    ?void write(int?c)?
    ??????????寫入單個字符。
    ?void write(String?s, int?off, int?len)?
    ??????????寫入字符串的某一部分。

    java.io?
    類 DataInputStream

    java.lang.Objectjava.io.InputStreamjava.io.FilterInputStreamjava.io.DataInputStream 所有已實現的接口:
    Closeable,? DataInput
    構造方法摘要
    DataInputStream(InputStream?in)?
    ??????????使用指定的底層 InputStream 創建一個 DataInputStream。
    ? 方法摘要
    ?int read(byte[]?b)?
    ??????????從包含的輸入流中讀取一定數量的字節,并將它們存儲到緩沖區數組?b?中。
    ?int read(byte[]?b, int?off, int?len)?
    ??????????從包含的輸入流中將最多?len?個字節讀入一個 byte 數組中。
    ?boolean readBoolean()?
    ??????????參見?DataInput?的?readBoolean?方法的常規協定。
    ?byte readByte()?
    ??????????參見?DataInput?的?readByte?方法的常規協定。
    ?char readChar()?
    ??????????參見?DataInput?的?readChar?方法的常規協定。
    ?double readDouble()?
    ??????????參見?DataInput?的?readDouble?方法的常規協定。
    ?float readFloat()?
    ??????????參見?DataInput?的?readFloat?方法的常規協定。
    ?void readFully(byte[]?b)?
    ??????????參見?DataInput?的?readFully?方法的常規協定。
    ?void readFully(byte[]?b, int?off, int?len)?
    ??????????參見?DataInput?的?readFully?方法的常規協定。
    ?int readInt()?
    ??????????參見?DataInput?的?readInt?方法的常規協定。
    ?String readLine()?
    ??????????已過時。?該方法無法將字節正確轉換為字符。從 JDK?1.1 開始,讀取文本行的首選方法是使用?BufferedReader.readLine()?方法。使用?DataInputStream?類讀取文本行的程序可以改為使用?BufferedReader?類,只要將以下形式的代碼: DataInputStream d =?new?DataInputStream(in); 替換為: BufferedReader d=?new?BufferedReader(new?InputStreamReader(in));
    ?long readLong()?
    ??????????參見?DataInput?的?readLong?方法的常規協定。
    ?short readShort()?
    ??????????參見?DataInput?的?readShort?方法的常規協定。
    ?int readUnsignedByte()?
    ??????????參見?DataInput?的?readUnsignedByte?方法的常規協定。
    ?int readUnsignedShort()?
    ??????????參見?DataInput?的?readUnsignedShort?方法的常規協定。
    ?String readUTF()?
    ??????????參見?DataInput?的?readUTF?方法的常規協定。
    static?String readUTF(DataInput?in)?
    ??????????從流?in?中讀取用?UTF-8 修改版格式編碼的 Unicode 字符格式的字符串;然后以?String?形式返回此字符串。
    ?int skipBytes(int?n)?
    ??????????參見?DataInput?的?skipBytes?方法的常規協定。

    總結

    以上是生活随笔為你收集整理的使用java实现面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。