在 Java 中,通过使用 abstract 关键字声明的类被称为抽象类。抽象类可以包含抽象方法和非抽象方法(具有方法体)。

在学习 Java 抽象类之前,我们先来了解一下抽象的概念。

Java 中的抽象

抽象是一种隐藏实现细节,只向用户展示功能的方法。

另一种方式是只向用户展示基本内容,并隐藏内部详细信息。例如,在发送短信时,您可以输入文本并发送消息,但不知道消息传递的内部处理过程。

抽象使我们能够关注对象的行为,而不必关注其实现方式。

实现抽象的方法

Java 提供了两种实现抽象的方式:

  1. 抽象类(0% 到 100% 的抽象程度)
  2. 接口(100% 的抽象程度)

Java 中的抽象类

抽象类是使用 abstract 关键字声明的类。它可以包含抽象方法和非抽象方法,并且需要被子类扩展和实现其方法。抽象类本身不能被实例化。

要记住的要点

  • 必须使用 abstract 关键字来声明抽象类。
  • 抽象类可以包含抽象方法和非抽象方法。
  • 抽象类不能被实例化。
  • 抽象类可以包含构造函数和静态方法。
  • 抽象类可以包含最终方法,这将强制子类不修改方法的实现。

抽象类的例子

abstract class A{}  

Java 中的抽象方法

声明为抽象但没有实现的方法称为抽象方法。

抽象方法的例子

abstract void printStatus();//没有方法体和抽象  

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

在这个例子中,Bike 是一个抽象类,它只包含一个抽象方法 run。它的实现由本田类提供。

abstract class Bike{  
  abstract void run();  
}  
class Honda4 extends Bike{  
void run(){System.out.println("running safely");}  
public static void main(String args[]){  
 Bike obj = new Honda4();  
 obj.run();  
}  
}  

输出:

running safely

理解抽象类的真实场景

在这个示例中,有一个抽象类 Shape,它由 Rectangle 和 Circle 类来实现。

在大多数情况下,我们对实现类是不可见的,实现类的对象由工厂方法提供。

工厂方法是一种返回类实例的方法。我们将在稍后学习关于工厂方法的内容。

在此示例中,如果您创建 Rectangle 类的实例,将调用 Rectangle 类中的 draw() 方法。这样,根据具体的实现类,draw() 方法会以不同的方式执行。

文件:TestAbstraction1.java

abstract class Shape{  
abstract void draw();  
}  
//In real scenario, implementation is provided by others i.e. unknown by end user  
class Rectangle extends Shape{  
void draw(){System.out.println("绘制矩形");}  
}  
class Circle1 extends Shape{  
void draw(){System.out.println("绘制圆形");}  
}  
//在实际场景中,方法是由程序员或用户调用的 
class TestAbstraction1{  
public static void main(String args[]){  
Shape s=new Circle1();//在实际场景中,对象是通过方法提供的,例如getShape()方法 
s.draw();  
}  
}  

输出:

绘制圆形

java中抽象类的另一个例子

文件:TestBank.java

abstract class Bank{    
abstract int getRateOfInterest();    
}    
class SBI extends Bank{    
int getRateOfInterest(){return 7;}    
}    
class PNB extends Bank{    
int getRateOfInterest(){return 8;}    
}    
    
class TestBank{    
public static void main(String args[]){    
Bank b;  
b=new SBI();  
System.out.println("利息率为:"+b.getRateOfInterest()+" %");    
b=new PNB();  
System.out.println("利息率为:"+b.getRateOfInterest()+" %");    
}}    

输出:

利息率为:7%
利息率为:8%

具有构造函数、数据成员和方法的抽象类

抽象类可以有数据成员、抽象方法、方法体(非抽象方法)、构造函数,甚至 main() 方法。

文件:TestAbstraction2.java

//具有抽象和非抽象方法的抽象类的示例 
 abstract class Bike{  
   Bike(){System.out.println("自行车已创建");}  
   abstract void run();  
   void changeGear(){System.out.println("换档");}  
 }  
//创建继承抽象类的子类 
 class Honda extends Bike{  
 void run(){System.out.println("安全运行..");}  
 }  
//创建一个调用抽象和非抽象方法的测试类 
 class TestAbstraction2{  
 public static void main(String args[]){  
  Bike obj = new Honda();  
  obj.run();  
  obj.changeGear();  
 }  
}  

输出:

自行车被创建
安全运行..
换档

规则:如果类中有抽象方法,则该类必须是抽象的。

class Bike12{  
abstract void run();  
}  

输出:

compile time error

规则:如果要扩展具有抽象方法的抽象类,则必须提供该方法的实现或使此类抽象。

抽象类的另一个真实场景

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

注意:如果您是 java 初学者,请先学习接口并跳过此示例。

interface A{  
void a();  
void b();  
void c();  
void d();  
}  
  
abstract class B implements A{  
public void c(){System.out.println("I am c");}  
}  
  
class M extends B{  
public void a(){System.out.println("I am a");}  
public void b(){System.out.println("I am b");}  
public void d(){System.out.println("I am d");}  
}  
  
class Test5{  
public static void main(String args[]){  
A a=new M();  
a.a();  
a.b();  
a.c();  
a.d();  
}}  

输出:

I am a
I am b
I am c
I am d

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想