面向对象的特征之一:抽象

面试题:

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

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


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

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

  • 反义词:具体

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);
   }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类中可以包含抽象方法和非抽象方法,抽象方法必须在子类中被实现,而非抽象方法可以被子类直接继承或重写。 抽象类通常用于建立子类的模板,它定义了子类需要实现的方法和属性,但是并不对具体的实现进行定义。子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。这种方式可以保证子类的一致性,并且减少了代码的重复。 在 PHP 中,我们可以通过关键字 abstract 来定义一个抽象类,而抽象方法则需要在方法名前面加上 abstract 关键字,同时省略方法体。例如: ``` abstract class Animal { abstract public function eat(); } ``` 上面的代码定义了一个抽象类 Animal,其中包含一个抽象方法 eat()。由于这个方法是抽象的,所以不能有具体的实现。 当一个类继承了抽象类 Animal,并且没有实现 eat() 方法时,PHP 就会发出一个 Fatal error 错误。例如: ``` class Cat extends Animal { } ``` 上面的代码会报错,因为 Cat 没有实现抽象方法 eat()。 如果我们要让 Cat 继承 Animal,就必须实现 eat() 方法,例如: ``` class Cat extends Animal { public function eat() { echo "Cat is eating...\n"; } } ``` 这样,Cat 就可以实例化了,并且可以调用 eat() 方法。 总之,抽象类是一种用于建立子类模板的特殊类,它定义了子类需要实现的方法和属性。子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值