㈠ java中類與類之間的關系
類與類之間最常見的關系主要有三種:依賴(uses-a)、聚合(has-a)和繼承(is-a)。
下面以在線書店訂單系統為例,來詳細的講述這三種關系的概念。
在線書店訂單系統的主要功能是:注冊用戶可以登錄到網上書店選購圖書,在線填寫訂單,並支付購書款。書店確認已經收到購書款時,按用戶留下的地址郵寄圖書。可以在這個系統中建立幾個類,有圖書(book)、賬戶(account)、訂單(order)、地址(address)等,如下圖所示:
繼承
繼承就是一個類能調用另一個類的所有數據成員,並在當前類中不需要再重新定義,本章已經講得很明白了。
㈡ 依賴,聚合,組合在java代碼實現中是不是一樣的
在面向對象中,類與類之間的關系有泛化,依賴,關聯,聚合,組合幾種。
其中,聚合和組合都屬於關聯。
在具體編程中:
依賴表現為如果A類依賴於B,則B體現為A的局部變數,方法參數或靜態方法的調用。
eg:
class B{
Static void function1(){};
void function2(){};
}
public class A{
public static void main(String[] args){
....
B.function1();//A類中調用了B類的靜態方法
....
}
}
聚合和組合都屬於關聯,很難區分,但是只要記住一點,區分它們就容易多了:
處於聚合關系的兩個類生命周期不同步,則是聚合關系;處於組合關系的兩個類的生命周期同步;
eg:
聚合關系,當A創建的時候,B不一定創建;當A消亡時,B不一定消亡。
class A{
private B;
}
class B{
....
}
組合關系,當創建一個A對象時,也會創建一個B對象;當A對象消亡時,作為A的屬性的B對象也會消亡。
class A{
private b=new B();
....
}
class B{
....
}
㈢ java中類與類之間的關系講解
1.關聯
關聯即對象與對象之間的連接。java類之間的關聯是一個類的作為另一個的屬性被定義,即「has-a」的關系。關聯又分為組合與聚合兩種。示例如下:
//兩個類之間的聚合public class Car{}public class Person{
private Car car;
}//兩個類之間的組合public class Car{}public class Person{
private Car car=new Car();//創建一個Car對象}123456789101112
關聯又分為單向關聯與雙向關聯,以上代碼為單向關聯(Person類關聯Car類),雙向關聯(Person類關聯Car類,同時Car類關聯Person類)代碼如下:
public class Car{
private Person per;
}public class Person{
private Car car;
}123456
類之間的關聯,可以一對一的關聯,也可以一對多的關聯。
2.依賴
依賴的具體表現是將一個類的對象當做方法參數傳給另一個類的方法,是一種use-a的關系。如:
public class Person{
public void dirve(Car car){
}
}1234
關聯與依賴的區別在於:關聯是has-a的關系,依賴是use-a的關系;而且關聯中Person關聯Car,只要Person類對象存在,Car對象就存在;依賴中只有Person類對象調用到dirve()方法時,Car對象才會被創建,方法執行結束後,Car對象就被收回。
3.繼承
類與類的另一個關系是繼承。繼承是一個類的定義基於另一個存在的類,即子類基於父類,如此可實現代碼的重用,子類能夠繼承父類可訪問的方法、屬性,並能擴展新的能力,而且子類可重寫父類方法以滿足子類需要。在繼承中子類可調用父類的構造方法,子類構造方法總是先調用父類的構造方法,而且默認情況下調用父類的無參構造方法,在子類構造方法的第一行使用super關鍵字即可調用父類構造方法。示例代碼如下:
public class Point {
private double x; private double y; public double getX() { return x;
} public void setX(double x) { this.x = x;
} public double getY() { return y;
} public void setY(double y) { this.y = y;
} //無參構造方法
public Point() {
} //有參構造方法
public Point(double x, double y) { this.x = x; this.y = y;
} //draw()方法
public void draw(){
}
}public class Circle extends Point {
private double r; public double getR() { return r;
} public void setR(double r) { this.r = r;
} //有參構造方法
public Circle(double x, double y) { super(x, y);
} public void draw() {
System.out.println("半徑為:" + this.r + " x坐標為:" + getX() + " y坐標為:" + getY() + "的圓繪製成功!");
}
}public class Test {
public static void main(String[] args) {
Circle circle = new Circle(2, 3);
circle.setR(3);
circle.draw();
}
}