面試題:
面向對象的基本特徵:封裝、繼承、多態
面向對象的特徵:封裝、繼承、多態、抽象
類:一類具有相同特性的事物的抽象描述。
抽象:不明確,不清楚,不確定
反義詞:具體
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);
}
}