用abstract关键字声明的类叫做抽象类在Java中。它可以有抽象的、非抽象方法(方法与body)。
在学习Java抽象类之前,让我们先了解Java的抽象。
在Java中抽象
抽象是一个隐藏实现细节的过程和只显示功能给用户。
另一种方式,它只显示用户必不可少的事情,隐藏了内部细节,例如,发送短信,你输入文本和发送消息。你不知道关于消息传递的内部处理。
抽象可以让你关注什么对象而不是它是如何。
实现抽象方法
有两种方法可以在java实现的抽象
- 抽象类(0到100?
- 接口(100?
一个类声明为抽象的被称为一个抽象类。它可以有抽象的、非抽象方法。它需要扩展及其实现方法。它不能被实例化。
要记住
- 必须声明一个抽象类和抽象的关键字。
- 它可以有抽象的、非抽象方法。
- 它不能被实例化。
- 它还可以有构造函数和静态方法。
- 它可以有最终的方法将迫使子类不改变身体的方法。
abstract class A{}
在Java中抽象方法
一个方法声明为抽象的和没有实现称为一个抽象方法。
抽象方法的例子
abstract void printStatus();
//no method body and abstract
抽象类,它有一个抽象方法的例子
在这个例子中,自行车是一个抽象类,它只包含一个抽象方法。其实现是本田所提供的类。
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
理解抽象类的真实场景
在这个例子中,形状是抽象类,它的实现是由矩形和圆类提供的。
大多数情况下,我们不知道实现类(隐藏终端用户),和一个对象的实现类是由工厂提供的方法。
工厂方法是一个方法,返回类的实例。稍后我们将了解工厂方法。
在这个例子中,如果你创建一个矩形类的实例,画矩形类的()方法将被调用。
文件: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
抽象类在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 %
抽象类的构造函数,数据成员和方法
一个抽象类可以有一个数据成员、抽象方法,方法主体(非抽象方法),构造函数,甚至主要()方法。
文件: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抽象类】抽象类也可以用来提供一些接口的实现。在这种情况下,最终用户可能不是被迫覆盖接口的所有方法。
注意:如果你是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
推荐阅读
- Java抽象类和接口的区别
- Java instanceof操作符
- Java静态绑定和动态绑定
- Java多态性
- Java实例初始化块
- Java final关键字
- Java协变返回类型
- Java super关键字
- Java程序实例