類——客觀世界,是由許多事物構成的,這些事物既可以是有形的(比如一輛汽車),也可以是無形的(比如一次會議)。把客觀世界中的事物映射到面向對象的程序設計中就是對象。將同一類別的對象歸納總結,就構成類。包括屬性和方法、構造屬性:記錄事物的特征(狀態)方法:記錄了事物的行為;
例如:學生
特征:學號、性別、姓名、年齡
行為:學習、吃飯
public class Student {
int id;
String name;
int age=20;
String sex;
public void study(String st){
System.out.println(name+"學習了"+st);
}
public String eat(){
return "ok";
}
public Student(){}
public Student(int id,String name,int age,String sex){
this.id=id;
This.name=name;
This.age=age;
this.sex=sex;
}
抽象方法:僅有定義,沒有具體實現的方法體
抽象類:含有抽象方法的類,
抽象類有構造,但是無法調用構造,
抽象類中沒有對象,抽象方法不能執行,
抽象類的引用,指向非抽象的子類對象(多態),
抽象方法的調用其實是調用重寫以後的非抽象方法,
含有抽象方法的類一定是抽象類,當時抽象類中不一定有抽象方法。
抽象類不能被實例化,也就是說,不能有自己的對象
例如:
一個銀行系統中的賬戶,包括定期賬戶和活期賬戶,定期賬戶和活期賬戶都是基本的賬戶,
但是它們計算利息的方法不同,需要不同的實現方法,可以將基本賬戶定義為抽象類
public abstract class Acount {
//基本賬戶
private double total=2000;
public Acount(){}
//抽象方法具有強制性、規范性
public abstract double get();
//抽象方法
public void setTotal(double total) {
this.total = total;
}
public double getTotal() {
return total;
}
}
public class HAcount extends Acount {
//活期賬戶
public double get() {
return this.getTotal()*0.02;
}
public static void main(String[] args){
Acount a=new HAcount();
System.out.println(a.get());
}
}
public class StaticAcount extends Acount{
//定期賬戶
public double get(){
return this.getTotal()*0.03;
}
public static void main(String[] args){
Acount a=new StaticAcount();
//抽象類的引用指向非抽象子類對象
System.out.println(a.get());
//抽象方法的調用其實是調用子類重寫以後的非抽象方法
}
}
聲明接口使用關鍵字“interface”
接口中一般只包含一組
public抽象方法(且必須是公有抽象方法,但方法定義中public abstract可省略),因此可以將接口看成特殊的抽象類,接口也可以包含public static final數據(一般不寫)
Java一個類只能直接繼承(extends)另一個類,不允許一個子類繼承多個超類,卻允許一個子類繼承一個超類並實現(implements)多個接口
強制類型轉換成接口時,不檢測繼承關系,但是如果類型不匹配,會在運行時引發類型轉異常。
例如:
黃金:
黃金是一種貨幣
黃金也是一種金屬
public interface Jinshu { //定義黃金是金屬的接口
/* private */int i=8; //public static final 常量
void shine();
}
public interface Huobi {
//定義黃金是貨幣的接口
void change();
}
public class Gold implements Huobi,Jinshu{
public void shine(){
System.out.println("黃金閃閃發光!");
}
public void change(){
System.out.println("黃金可以交換!");
}
public static void main(String[] args){
Jinshu js=new Gold();
js.shine();
Huobi hb=new Gold();
hb.change();
System.out.println(js.i);
}
}
類、抽象類、接口之間的聯系,可以舉例如下:
一個公司,有老板,老板聘的經理,還有員工,
類就是員工,抽象類就是經理,接口就是老板。
接口裡就是給個方法,
但是他自己不做,
比如老板說我要那個文件,
給我定個機票,
我要那個策劃方案等,都是下面人做。老板只說不做。
抽象類給的方法,
有的他自己做,
有的其他人做。
比如經理說我要那個文檔,
員工就要發給他,但是他自己也要做點事,比如拿方案給老板看。經理又說又做。
一般類給的方法,就是什麼都要做,都要實現。
抽象類和接口之間的區別和聯系:
兩者都是抽象類,都不能實例化
Interface實現類和abstract的子類都必須實現已經聲明的抽象方法區別:
一個類只能繼承一個抽象類,但是一個類可以實現多個接口
Interface強調的是功能的實現,而abstract class強調的是所屬關系
Interface中的方法都是抽象方法,沒有方法體,它的實現類中必須包含實現接口的實現方法,而abstract class的子類中可以有選擇的實現抽象方法
Interface是完全抽象的,接口中只能聲明方法,且必須是用public abstract,不能是private及protected,interface沒有方法體,而abstract class 中可以有非抽象方法,
接口中定義的變量是public static final類型,且必須有初值,實現類中不能重新定義或改變,而抽象類中的變量可以重新定義,可以重新賦值。
舉例:
門的動作可以定義開和關兩個動作,同時門還可以實現報警的功能
abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}