在java中用abstract
关键字声明的类称为抽象类。 它可以有抽象和非抽象方法(带主体的方法)。
在学习java抽象类之前,先来了解java中的抽象。
抽象是隐藏实现细节并仅向用户显示功能的过程。
另一种方式,它只向用户显示重要的事情,并隐藏内部详细信息,例如:发送短信,只需输入文本并发送消息。您也不需要知道有关邮件传递的内部处理过程。
抽象可以让你专注于对象做什么(实现的功能),而不是它如何做。
在java中有两种实现抽象的方法,它们分别是:
使用 abstract
关键字声明的类被称为抽象类。需要扩展和实现它的方法。 它不能被实例化。
抽象类示例
abstract class a{}
抽象方法
一个被声明为 abstract
而没有实现的方法称为抽象方法。
抽象方法示例
abstract void printstatus();//no body and abstract
具有抽象方法的抽象类的示例
在这个例子中,bike
是一个抽象类,只包含一个抽象方法:run()
。 它由 honda
类提供实现。
abstract class bike {
abstract void run();
}
class honda4 extends bike {
void run() {// 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()
方法将被调用。创建一个类文件: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 real scenario, object is provided through
// method e.g. getshape() method
s.draw();
}
}
上面代码执行结果如下 -
drawing circle
在java中抽象类的另一个例子
创建一个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("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()
方法。创建一个java文件:testabstraction2.java
,代码如下所示 -
//example of abstract class that have method body
abstract class bike {
bike() {
system.out.println("bike is created");
}
abstract void run();
void changegear() {
system.out.println("gear changed");
}
}
class honda extends bike {
void run() {
system.out.println("running safely..");
}
}
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();
}
上面的 bike12
是无法编译通过的。
规则:如果你扩展任何具有抽象方法的抽象类,必须提供方法的实现或使这个类抽象化。
抽象类也可以用于提供接口的一些实现。 在这种情况下,终端用户可能不会被强制覆盖接口的所有方法。
注意:如果您是初学者到java,请跳过此示例先学习接口(interface)。
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