📅  最后修改于: 2020-09-24 01:56:37             🧑  作者: Mango
用abstract关键字声明的类在Java中被称为抽象类。它可以具有抽象方法和非抽象方法(与主体配合使用的方法)。
在学习Java抽象类之前,让我们首先了解Java中的抽象。
抽象是隐藏实现细节并仅向用户显示功能的过程。
另一种方式,它仅向用户显示基本内容,并隐藏内部细节,例如,在您键入文本并发送消息的位置发送SMS。您不知道有关邮件传递的内部处理。
抽象使您可以专注于对象的功能而不是对象的方式。
有两种方法可以在Java中实现抽象
声明为抽象的类称为抽象类。它可以具有抽象和非抽象方法。它需要扩展并实现其方法。无法实例化。
抽象类的例子
abstract class A{}
声明为抽象且没有实现的方法称为抽象方法。
抽象方法的例子
abstract void printStatus();//no method body and 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();
}
}
running safely
在此示例中,Shape是抽象类,其实现由Rectangle和Circle类提供。
通常,我们不了解实现类(最终用户隐藏了该实现类),而实现类的对象由factory方法提供。
工厂方法是一种返回类实例的方法。稍后我们将了解工厂方法。
在此示例中,如果您创建Rectangle类的实例,则将调用Rectangle类的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("drawing rectangle");}
}
class Circle1 extends Shape{
void draw(){System.out.println("drawing circle");}
}
//In real scenario, method is called by programmer or user
class TestAbstraction1{
public static void main(String args[]){
Shape s=new Circle1();//In a real scenario, object is provided through method, e.g., getShape() method
s.draw();
}
}
输出:drawing circle
文件: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();
}
输出:
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();
}}