最近跟着老师学了继承,这里打算根据自己的理解总结一下,方便日后自己复习,因才疏学浅,难免有考虑不周、理解不到位的地方,欢迎大家给出批评意见,大家共同进步。
(一)继承
一、继承的概念
在程序设计中,有时要建立关于某对象的模型,然后要从这个最初的模型派生出多个具体化的版本,比如银行卡类,可以派生出信用卡、借记卡、理财卡等等,显然,这些卡具有银行卡的一般特性,还有银行卡所不具备的其他特性。这时,就可以让这些卡的类继承于银行卡类,那么银行卡就是父类,(这里以信用卡为例)信用卡就是子类,子类可以继承父类的域和方法(之所以说“可以”是因为子类并不一定能够继承父类所有的域和方法,详见③),而且可以对这些域和方法重新定义和扩充新的内容。
注意:
①一个子类只能继承自一个父类(也就是单继承),一个父类可以同时拥有多个子类。
②子类和父类之间一定存在某些差异性,否则就是同一个类。
③子类可以继承父类所有非私有的数据成员和方法,但不能继承父类的私有数据和方法。
④子类不能继承父类的构造方法。
二、继承的实现
在Java中,继承通过关键字extends来实现,一般格式如下:
【类的修饰符】 class <子类名> extends <父类名>{
<域定义>;
<方法定义>;
}
话不多说,这里直接上代码,以银行卡和信用卡的继承关系来说明。
银行卡类(Account):
public class Account {
private String name;
private String aid;
private double balance;
//构造方法
public Account(String name,String aid,double balance) {
this.name = name;
this.aid = aid;
this.balance = balance;
}
//存款方法
public void deposit(double amount) {
this.balance+=amount;
}
//取款方法
public void withdraw(double amount) {
if (amount<=balance) {
this.balance -= amount;
}
else {
System.out.println("余额不足,无法取出");
}
}
//获得余额的方法
public double getBalance() {
return balance;
}
//设置余额的方法
public boolean setBalance(double amount) {
this.balance = amount;
boolean x=true;
if (this.balance<0){
x=false;
}
return x;
}
}
信用卡类(CreditAccount):
public class CreditAccount extends Account {
private double lineOfCredit;//信用卡透支额度
private double overdraw=this.lineOfCredit;//剩余透支额度,初值为信用卡透支额度
//构造方法,通过super()方法对父类中定义的变量赋值,因为这些变量在父类中是私有变量,
//不能被子类继承,不能像lineOfCredit一样赋值。
public CreditAccount(String name, String aid, double balance,double lineOfCredit) {
super(name, aid, balance);
this.lineOfCredit = lineOfCredit;//子类新的变量的赋值
}
public void line(String lineOfCredit) {
//透支限额判断,A,B,C,D类信用卡分别代表透支最大额度为10000,5000,2000,1000元。
if (lineOfCredit == "A") {
this.lineOfCredit = 10000;
}else if(lineOfCredit == "B") {
this.lineOfCredit = 5000;
}else if(lineOfCredit == "C") {
this.lineOfCredit = 2000;
}else if(lineOfCredit == "D") {
this.lineOfCredit = 1000;
}
}
//对父类中withdraw方法的覆盖,注意方法返回值,名称,数据类型都必须和父类中的方法一样,类的修饰符可以不变或扩大,不能缩小。
@Override
public void withdraw(double amount) {
if (amount<=this.getBalance()+lineOfCredit) {
this.setBalance(this.getBalance()-amount);
if (this.setBalance(this.getBalance())==false) {
overdraw=this.lineOfCredit-this.getBalance()*(-1);
this.setBalance(0);
}
}
else {
System.out.println("超出限额,无法取出");
}
}
//剩余透支额度,子类中新的方法
public double findOverdraw() {
return overdraw;
}
public static void main(String[] args) {
CreditAccount a = new CreditAccount("张三","01",500,1000);
a.withdraw(200);
System.out.println("信用卡类用户余额为"+a.getBalance());//对象a可以调用父类中的方法getBalance().
}
}
子类可以通过覆盖对父类中原有的方法进行修改,比如信用卡的取款与其父类的取款方法有所不同,就可以对父类方法进行覆盖,@Override为覆盖的标志。也可以定义新的变量和方法如变量lineOfCredit和方法findOverdraw。