要想了解extends关键字关键字,首先要了解继承。继承是软件开发人员用来在类别之间建立的is-a关系的编程结构。继承使我们能够从更通用的类别中衍生出更具体的类别。Java通过类扩展支持单一继承,其中一类通过类扩展直接从另一类继承可访问的字段和方法。然而,Java不支持通过类扩展进行多重继承。
Java通过extends关键字关键字支持类扩展。如果存在,则支持类扩展。extends指定了两类之间的父子关系。下面,我们用extends在类Vehicle和Car之间建立关系,然后在Account和Savingsacount之间建立关系:
例1. extends关键词指定父子关系
class Vehicle
{
// member declarations
}
class Car extends Vehicle
{
// inherit accessible members from Vehicle
// provide own member declarations
}
class Account
{
// member declarations
}
class SavingsAccount extends Account
{
// inherit accessible members from Account
// provide own member declarations
}
该extends关键字的类名和指定在另一个类名之后。之前的班级名称extends识别子级,之后的班级名称extends识别父级。之后,extends无法指定多个类名,因为Java不支持基于类的多重继承。
这些示例将is-a关系整理如下:Car 是一种特殊的Vehicle,SavingsAccount 是一种特殊的Account。Vehicle和Account被称为基类、父类或超类。Car和SavingSaccount被称为衍生物、子类或子类。
子类继承了父类和其他祖先可访问的字段和方法。然而,他们从不继承结构函数。相反,子类声明其自身的结构函数。此外,他们可以声明自己的领域和方法,以区别于父母。参照例2:
例2. Acccount父类
class Account
{
private String name;
private long amount;
Account(String name, long amount)
{
this.name = name;
setAmount(amount);
}
void deposit(long amount)
{
this.amount += amount;
}
String getName()
{
return name;
}
long getAmount()
{
return amount;
}
void setAmount(long amount)
{
this.amount = amount;
}
}
例2描述了具有名称和初始金额的通用银行账户类别,它们都设置在构建函数中。此外,它还允许用户存款。(可以通过存入负数来提取,但我们忽略了这种可能性。)请注意,在创建帐户时必须设置帐户名称。
例三是Savingsacount扩展Account的父类子类。
例3. Savingsaccount子类扩展Account其父类
class SavingsAccount extends Account
{
SavingsAccount(long amount)
{
super("savings", amount);
}
}
的SavingsAccount,因为它不需要额外的声明字段或方法类别是微不足道的。然而,它确实声明了一个构造函数,该构造函数初始化为Account超类中的字段。初始化发生在Account通过Javasuper关键字调用的构造函数中,然后是带括号的参数列表中。
例4.进一步扩展Account,CheckingAccount类。
例4. CheckingAccount子类扩展Account其父类
class CheckingAccount extends Account
{
CheckingAccount(long amount)
{
super("checking", amount);
}
void withdraw(long amount)
{
setAmount(getAmount() - amount);
}
}
与Savingsaccount相比,checkingAccount声明withdraw()方法要实质性得多。
类级结构示例:创建了一个AccountDemo应用程序类,可尝试使用Account级别结构。首先,看看AccountDemo的源代码。
例5. Accountdemo演示帐户级结构
class AccountDemo
{
public static void main(String[] args)
{
SavingsAccount sa = new SavingsAccount(10000);
System.out.println("account name: " + sa.getName());
System.out.println("initial amount: " + sa.getAmount());
sa.deposit(5000);
System.out.println("new amount after deposit: " + sa.getAmount());
CheckingAccount ca = new CheckingAccount(20000);
System.out.println("account name: " + ca.getName());
System.out.println("initial amount: " + ca.getAmount());
ca.deposit(6000);
System.out.println("new amount after deposit: " + ca.getAmount());
ca.withdraw(3000);
System.out.println("new amount after withdrawal: " + ca.getAmount());
}
}
main()列表5中的方法首先演示SavingSAccount,然后CheckingAccount。假设Account.java,SavingsAccount.java,CheckingAccount.java,Accountdemo.java源文件是在同一目录中编译下列命令中的所有这些源文件:
javac AccountDemo.java
javac *.java
}
String getMake()
{
return make;
}
String getModel()
{
return model;
}
int getYear()
{
return year;
}
void print()
{
System.out.println("Make: " + make + ", Model: " + model + ", Year: " +
year);
}
}
我们通过实例介绍了本文。使用Java的extends关键词来自父类派生子类,调用父类的结构函数和方法,覆盖方法等。要彻底掌握extends关键字