Java教程-详解 Java 抽象

在 Java 中,通过使用 abstract 关键字声明的类被称为抽象类。抽象类可以包含抽象方法和非抽象方法(具有方法体)。
在学习 Java 抽象类之前,我们先来了解一下抽象的概念。
Java 中的抽象
抽象是一种隐藏实现细节,只向用户展示功能的方法。
另一种方式是只向用户展示基本内容,并隐藏内部详细信息。例如,在发送短信时,您可以输入文本并发送消息,但不知道消息传递的内部处理过程。
抽象使我们能够关注对象的行为,而不必关注其实现方式。
实现抽象的方法
Java 提供了两种实现抽象的方式:
- 抽象类(0% 到 100% 的抽象程度)
- 接口(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