【转载】面试题:面向对象的特征和基本特征有哪些 之抽象

 面试题:

面向对象的基本特征:封装、继承、多态

面向对象的特征:封装、继承、多态、抽象


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

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

反义词:具体

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);
   }
} 

 

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