📜  Java抽象类

📅  最后修改于: 2020-09-24 01:56:37             🧑  作者: Mango

Java抽象类

用abstract关键字声明的类在Java中被称为抽象类。它可以具有抽象方法和非抽象方法(与主体配合使用的方法)。

在学习Java抽象类之前,让我们首先了解Java中的抽象。

Java中的抽象

抽象是隐藏实现细节并仅向用户显示功能的过程。

另一种方式,它仅向用户显示基本内容,并隐藏内部细节,例如,在您键入文本并发送消息的位置发送SMS。您不知道有关邮件传递的内部处理。

抽象使您可以专注于对象的功能而不是对象的方式。

实现抽象的方法

有两种方法可以在Java中实现抽象

  • 抽象类(0至100%)
  • 界面(100%)

Java抽象类

声明为抽象的类称为抽象类。它可以具有抽象和非抽象方法。它需要扩展并实现其方法。无法实例化。

要记住的要点

  • 必须使用abstract关键字声明抽象类。
  • 它可以具有抽象和非抽象方法。
  • 无法实例化。
  • 它也可以具有构造函数和静态方法。
  • 它可以具有最终方法,这些方法将强制子类不更改方法的主体。

抽象类的例子

abstract class A{}  

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();  
}  
}  
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

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()方法。

文件: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();  
}}