Java面向物件設計原則
1. 面向抽象原則
1.1 抽象類
特點:
1.抽象類中的abstract方法可有可無,也可以有非abstract方法
2.抽象類不能用new建立物件
3.抽象類的非抽象子類必須重寫父類的abstract方法
4.作為向上轉型物件。抽象類不能建立物件,但可以讓抽象類的物件成為其非抽象子類的向上轉型物件,呼叫子類的方法
[java] view plain copy print?- abstractclass A {
- publicabstractint add(int x,int y);
-
}
- class B extends A {
- publicint add(int x, int y) {
- return x+y;
- }
- }
- publicclass App {
- publicstaticvoid main(String[] args) {
- A a = new B();
- System.out.println(a.add(3, 4));
- }
- }
1.2 介面
特點:1.介面中只能有public許可權的abstract方法,不能有非abstract方法
2.介面由類去實現,並且必須重寫介面中的abstract方法
3.介面回撥。把實現介面的類的物件的引用賦給該介面宣告的介面變數,那麼此介面變數就可以呼叫被類實現的介面中的方法
[java] view plain copy print?- interface Com {
- publicabstractint sub(int x,int y);
- }
- class ComImp implements Com {
- publicint sub(int x, int y) {
- return x-y;
-
}
- }
- publicclass App {
- publicstaticvoid main(String[] args) {
- Com com = new ComImp();
- System.out.println(com.sub(3, 4));
- }
- }
1.3 面向抽象
所謂面向抽象程式設計,就是指當設計一個類時,不該讓類面向具體的類,而是面向抽象類或介面,即所設計的類中的重要資料是抽象類或介面宣告的變數,而不是具體宣告的變數。例如,現在有一個Circle類,有一個getArea()方法計算圓的面積:
Circle.Java
[java] view plain copy print?- publicclass Circle {
- double r;
- Circle(double r) {
- this.r = r;
- }
- publicdouble getArea() {
- return(3.14*r*r);
- }
- }
現在要設計一個Pillar類(柱體類),有一個getVolume方法計算體積
Pillar.java
[java] view plain copy print?- publicclass Pillar {
- Circle bottom; //將Circle物件作為成員
- double height;
- public Pillar(Circle bottom, double height) {
- this.bottom = bottom;
- this.height = height;
- }
- publicdouble getVolume() {
- return bottom.getArea()*height;
- }
- }
因此需要重新設計Pillar類,這時不需要關心底是什麼形狀,而應該關心底是否有計算面積的方法。所以底不應該是某個具體類宣告的變數,這樣才能應對不同的需求。
接下來重新設計PIllar類。 首先設計一個抽象類(或介面)Geometry(幾何),有一個抽象的getArea()方法。
Geometry.java
- publicabstractclass Geometry {
- publicabstractdouble getArea();
- }
Pillar.java
[java] view plain copy print?- publicclass Pillar {
- Geometry bottom; //bottom是抽象類Geometry宣告的變數
- double height;
- public Pillar(Geometry bottom, double height) {
- this.bottom = bottom;
- this.height = height;
- }
- publicdouble getVolume() {
- return bottom.getArea()*height;
- }
- }
Circle.java
[java] view plain copy print?- publicclass Circle extends Geometry {
- double r;
- Circle(double r) {
- this.r = r;
- }
- publicdouble getArea() {
- return(3.14*r*r);
- }
- }
Rectangle.java
- publicclass Rectangle extends Geometry {
- double length;
- double width;
- public Rectangle(double length, double width) {
- this.length = length;
- this.width = width;
- }
- publicdouble getArea() {
- return length*width;
- }
- }
現在就可以用Pillar建立具有矩形底或圓形底的柱體了。
App.java
[java] view plain copy print?- publicclass App {
- publicstaticvoid main(String[] args) {
- Pillar pillar;
- Geometry bottom;
- bottom = new Rectangle(100, 50);
- pillar = new Pillar(bottom, 50);
- System.out.println("矩形底的柱體的體積:" + pillar.getVolume());
- bottom = new Circle(50);
- pillar = new Pillar(bottom, 50);
- System.out.println("圓形底的柱體的體積:" + pillar.getVolume());
- }
- }
通過面向抽象來設計Pillar類,使得Pillar類不再依賴具體類,因此每當系統增加Geometry的子類時,比如增加一個Triabgle子類,那麼不需要修改Pillar類的任何程式碼,就可以使用Pillar創建出具有三角形底的柱體。
2. 開-閉原則
所謂“開-閉原則“(Open-Closed Principle)就是讓設計對擴充套件開放,對修改關閉。本質就