Java 抽象类
使用abstract关键字声明的类在Java中被称为抽象类。它可以具有抽象方法和非抽象方法(与主体有关的方法)。
在学习Java抽象类之前,让我们首先了解Java中的抽象。
Java中的抽象
抽象是一个隐藏实现细节并仅向用户显示功能的过程。
另一种方式,它仅向用户显示基本内容并隐藏内部细节,例如,在您键入文本并发送消息的位置发送SMS。您不知道有关消息传递的内部处理。
抽象使您可以专注于object所做的工作它是如何做到的。
实现抽象的方法
在Java中有两种实现抽象的方法
抽象类(0到100%)
接口(100%)
Java中的抽象类
被声明为抽象的类称为
抽象类。它可以具有抽象和非抽象方法。它需要扩展并实现其方法。
要记住的要点
必须使用abstract关键字声明抽象类。
它可以具有抽象和非抽象方法。
无法实例化。
它可以具有构造函数和静态方法。
它可以具有最终方法,这些方法将强制子类不更改方法的主体。
抽象类的示例
Java中的抽象方法
被声明为抽象且没有实现的方法被称为抽象方法。
抽象方法示例
abstract void printStatus();
//no method body and abstract
具有抽象方法的Abstract类示例
在此示例中,Bike是一个仅包含一个抽象方法运行的抽象类。它的实现由Honda类提供。
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();
}
}
了解Abstract类的真实情况
在此示例中,Shape是抽象类,其实现由Rectangle和Circle类提供。
大多数情况下,我们不了解实现类(对最终用户隐藏),而实现类的对象由
工厂方法提供。
工厂方法是一种返回类实例的方法。
在此示例中,如果您创建Rectangle类的实例,则将调用Rectangle类的draw()方法。
文件: TestAbstraction1.java
abstract class Shape{
abstract void draw();
}
//In real scenario, implementation is provided by others i.e. unknown by end userclass Rectangle extends Shape{
void draw(){
System.out.println("drawing rectangle");
}
}
class Circle1 extends Shape{
void draw(){
System.out.println("drawing circle");
}
}
//In real scenario, method is called by programmer or userclass TestAbstraction1{
public static void main(String args[]){
Shape s=new Circle1();
//In a real scenario, object is provided through method, e.g., getShape() methods.draw();
}
}
java中Abstract类的另一个示例
文件: 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("Rate of Interest is: "+b.getRateOfInterest()+" %");
b=new PNB();
System.out.println("Rate of Interest is: "+b.getRateOfInterest()+" %");
}
}
Rate of Interest is: 7 %Rate of Interest is: 8 %
具有构造函数,数据成员和方法的抽象类
抽象类可以具有数据成员,抽象方法,方法主体(非抽象方法),构造函数,甚至main()方法。
文件: TestAbstraction2.java
//Example of an abstract class that has abstract and non-abstract methods abstract class Bike{
Bike(){
System.out.println("bike is created");
}
abstract void run();
void changeGear(){
System.out.println("gear changed");
}
}
//Creating a Child class which inherits abstract class class Honda extends Bike{
void run(){
System.out.println("running safely..");
}
}
//Creating a Test class which calls abstract and non-abstract methods class TestAbstraction2{
public static void main(String args[]){
Bike obj = new Honda();
obj.run();
obj.changeGear();
}
}
bike is created running safely.. gear changed
注意: 规则: 如果类中存在抽象方法,则该类必须是抽象方法。
class Bike12{
abstract void run();
}
注意: 规则: 如果要扩展具有抽象方法的抽象类,则必须提供该方法的实现或使该类抽象。
抽象类的另一种真实情况
抽象类也可以用于提供interface的某些实现。在这种情况下,最终用户可能不会被强制重写接口的所有方法。
注意: 如果您是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();
}
}
Output:I am a I am b I am c I am d