【轉載】面試題:面向對象的特徵和基本特徵有哪些 之抽象

 面試題:

面向對象的基本特徵:封裝、繼承、多態

面向對象的特徵:封裝、繼承、多態、抽象


類:一類具有相同特性的事物的抽象描述。

抽象:不明確,不清楚,不確定

反義詞:具體

1、什麼情況下會用到抽象?

 

  • 我們要聲明(1)圓類(2)矩形類等類型,發現這些子類中有共同的特徵,需要提取到公共父類Graphic中,
  • 但是在公共父類中又無法給出具體的方法的實現,那麼這樣的方法我們聲明爲抽象方法。
  • 當一個類包含了抽象方法,這個類必須也是抽象的。

2、抽象有兩種:


(1)抽象方法
(2)抽象類


3、抽象方法


語法格式:
【權限修飾符】 abstract 返回值類型 方法名(【形參列表】);
特點:沒有方法體


4、抽象類


語法格式:
【權限修飾符】 abstract class 抽象類名{
}


5、抽象類的特點


(1)抽象類是不能直接創建對象
(2)一個類包含了抽象方法,這個類必須是抽象類;
但是反過來,一個抽象類中可能沒有抽象方法。
(3)抽象類中有沒有構造器?或者說是否需要構造器?
抽象類一定有構造器,目的是給子類調用的。
(4)抽象類的存在的意義就是用來被繼承的,
子類繼承抽象類時,必須實現(重寫)父類的所有抽象方法,否則子類也得是一個抽象類。
抽象類和非抽象類的區別:就是抽象類不能直接創建對象


我們要聲明(1)圓類(2)矩形類等類型,發現這些子類中有共同的特徵,需要提取到公共父類Graphic中, 但是在公共父類中又無法給出具體的方法的實現,那麼這樣的方法我們聲明爲抽象方法。

public class TestAbstract {
   public static void main(String[] args) {
       //Graphic g = new Graphic();//抽象類不能直接創建對象
       
       //注意,這裏創建的不是對象,是對象數組,還沒有進行對象初始化
       Graphic[] g = new Graphic[2];
       
       g[0] = new Circle(2);
       System.out.println(g[0].getArea());
       g[1] = new Rectangle(3,5);
       System.out.println(g[1].getArea());
   }
}
abstract class Graphic{
   private String name;
   
   public Graphic() {
       super();
   }
   public Graphic(String name) {
       super();
       this.name = name;
   }
   //從子類重抽取出共同的特徵,發現無法給出具體的合理實現
   //因爲我們無法實現方法體,那麼幹脆就省略了方法體{},即不寫,使用;結束
   public abstract double getArea();
   public abstract double getPrimeter();
}
class Circle extends Graphic{
   private double radius;

   public Circle(double radius) {
       this.radius = radius;
   }

   public Circle() {
   }

   public double getRadius() {
       return radius;
   }

   public void setRadius(double radius) {
       this.radius = radius;
   }
   
   public double getArea(){
       return Math.PI * radius * radius;
   }
   public double getPrimeter(){
       return 2 * Math.PI * radius;
   }
}
class Rectangle extends Graphic{
   private double length;
   private double width;
   
   public Rectangle(double length, double width) {
       this.length = length;
       this.width = width;
   }
   
   public Rectangle() {
   }
   
   public double getLength() {
       return length;
   }
   
   public void setLength(double length) {
       this.length = length;
   }
   
   public double getWidth() {
       return width;
   }
   
   public void setWidth(double width) {
       this.width = width;
   }
   
   public double getArea(){
       return length * width;
   }
   
   public double getPrimeter(){
       return 2 * (length + width);
   }
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章