Java 抽象类


Java中的抽象类

什么是抽象类

在Java中,抽象类是一种不能直接实例化的类,其主要作用是为其子类提供公共的、抽象的行为。抽象类定义了一个接口,它的子类必须实现这个接口以表现自己的特性。

抽象类的特点

  1. 抽象类不能被实例化。也就是说,你不能直接创建一个抽象类的实例。
  2. 抽象类可以有抽象成员方法,也可以有普通的成员方法。不过,抽象类中至少有一个抽象方法。
  3. 抽象类中可以含有非抽象的私有方法,它们仅能被其他类中的方法调用,而不能被实例化后的对象调用。
  4. 如果一个类继承自一个抽象类,那么它必须实现抽象类中所有的抽象方法,除非它自己也成为了抽象类。

抽象类的使用

抽象类可以用来制定一个接口,以便子类必须按照该接口来实现自己的功能。在这种情况下,如果某个子类不实现接口中的某个方法,那么编译器将报告一个错误。

例如,下面是一个有抽象类的代码示例:

abstract class Shape {
   abstract void draw();
}

class Circle extends Shape {
   void draw() {
      System.out.println("Drawing circle...");
   }
}

class Rectangle extends Shape {
   void draw() {
      System.out.println("Drawing rectangle...");
   }
}

public class Test {
   public static void main(String[] args) {
      Circle circle = new Circle();
      Rectangle rectangle = new Rectangle();
      
      circle.draw();
      rectangle.draw();
   }
}

输出结果如下:

Drawing circle...
Drawing rectangle...

在这个例子中,Shape类是抽象类,其中定义了一个抽象方法draw()。Circle和Rectangle都是它的子类,它们都必须实现父类中的抽象方法。因此,我们可以调用它们的draw()方法。

抽象类与接口的比较

与接口相比,抽象类可以定义方法的实现。此外,子类只能扩展一个抽象类,而可以实现多个接口。一般来说,如果需要在类中使用成员变量或方法的实现,应该使用抽象类。而如果只需要定义一个行为,却不需要定义实现,那么就应该使用接口。

例如,假设你想创建一个代表手机的类。这个手机可以打电话、发短信和拍照。我们可以使用抽象类来实现这个类:

abstract class Phone {
   public void makeCall(int number) {
      System.out.println("Calling " + number);
   }
   
   public void sendSMS(int number, String message) {
      System.out.println("Sending message to " + number + ": " + message);
   }
   
   abstract void takePhoto();
}

class SmartPhone extends Phone {
   void takePhoto() {
      System.out.println("Taking a smart photo...");
   }
}

class FeaturePhone extends Phone {
   void takePhoto() {
      System.out.println("Taking a basic photo...");
   }
}

public class Test {
   public static void main(String[] args) {
      SmartPhone smartPhone = new SmartPhone();
      FeaturePhone featurePhone = new FeaturePhone();

      smartPhone.makeCall(1234567890);
      smartPhone.sendSMS(1234567890, "Hi there!");
      smartPhone.takePhoto();

      featurePhone.makeCall(1234567890);
      featurePhone.sendSMS(1234567890, "Hi there!");
      featurePhone.takePhoto();
   }
}

输出结果如下:

Calling 1234567890
Sending message to 1234567890: Hi there!
Taking a smart photo...
Calling 1234567890
Sending message to 1234567890: Hi there!
Taking a basic photo...

在这个示例中,我们在Phone类中定义了makeCall()、sendSMS()和takePhoto()方法的实现,其中takePhoto()是一个抽象方法,必须由子类实现。因此,在子类SmartPhone和FeaturePhone中,我们仅需实现takePhoto()方法即可。

总结

抽象类是Java语言的一个重要特性,它提供了实现了某些接口的类的基本结构。在创建一些复杂的程序时,抽象类常常用于创建一些通用的代码,以便其子类可以继承这些代码并添加自己特有的功能。同时,抽象类也有许多优势,例如它具有自我保护性和更好的可扩展性等。因此,在Java编程中,抽象类是一个非常重要的概念。