Java 抽象類定義與方法實(shí)例詳解
在面向?qū)ο蟮母拍钪校械膶ο蠖际峭ㄟ^類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個(gè)類中沒有包含足夠的信息來描繪一個(gè)具體的對象,這樣的類就是抽象類。
抽象類除了不能實(shí)例化對象之外,類的其它功能依然存在,成員變量、成員方法和構(gòu)造方法的訪問方式和普通類一樣。
由于抽象類不能實(shí)例化對象,所以抽象類必須被繼承,才能被使用。也是因?yàn)檫@個(gè)原因,通常在設(shè)計(jì)階段決定要不要設(shè)計(jì)抽象類。
父類包含了子類集合的常見的方法,但是由于父類本身是抽象的,所以不能使用這些方法。
抽象類
在Java語言中使用abstract class來定義抽象類。如下實(shí)例:
/* 文件名 : Employee.java */
public abstract class Employee
{
private String name;
private String address;
private int number;
public Employee(String name, String address, int number)
{
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay()
{
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck()
{
System.out.println("Mailing a check to " + this.name
+ " " + this.address);
}
public String toString()
{
return name + " " + address + " " + number;
}
public String getName()
{
return name;
}
public String getAddress()
{
return address;
}
public void setAddress(String newAddress)
{
address = newAddress;
}
public int getNumber()
{
return number;
}
}
注意到該Employee類沒有什么不同,盡管該類是抽象類,但是它仍然有3個(gè)成員變量,7個(gè)成員方法和1個(gè)構(gòu)造方法。 現(xiàn)在如果你嘗試如下的例子:
/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
public static void main(String [] args)
{
/* 以下是不允許的,會(huì)引發(fā)錯(cuò)誤 */
Employee e = new Employee("George W.", "Houston, TX", 43);
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
當(dāng)你嘗試編譯AbstractDemo類時(shí),會(huì)產(chǎn)生如下錯(cuò)誤:
Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43); ^
1 error
繼承抽象類
我們能通過一般的方法繼承Employee類:
/* 文件名 : Salary.java */
public class Salary extends Employee
{
private double salary; //Annual salary
public Salary(String name, String address, int number, double
salary)
{
super(name, address, number);
setSalary(salary);
}
public void mailCheck()
{
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName()
+ " with salary " + salary);
}
public double getSalary()
{
return salary;
}
public void setSalary(double newSalary)
{
if(newSalary >= 0.0)
{
salary = newSalary;
}
}
public double computePay()
{
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
}
盡管我們不能實(shí)例化一個(gè)Employee類的對象,但是如果我們實(shí)例化一個(gè)Salary類對象,該對象將從Employee類繼承3個(gè)成員變量和7個(gè)成員方法。
/* 文件名 : AbstractDemo.java */
public class AbstractDemo
{
public static void main(String [] args)
{
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
以上程序編譯運(yùn)行結(jié)果如下:
Constructing an Employee Constructing an Employee Call mailCheck using Salary reference -- Within mailCheck of Salary class Mailing check to Mohd Mohtashim with salary 3600.0 Call mailCheck using Employee reference-- Within mailCheck of Salary class Mailing check to John Adams with salary 2400.
抽象方法
如果你想設(shè)計(jì)這樣一個(gè)類,該類包含一個(gè)特別的成員方法,該方法的具體實(shí)現(xiàn)由它的子類確定,那么你可以在父類中聲明該方法為抽象方法。
Abstract關(guān)鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個(gè)方法名,而沒有方法體。
抽象方法沒有定義,方法名后面直接跟一個(gè)分號(hào),而不是花括號(hào)。
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//其余代碼
}
聲明抽象方法會(huì)造成以下兩個(gè)結(jié)果:
如果一個(gè)類包含抽象方法,那么該類必須是抽象類。
任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類。
繼承抽象方法的子類必須重載該方法。否則,該子類也必須聲明為抽象類。最終,必須有子類實(shí)現(xiàn)該抽象方法,否則,從最初的父類到最終的子類都不能用來實(shí)例化對象。
如果Salary類繼承了Employee類,那么它必須實(shí)現(xiàn)computePay()方法:
/* 文件名 : Salary.java */
public class Salary extends Employee
{
private double salary; // Annual salary
public double computePay()
{
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
//其余代碼
}
希望本文可以幫助需要的朋友
相關(guān)文章
Transactional注解導(dǎo)致Spring Bean定時(shí)任務(wù)失效的解決方法
這篇文章主要介紹了Transactional注解導(dǎo)致Spring Bean定時(shí)任務(wù)失效的解決方法,文中通過代碼示例介紹的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-10-10
JSR303校驗(yàn)前端傳遞的數(shù)據(jù)方式
這篇文章主要介紹了JSR303校驗(yàn)前端傳遞的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot集成DJL實(shí)現(xiàn)圖片分類功能
DJL是一個(gè)使用Java?API簡化模型訓(xùn)練、測試、部署和使用深度學(xué)習(xí)模型進(jìn)行推理的開源庫深度學(xué)習(xí)工具包,開源的許可協(xié)議是Apache-2.0,本文給大家介紹了SpringBoot集成DJL實(shí)現(xiàn)圖片分類功能,需要的朋友可以參考下2024-10-10
使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例
這篇文章主要介紹了使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式
這篇文章主要介紹了java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

