在Java中,抽象類是用abstract關鍵字聲明的。它可能同時具有抽象和非抽象方法(帶有主體的方法)。抽象是適用於 Java 中的類和方法的 Java 修飾符,但是不適用於變量。在這篇文章中,我們將學習Java中抽象類的使用。
Java中的抽象類是什麽?
Java抽象類是一個不能由自身啟動的類,它需要被另一個類子類化才能使用它的屬性。抽象類是在其類定義中使用 “abstract” 關鍵字聲明的。
抽象類的圖示
abstract class Shape
{
int color;
// An abstract function
abstract void draw();
}
在Java中,有以下一些重要觀察關於抽象類如下:
- 無法創建抽象類的實例。
- 允許構造函數。
- 我們可以有一個沒有任何抽象方法的抽象類。
- 可以有一個最終方法在抽象類中,但類(抽象類)中的任何抽象方法都不能聲明為最終方法,或者簡單地說,最終方法本身不能是抽象的,因為它會產生錯誤:“修飾符的非法組合:抽象和最終”
- 我們可以在抽象類中定義靜態方法
- 我們可以使用抽象關鍵字用於聲明頂級類(外部類)以及內部類作為抽象的
- 如果一個類至少包含一種抽象方法那麽強製應該將一個類聲明為抽象類
- 如果兒童班無法為所有抽象方法提供實現家長班那麽我們應該聲明作為抽象的子類以便下一級子類應該為剩餘的抽象方法提供實現
Java抽象類的例子
1. 具有抽象方法的抽象類示例
下麵是上述主題的實現:
Java
// Abstract class
abstract class Sunstar {
abstract void printInfo();
}
// Abstraction performed using extends
class Employee extends Sunstar {
void printInfo()
{
String name = "avinash";
int age = 21;
float salary = 222.2F;
System.out.println(name);
System.out.println(age);
System.out.println(salary);
}
}
// Base class
class Base {
public static void main(String args[])
{
Sunstar s = new Employee();
s.printInfo();
}
}
avinash 21 222.2
2. 具有構造函數、數據成員和方法的抽象類
抽象類可以有的元素
- 數據成員
- 抽象方法
- 方法體(非抽象方法)
- constructor
- main() 方法。
下麵是上述主題的實現:
Java
// Java Program to implement Abstract Class
// having constructor, data member, and methods
import java.io.*;
abstract class Subject {
Subject() {
System.out.println("Learning Subject");
}
abstract void syllabus();
void Learn(){
System.out.println("Preparing Right Now!");
}
}
class IT extends Subject {
void syllabus(){
System.out.println("C , Java , C++");
}
}
class GFG {
public static void main(String[] args) {
Subject x=new IT();
x.syllabus();
x.Learn();
}
}
Learning Subject C , Java , C++ Preparing Right Now!
抽象類的屬性
讓我們詳細說明這些觀察結果,並在幹淨的 Java 程序的幫助下證明它們的合理性,如下所示。
觀察1
在 Java 中,就像在 C++ 中一樣,無法創建抽象類的實例,但我們可以引用抽象類類型。通過幹淨的Java程序如下所示。
示例
Java
// Java Program to Illustrate
// that an instance of Abstract
// Class can not be created
// Class 1
// Abstract class
abstract class Base {
abstract void fun();
}
// Class 2
class Derived extends Base {
void fun()
{
System.out.println("Derived fun() called");
}
}
// Class 3
// Main class
class Main {
// Main driver method
public static void main(String args[])
{
// Uncommenting the following line will cause
// compiler error as the line tries to create an
// instance of abstract class. Base b = new Base();
// We can have references of Base type.
Base b = new Derived();
b.fun();
}
}
Derived fun() called
觀察2
與 C++ 一樣,抽象類可以包含構造函數在 Java 。當創建繼承類的實例時,將調用抽象類的構造函數。如下程序所示:
例子:
Java
// Java Program to Illustrate Abstract Class
// Can contain Constructors
// Class 1
// Abstract class
abstract class Base {
// Constructor of class 1
Base()
{
// Print statement
System.out.println("Base Constructor Called");
}
// Abstract method inside class1
abstract void fun();
}
// Class 2
class Derived extends Base {
// Constructor of class2
Derived()
{
System.out.println("Derived Constructor Called");
}
// Method of class2
void fun()
{
System.out.println("Derived fun() called");
}
}
// Class 3
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating object of class 2
// inside main() method
Derived d = new Derived();
d.fun();
}
}
Base Constructor Called Derived Constructor Called Derived fun() called
觀察3
在Java中,我們可以有沒有任何抽象方法的抽象類。這使我們能夠創建無法實例化而隻能繼承的類。在幹淨的java程序的幫助下如下所示。
例子:
Java
// Java Program to illustrate Abstract class
// Without any abstract method
// Class 1
// An abstract class without any abstract method
abstract class Base {
// Demo method. This is not an abstract method.
void fun()
{
// Print message if class 1 function is called
System.out.println(
"Function of Base class is called");
}
}
// Class 2
class Derived extends Base {
// This class only inherits the Base class methods and
// properties
}
// Class 3
class Main {
// Main driver method
public static void main(String args[])
{
// Creating object of class 2
Derived d = new Derived();
// Calling function defined in class 1 inside main()
// with object of class 2 inside main() method
d.fun();
}
}
Function of Base class is called
觀察4
抽象類還可以有最後方法(不能被覆蓋的方法)
例子:
Java
// Java Program to Illustrate Abstract classes
// Can also have Final Methods
// Class 1
// Abstract class
abstract class Base {
final void fun()
{
System.out.println("Base fun() called");
}
}
// Class 2
class Derived extends Base {
}
// Class 3
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
{
// Creating object of abstract class
Base b = new Derived();
// Calling method on object created above
// inside main method
b.fun();
}
}
}
Base fun() called
觀察5
對於任何抽象 java 類,我們都不允許創建對象,即,對於抽象類實例化是不可能的。
Java
// Java Program to Illustrate Abstract Class
// Main class
// An abstract class
abstract class GFG {
// Main driver method
public static void main(String args[])
{
// Trying to create an object
GFG gfg = new GFG();
}
}
輸出:
觀察6
類似的接口我們可以在抽象類中定義靜態方法那可以在沒有對象的情況下獨立調用。
Java
// Java Program to Illustrate
// Static Methods in Abstract
// Class Can be called Independently
// Class 1
// Abstract class
abstract class Helper {
// Abstract method
static void demofun()
{
// Print statement
System.out.println("Geeks for Geeks");
}
}
// Class 2
// Main class extending Helper class
public class GFG extends Helper {
// Main driver method
public static void main(String[] args)
{
// Calling method inside main()
// as defined in above class
Helper.demofun();
}
}
Geeks for Geeks
觀察7
我們可以使用抽象關鍵字用於將頂級類(外部類)以及內部類聲明為抽象類
Java
import java.io.*;
abstract class B {
// declaring inner class as abstract with abstract
// method
abstract class C {
abstract void myAbstractMethod();
}
}
class D extends B {
class E extends C {
// implementing the abstract method
void myAbstractMethod()
{
System.out.println(
"Inside abstract method implementation");
}
}
}
public class Main {
public static void main(String args[])
{
// Instantiating the outer class
D outer = new D();
// Instantiating the inner class
D.E inner = outer.new E();
inner.myAbstractMethod();
}
}
Inside abstract method implementation
觀察8
如果一個類至少包含一個抽象方法然後我們必須將類聲明為抽象類否則我們會得到一個編譯時錯誤,如果一個類至少包含一個抽象方法,那麽該類的實現不完整,因此不建議創建對象,因此為了限製此類部分類的對象創建我們用抽象關鍵字。
Java
/*package whatever //do not write package name here */
import java.io.*;
// here if we remove the abstract
// keyword then we will get compile
// time error due to abstract method
abstract class Demo {
abstract void m1();
}
class Child extends Demo {
public void m1()
{
System.out.print("Hello");
}
}
class GFG {
public static void main(String[] args)
{
Child c = new Child();
c.m1();
}
}
Hello
觀察9
如果孩子類無法為父類的所有抽象方法提供實現,那麽我們應該將子類聲明為抽象類,以便下一級子類應該為剩餘的抽象方法提供實現。
Java
// Java Program to demonstrate
// Observation
import java.io.*;
abstract class Demo {
abstract void m1();
abstract void m2();
abstract void m3();
}
abstract class FirstChild extends Demo {
public void m1() {
System.out.println("Inside m1");
}
}
class SecondChild extends FirstChild {
public void m2() {
System.out.println("Inside m2");
}
public void m3() {
System.out.println("Inside m3");
}
}
class GFG {
public static void main(String[] args)
{
// if we remove the abstract keyword from FirstChild
// Class and uncommented below obj creation for
// FirstChild then it will throw
// compile time error as did't override all the
// abstract methods
// FirstChild f=new FirstChild();
// f.m1();
SecondChild s = new SecondChild();
s.m1();
s.m2();
s.m3();
}
}
Inside m1 Inside m2 Inside m3
在 C++ 中,如果一個類至少有一個純虛函數,那麽類就變得抽象了。與C++不同,在Java中,使用單獨的關鍵字abstract來使類抽象。
結論
本文中需要記住的要點如下:
- 抽象類是一個不能由自身啟動的類,它需要被另一個類子類化才能使用它的屬性。
- 可以使用“abstract”關鍵字創建抽象類。
- 我們可以有一個沒有任何抽象方法的抽象類。
抽象類常見問題解答
1.Java中什麽是抽象類?
An abstract class in Java is a class that can not be initiated on its own but can be used as a subclass by another class.
2. 抽象類的目的是什麽?
The main purpose of the abstract class is to create a base class from which many other classes can be derived.
3. 抽象類的主要優點是什麽?
An abstract class provides the provides of data hiding in Java.
4. 為什麽抽象類比接口快?
An abstract class is faster than an interface because the interface involves a search before calling any overridden method in Java whereas abstract class can be directly used.
另外,閱讀
相關用法
- Java AbstractCollection add()用法及代碼示例
- Java AbstractCollection addAll()用法及代碼示例
- Java AbstractCollection clear()用法及代碼示例
- Java AbstractCollection contains()用法及代碼示例
- Java AbstractCollection containsAll()用法及代碼示例
- Java AbstractCollection isEmpty()用法及代碼示例
- Java AbstractCollection remove()用法及代碼示例
- Java AbstractCollection removeAll()用法及代碼示例
- Java AbstractCollection retainAll()用法及代碼示例
- Java AbstractCollection size()用法及代碼示例
- Java AbstractCollection toArray()用法及代碼示例
- Java AbstractCollection toString()用法及代碼示例
- Java AbstractList addAll()用法及代碼示例
- Java AbstractList clear()用法及代碼示例
- Java AbstractList equals()用法及代碼示例
- Java AbstractList get()用法及代碼示例
- Java AbstractList hashCode()用法及代碼示例
- Java AbstractList indexOf()用法及代碼示例
- Java AbstractList iterator()用法及代碼示例
- Java AbstractList lastIndexOf()用法及代碼示例
- Java AbstractList listIterator()用法及代碼示例
- Java AbstractList remove()用法及代碼示例
- Java AbstractList set()用法及代碼示例
- Java AbstractList subList()用法及代碼示例
- Java AbstractMap clear()用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 Abstract Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。