橘子味的心
标题:Java抽象类

在java中用abstract关键字声明的类称为抽象类。 它可以有抽象和非抽象方法(带主体的方法)。

在学习java抽象类之前,先来了解java中的抽象。

Java中的抽象

抽象是隐藏实现细节并仅向用户显示功能的过程。

另一种方式,它只向用户显示重要的事情,并隐藏内部详细信息,例如:发送短信,只需输入文本并发送消息。您也不需要知道有关邮件传递的内部处理过程。

抽象可以让你专注于对象做什么(实现的功能),而不是它如何做。

实现抽象的方法

在java中有两种实现抽象的方法,它们分别是:

  1. 抽象类(部分)
  2. 接口 (完全)

1. Java中的抽象类

使用 abstract关键字声明的类被称为抽象类。需要扩展和实现它的方法。 它不能被实例化。

抽象类示例

  1. abstract class A{}
  2. Java

抽象方法

一个被声明为 abstract 而没有实现的方法称为抽象方法。

抽象方法示例

  1. abstract void printStatus();//no body and abstract
  2. Java

具有抽象方法的抽象类的示例

在这个例子中,Bike是一个抽象类,只包含一个抽象方法:run()。 它由 Honda 类提供实现。

  1. abstract class Bike {
  2. abstract void run();
  3. }
  4.  
  5. class Honda4 extends Bike {
  6. void run() {// run 方法的实现
  7. System.out.println("running safely..");
  8. }
  9.  
  10. public static void main(String args[]) {
  11. Bike obj = new Honda4();
  12. obj.run();
  13. }
  14. }
  15. Java

上面示例中的代码执行结果如下 -

  1. running safely..
  2. Java

理解抽象类的真实应用场景

在这个例子中,Shape是一个抽象类,它的实现分别由RectangleCircle类提供。 大多数情况下,我们不知道实现类(即对最终用户隐藏),实现类的对象由工厂方法提供。
工厂方法是用于返回类的实例的方法。 稍后我们将在下一节中了解和学习工厂方法
在这个例子中,创建Rectangle类的实例,Rectangle类的draw()方法将被调用。创建一个类文件:TestAbstraction1.java ,它的代码如下所示 -

  1. abstract class Shape {
  2. abstract void draw();
  3. }
  4.  
  5. // In real scenario, implementation is provided by others i.e. unknown by end
  6. // user
  7. class Rectangle extends Shape {
  8. void draw() {
  9. System.out.println("drawing rectangle");
  10. }
  11. }
  12.  
  13. class Circle1 extends Shape {
  14. void draw() {
  15. System.out.println("drawing circle");
  16. }
  17. }
  18.  
  19. // In real scenario, method is called by programmer or user
  20. class TestAbstraction1 {
  21. public static void main(String args[]) {
  22. Shape s = new Circle1();// In real scenario, object is provided through
  23. // method e.g. getShape() method
  24. s.draw();
  25. }
  26. }
  27. Java

上面代码执行结果如下 -

  1. drawing circle
  2. Java

在java中抽象类的另一个例子

创建一个Java文件:TestBank.java,代码如下所示 -

  1. abstract class Bank {
  2. abstract int getRateOfInterest();
  3. }
  4.  
  5. class SBI extends Bank {
  6. int getRateOfInterest() {
  7. return 7;
  8. }
  9. }
  10.  
  11. class PNB extends Bank {
  12. int getRateOfInterest() {
  13. return 8;
  14. }
  15. }
  16.  
  17. class TestBank {
  18. public static void main(String args[]) {
  19. Bank b;
  20. b = new SBI();
  21. System.out.println("Rate of Interest is: " + b.getRateOfInterest() + " %");
  22. b = new PNB();
  23. System.out.println("Rate of Interest is: " + b.getRateOfInterest() + " %");
  24. }
  25. }
  26. Java

上面代码执行结果如下 -

  1. Rate of Interest is: 7 %
  2. Rate of Interest is: 8 %
  3. Java

具有构造函数,数据成员,方法等的抽象类

抽象类可以有数据成员,抽象方法,方法体,构造函数甚至main()方法。创建一个Java文件:TestAbstraction2.java,代码如下所示 -

  1. //example of abstract class that have method body
  2. abstract class Bike {
  3. Bike() {
  4. System.out.println("bike is created");
  5. }
  6.  
  7. abstract void run();
  8.  
  9. void changeGear() {
  10. System.out.println("gear changed");
  11. }
  12. }
  13.  
  14. class Honda extends Bike {
  15. void run() {
  16. System.out.println("running safely..");
  17. }
  18. }
  19.  
  20. class TestAbstraction2 {
  21. public static void main(String args[]) {
  22. Bike obj = new Honda();
  23. obj.run();
  24. obj.changeGear();
  25. }
  26. }
  27. Java

上面代码执行结果如下 -

  1. bike is created
  2. running safely..
  3. gear changed
  4. Java

规则:如果在类中有任何抽象方法,那个类必须声明为抽象的。

  1. class Bike12{
  2. abstract void run();
  3. }
  4. Java

上面的 Bike12 是无法编译通过的。

规则:如果你扩展任何具有抽象方法的抽象类,必须提供方法的实现或使这个类抽象化。

抽象类的另一个真实场景

抽象类也可以用于提供接口的一些实现。 在这种情况下,终端用户可能不会被强制覆盖接口的所有方法。

注意:如果您是初学者到Java,请跳过此示例先学习接口(interface)

  1. interface A {
  2. void a();
  3.  
  4. void b();
  5.  
  6. void c();
  7.  
  8. void d();
  9. }
  10.  
  11. abstract class B implements A {
  12. public void c() {
  13. System.out.println("I am C");
  14. }
  15. }
  16.  
  17. class M extends B {
  18. public void a() {
  19. System.out.println("I am a");
  20. }
  21.  
  22. public void b() {
  23. System.out.println("I am b");
  24. }
  25.  
  26. public void d() {
  27. System.out.println("I am d");
  28. }
  29. }
  30.  
  31. class Test5 {
  32. public static void main(String args[]) {
  33. A a = new M();
  34. a.a();
  35. a.b();
  36. a.c();
  37. a.d();
  38. }
  39. }
  40. Java

上面代码执行结果如下 -

  1. I am a
  2. I am b
  3. I am c
  4. I am d
  5. Java