java 抽象_Java抽象

从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。 例如,考虑电子邮件的情况,复杂的详细信息(例如,发送电子邮件时发生的情况),电子邮件服务器使用的协议对用户是隐藏的。 因此,要发送电子邮件,只需输入内容,提及接收方的地址,然后单击“发送”。

同样在面向对象的编程中,抽象是从用户隐藏实现细节的过程,只有功能将被提供给用户。 换句话说,用户将获得关于对象做什么而不是如何做的信息。

在Java中,使用抽象类和接口实现抽象。

1. 抽象类

在其声明中包含abstract关键字的类称为抽象类。

抽象类可能包含也可能不包含抽象方法,即没有主体的方法(public void get();)

但是,如果一个类至少有一个抽象方法,那么该类必须声明为abstract。

如果一个类声明为abstract,则无法实例化它。

要使用抽象类,必须从另一个类继承它,为抽象方法提供实现。

如果继承了抽象类,则必须为所有抽象方法提供实现。

示例

要创建抽象类,只需在类声明中在class关键字之前加上abstract关键字。示例代码如下 -

/* 文件名称: 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类与Java中的普通类相同。Employee类现在是一个抽象类,但它仍然有三个字段,七个方法和一个构造函数。

现在,可以尝试以下列方式实例化Employee类 -

public class AbstractDemo {

public static void main(String[] args) {

/* Following is not allowed and would raise error */

Employee e = new Employee("Maxsu", "Hainan Haikou", 1443);

System.out.println("Call mailCheck using Employee reference --");

e.mailCheck();

}

}

执行上面示例代码,得到以下结果 -

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

Cannot instantiate the type Employee

at AbstractDemo.main(AbstractDemo.java:6)

2. 继承抽象类

可以通过以下方式继承Employee类的属性,就像具体类一样 -

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;

}

}

在这里,不能实例化Employee类,但可以实例化Salary类,并使用此实例可以访问Employee类的所有三个字段和七个方法,如下所示 -

public class AbstractDemo {

public static void main(String[] args) {

Salary s = new Salary("Maxsu", "Hainan Haikou", 3, 9900.00);

Employee e = new Salary("Wang XX", "Shaihai", 2, 8400.00);

System.out.println("Call mailCheck using Salary reference --");

s.mailCheck();

System.out.println("Call mailCheck using Employee reference --");

e.mailCheck();

}

}

执行上面示例代码,得到以下结果 -

Constructing an Employee

Constructing an Employee

Call mailCheck using Salary reference --

Within mailCheck of Salary class

Mailing check to Maxsu with salary 9900.0

Call mailCheck using Employee reference --

Within mailCheck of Salary class

Mailing check to Wang XX with salary 8400.0

3. 抽象方法

如果希望类包含特定方法,但希望方法的实际实现由子类来确定,则可以将父类中的方法声明为抽象。

abstract关键字用于将方法声明为抽象。

须将abstract关键字放在方法声明中的方法名称之前。

抽象方法包含方法签名,但没有方法体。

抽象方法没有花括号,而是在末尾有一个冒号(;)。

声明抽象方法的示例 -

public abstract class Employee {

private String name;

private String address;

private int number;

// 声明抽象方法

public abstract double computePay();

// Remainder of class definition

}

将方法声明为抽象有两个结果 -

包含它的类必须声明为abstract。

继承当前类的任何类都必须覆盖抽象方法或将自身声明为抽象方法。

注 - 子类必须实现抽象方法; 它将是一个无法实例化的抽象类层次结构。

假设Salary类继承了Employee类,那么它应该实现computePay()方法,如下所示 -

/* 文件名称: Salary.java */

public class Salary extends Employee {

private double salary; // Annual salary

// 实现`computePay()`方法

public double computePay() {

System.out.println("Computing salary pay for " + getName());

return salary/52;

}

// Remainder of class definition

}

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值