抽象父類別 (抽象類別介面)
1) 與一般class 一樣也具有 fild contors , mothed
2)關鍵 -> 抽象方法
a) 只 宣告名稱 沒有內容 [ X ] <不放入內容
b) abstrat => 語法 : abstrat 類型 方法名 (引數) :
3.所有繼承的子類別,要求: (條件2選一)
a) 抽象子類別
b) 如不是抽象的子類別,則一定要將抽象方法 Ouerride => 又稱實作抽象方法內容
○轉成抽象類別 就不能使用 " new"
繼承子類別 要實做出來
變成抽象類 無法實體化 無法" new "
一. instanceof
=> 檢查使用的物件是 是否有此class 類型 is - a
二.java lang .Objet
=> 所有 class 的 共同父類
三. final <= 只能用 不能繼承
a. field => 常數
b.method = > 不允許 ouerride
c.class => 不允許繼承
d.空find 需搭配建構式
.interface 介面
1.本身 即為抽象的父類別
2.自己無法" new " 物件,只能提供繼承或 "多型應用中宣告陣列變數用
3.組成元素
a) 常數
=> public final static 類型 常數名 = 初始值;
b) 抽象方法
=> public abstract 類型 方法名 (引數);
c) 預設方法 => 有 { } body的內容
=>public default 類型 方法名 (引數) {...............};
d)類別類方法
=> public static 類型 方法名(引數){..................};
c跟d java 8 才有
4.implements
=> 繼承 實作
介面 => 多個 Super (父類別)
列子一:
/* abstract */ class school
// 改成抽象方法 要加上 abstract 關鍵字
{
private String name;
final double pi=3.14;
school(String name)
{
this.name=name;
}
String show()
{
//pi=5.6; 以是 常數 不能給值
return "名:"+name;
}
void setName(String name)
{
this.name = name;
}
void setChi(int chi){}
void setEng(int eng){}
void setMath(int math){}
/*
abstract void setChi(int chi);
// 改成抽象方法 要加上 abstract 關鍵字
abstract void setEng(int eng);
abstract void setMath(int math);
*/
}
class add
{
public static void main (String args[])
{
school [][] s=
{
{
new A("a1",74),
new A("a2",74)
}
,
{
new B("b1",86),
new B("b2",86),
new B("b3",86)
}
,
{
new C("c1",98),
new C("c2",98),
new C("c3",98)
}
};
for(int i=0;i<s.length;i++)
{
for(int j=0;j<s[i].length;j++)
{
System.out.println("s["+i+"]["+j+"]="+s[i][j]+"\t"+s[i][j].show());
}
System.out.println();
}
System.out.println("=====================================");
s[2][0].setName("q1");
s[0][1].setChi(85);
s[1][0].setEng(85);
s[2][1].setMath(85);
for(int i=0;i<s.length;i++)
{
for(int j=0;j<s[i].length;j++)
{
System.out.println("s["+i+"]["+j+"]="+s[i][j]+"\t"+s[i][j].show());
}
System.out.println();
}
System.out.println("=====================================");
System.out.println(s[0][0] instanceof A);
System.out.println(s[0][0] instanceof school);
System.out.println(s[0][0] instanceof B);
System.out.println("=====================================");
System.out.println(s[0][0]);
System.out.println(s[1][0]);
System.out.println(s[0][0].equals(s[1][0]));
System.out.println(s[0][0].getClass());
//.getClass 查找在哪一個class
System.out.println("=====================================");
s[0][0]=s[1][0];
System.out.println(s[0][0]);
System.out.println(s[1][0]);
System.out.println(s[0][0].equals(s[1][0]));
//判斷兩邊是否相同 equals
}
}
class A extends school
{
private int chi;
A(String name,int chi)
{
super(name);
this.chi=chi;
}
String show()
{
return super.show()+"\t國文:"+chi;
}
void setChi(int chi)
{
this.chi = chi;
}
void setEng(int eng)
{
}
void setMath(int math)
{
}
}
class B extends school
{
private int eng;
B(String name,int eng)
{
super(name);
this.eng =eng;
}
String show()
{
return super.show()+"\t英文:"+eng;
}
void setEng(int eng)
{
this.eng = eng;
}
}
class C extends school
{
private int math;
C(String name,int math)
{
super(name);
this.math = math;
}
String show()
{
return super.show()+"\t數學:"+ math;
}
void setMath(int math)
{
this.math = math;
}
}
class test
{
public static void main(String args[])
{
//bookstore b1=new bookstore();
book b1 = new bookstore() ;
//更常搭配此種方法
System.out.println(b1.title);
System.out.println(b1.bookprice(50));
System.out.println(b1.bookprice2(50));
//System.out.println(b1.bookprice3(50));
//System.out.println(bookstore.bookprice3(50));
System.out.println(book.bookprice3(50));
//用父介面去呼叫,子介面不能去呼叫它
member m1=new member("abc","def");
m1.name="eee";
m1.username="tttt";
//book x=new book(); //不能NEW 因為抽象類型
}
}
class member
{
final String username;
String name;
//不給值 只能使用建構式] 只能二選一
member(String username,String name)
{
this.username=username;
this.name=name;
//username 是常數不能給值
}
}
interface book
{
//抽象類使用
/*public final static */ String title="GJUN";//要給一個值
/*public abstract*/ int bookprice(int price);//前面沒寫 也會自己補上
// 第八版 才有此方法 前面要加上 default
/*public */default double bookprice2(double price)
{
return price*10;
}
//public 可以省略 使用 static 就不要使用 default
//只要選擇一種就好
/*public*/ static double bookprice3(double price)
{
return price*15;
}
}
class bookstore implements /*使用implements繼承*/ book
//父類別也是抽象的
{
int bookprice(int price)
{
return price*150;
}
// 編譯不會過 因為 上面 int bookprice 第三種預設權限
// 但是 book 的 介面 都是 public 權限 所以無法訪問
}
例子二.
interface book2
{
}
class bookstore extends book3 implements book,book2
/*上面為 可繼承多個父類別,實體要先寫
class bookstore extends 只能一個不能使用多個
*/
{
public int bookprice(int price)
{
return price*150;
}
}
class book3
{
}
interface book
{
/*public final static */ String title="GJUN";
/*public abstract*/ int bookprice(int price);
/*public */default double bookprice2(double price)
{
return price*10;
}
/*public*/ static double bookprice3(double price)
{
return price*15;
}
}
例子: