● 抽象類別與interface介面=>superclass=>多型的應用=>DAO(uml的圖)
(一)抽象類別
1.與一般class一樣,具有field,constructors,mehtods
2.關鍵=>抽象方法=>abstract(只有名字,沒有內容),抽象方法不提供內容,內容由繼承的子類別來提供,透過overrride
*在用多型管理的時候,為了配合子類別override而在父類別加的method,因該方法只有名稱沒有內容,只是用來比對名稱,但是加上{}還是會占空間(等於是一個假的方法=>即抽象的方法),所以可以:
 
(一) 直接把void abc(){},後面的{}拿掉,代表不提供內容了
student.java
class student{
String name;
student(String name){
this.name=name;
}
String show(){
return name;
}
void abc();
void abc(int chi){}
}
=>但是只這樣做會出現如上錯誤訊息,沒有正確宣告抽象方法
 
(二)那就對這個方法宣告為抽象:
abstract void abc();
=>只在這個方法前加上absract也會出現錯誤訊息如上
=>因為父類別中只要任何一個(真實的)mehtod要改為抽象method,則該類別(class)的前面也要加上abstract,否則會出現錯誤訊息,子類別不能override
 
(三)正確作法:student class 和 abc() method前都要加上abstract
student.java
abstract class student{
String name;
student(String name){
this.name=name;
}
String show(){
return name;
}
abstract void abc();
void abc(int chi){}
}
 
 
3.只提供繼承,無法單獨個別"new"物件=>喪失new的功能
student class改成abstract以後,在add.java中如果去new student,會出現錯誤訊息如下:
student x=new student();
=>因為student已經不能實體化(instantiated)了,所以不能new,不能配stack記憶體給它,只能提供繼承的功能了
 
4.繼承的子class(subclass)=>extends=>一定要"override"抽象方法(全部都要)
如果子類別沒有override父類別的抽象方法,則不能繼承
student.java
abstract class student{
String name;
student(String name){
this.name=name;
}
String show(){
return name;
}
abstract void abc();
abstract void abc(int chi);
}
 
B.java
class B extends student{
int eng;
B(String name,int eng){
super(name);
this.eng=eng;
}
String show(){
return super.show()+"\t英文:"+eng;
}
}
=>b這是後沒有override abc()和abc(int)這兩個抽象方法,所以會出現錯誤訊息(一次只出現一個)
 
正確
B.java
class B extends student{
int eng;
B(String name,int eng){
super(name);
this.eng=eng;
}
/*String show(){
return super.show()+"\t英文:"+eng;
}*/
void abc(){
System.out.println("abc--B");
}
void abc(int eng){
this.eng=eng;
}
}
=>String show(){}因為不是抽象方法,所以子類別的 String show(){}沒有做override也不會有問題
 
● 抽象類別的UML
 
*所有程式碼請參照: java/10/A.java、 B.java C.java student.java、 add.java
 
(二)interface
1.內容只能定義"常數"與"抽象方法"
2.當superclass(父類別)用,提供繼承,無法"new"物件(因為是抽象的)
interface text{
double pi=3.14;
}
 
class add2{
public static void main(String args[]){
text t=new text();
System.out.println(t.pi);
}
}
因為interface預設是abstract的,所以不能實體化不能new
 
3.常數內容=>public final 類型 常數名=初始值;(一定要初始值)
=>public final 可省略,但編譯會自動加
* interface和class一樣用來定義功能,但compiler出來還是*.class檔
interface text{
double pi=3.14;  //省略public final,編譯會自動加上去
}
 
4.抽象方法=>public adstract....
=>可省略=>繼承的子類別一定要"override"
(所以interface子類別的override幾乎都是public,因為interface是public,子類別的權限要跟他一樣或比他大)
(一)在interface中的方法後面加上{}
interface text{
double pi=3.14;  
void abc(){}   //省略public abstract
}
=>錯誤,在interface中都是抽象方法,所以不能加內容(即{})
 
(二)在子類別如果沒有override
class text2 implements text{
}
=>出現錯誤,子類別對抽象方法沒有做override
 
(三)有override,但沒有設定權限
interface text{
double pi=3.14;
void abc();    //省略public abstract
}
class text2 implements text{
void abc(){
}
}
=>因為繼承了text,所以子類別的override權限要大於或等於父類別
 
5.但要繼承interface,不能用extends,而是要用關鍵字:implements 
interface text{
     double pi=3.14;
}
class text2 implements text{
}
class add2{
public static void main(String args[]){
text2 t=new text2();
System.out.println(t.pi);
}
}
=>透過text2這個子類別去new
 
*以前述uml為例,把student恢復成一般class
(以後自己做的class盡量不要轉抽象,抽象方法全部放在interface中,這樣自己做的class才能new)
(把interface當作索引目錄的概念)
**父類別可多個,但是有規則
1.一般父類別一定要放在第一個(先extends再interface),只能一個一般父類別,其他都必須是interface
class A extends student implements student2{
int chi;
A(String name,int chi){
super(name);
this.chi=chi;
}
String show(){
return super.show()+"\t國文"+chi;
}
 
void abc(){
System.out.println("abc--A");
}
void abc(int chi){
this.chi=chi;
}
 
=>如果interface放在前面,會有錯誤訊息
 
2.多型如果有遇到interface也是共同父類別時,共同父類別名稱可以改為用interface的students2
student2[] s={
new A("kelly",80),
new B("kent",81),
new B("maggie",82),
new A("derek",83),
new A("david",84),
new C("Sylvie",85),
};
 
3.如果要用如下方法run show()method
student2[] s={
new A("kelly",80),
new B("kent",81),
new B("maggie",82),
new A("derek",83),
new A("david",84),
new C("Sylvie",85),
};
for(int i=0;i<s.length;i++){
     System.out.println(s[i].show());
}
=>出現錯誤,因為在interface student2中找不到show()method
 
4.正確:
interface student2{
     String show();
}
=> 在student2中加入show()method, 並同時把A/B/C三個class中的show()改為public String show(){....}
 
 
(三)Data Access by Object(UML中稱為DAO模式)=>data以object的方式存取的模式
*其中interface的繼承關係用虛線表示,+代表public
 
● netbeans的練習
要做一個輸入分數的判斷小畫面
**要key資料=>textField
要打名稱=>label
按鈕=>button
**UI介面
接收訊息=>getText():String;(所有程式預設抓進來都是文字字串 )
 
**步驟
1.新增JFrame,命名為grade
2.拉出一個panel
3.加入一個label,text改為成績,調整字體大小
4.加入一個text field,刪除text,調整要顯示的字體大小
5.加入一個button,修改text名稱
6.給予text field和button variable name 分別為(grade/ok),在左下角可以看到設定好的variable name
7.點一下button,選擇event=>mouseclicked=>選okmouseclicked
8.在private void okMouseClicked(java.awt.event.MouseEvent evt) { }中,輸入 System.out.println(grade.getText());
=>用getText()抓grade文字欄位的資料
 
 
 
 
arrow
arrow

    muchone 發表在 痞客邦 留言(0) 人氣()