Java类三大特性之二:继承性

  继承在面向对象开发思想中是一个非常重要的概念,它使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发的周期,也可以提高软件的可维护性和可扩展性。接下来我门将详细讲解类的继承。
  继承的基本思想就是基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的方法和属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。以上的种种特性我们将在接下来通过代码的形式一一阐述。
我们先来看一段代码:

package com.java.test;

public class Human {
	//属性
	private int age;
	private String name;
	//构造器
	public Human() {
		
	}
	//方法
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}	
	
}

我们定义了一个Human类(父类),类的属性age和name被private权限修饰符所修饰,类中有get和set方法。再看下一段代码:

package com.java.test;

public class Man extends Human{
	//子类特有的属性
	private int id;
	private String address;
	//子类的构造器
	public Man(int id, String address) {
		this.id = id;
		this.address = address;
	}
	//子类的方法
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public void info(){
		System.out.println(this.getName() + this.getAge()
				+ this.getId() + this.getAddress());
	}
}

  关键字extends表明Man类是继承了Human类,那么Human类叫Man类的父类,反过来Man类叫Human的子类。而且子类Man可以拥有自己的属性id和address和自己的get、set方法。在Man类中的info方法中调用了其父类的getname,getage方法,这说明子类可以调用其父类中的方法。
  那么子类可以调用父类的中的其他成员吗?答案是可以的,但是不能直接调用,需要借助super关键字,而且被调用的成员(属性,方法,构造器)的权限修饰符也是有特殊规定的。下面我们通过一段代码来演示一下:

package com.java.gp;

public class Account {
	//属性
	private int id;//账户ID
	protected double balance;//账户余额
	public double annualInterestRate;//年利率
	
	//构造器,初始化属性
	public Account(int id, double balance, double annualInterestRate) {
		super();
		this.id = id;
		this.balance = balance;
		this.annualInterestRate = annualInterestRate;
	}
	//获取账户ID
	public int getId() {
		return id;
	}
	//设置账户ID
	public void setId(int id) {
		this.id = id;
	}
	//获取账户余额
	public double getBalance() {
		return balance;
	}
	//设置账户余额
	public void setBalance(double balance) {
		this.balance = balance;
	}
	//获取年利率
	public double getAnnualInterestRate() {
		return annualInterestRate;
	}
	//设置账户年利率
	public void setAnnualInterestRate(double annualInterestRate) {
		this.annualInterestRate = annualInterestRate;
	}
	//取款
	public void withdraw(double amount){
		if(amount <= balance){
			this.balance -= amount;
		}
		else{System.out.println("余额不足!");}
	}
	//存款
	public void deposit(double amount){
		this.balance += amount;
	}
}

  我们创建了一个模拟银行账户的类Account,id、balance和AnnualInterestRate是其属性,构造器可以初始化其属性,该类拥有get、set方法和存取款方法。我们来看它的子类。

package com.java.gp;

public class CheckAccount extends Account{
	//子类的私有属性,透支额度
	private double overdraft;
	
	//子类构造器
	public CheckAccount(int id, double balance, double annualInterestRate,
			double overdraft) {
		super(id, balance, annualInterestRate);
		this.overdraft = overdraft;
	}
	//子类get和set方法
	public double getOverdraft() {
		return overdraft;
	}

	public void setOverdraft(double overdraft) {
		this.overdraft = overdraft;
	}
	//输出账户信息
	public void info(){
		System.out.println(this.getid() + this.balance 
			+ this.annualInterestRate + this.overdraft);
	}
}

我们可以看到以下几个要点:
  1.子类通过super(id, balance, annualInterestRate);调用了父类的构造器,使得子类创建子类对象时也可以直接初始化从父类继承来的属性(id、balance和AnnualInterestRate)。
  2.在info方法中,子类分别通过getid(),直接调用(this.balance和this.annualInterestRate )输出了从父类继承来的属性。
  我们可以注意到,父类中被private修饰的属性,子类不能直接调用,必须使用get方法,但是被protected和public修饰的是可以直接调用的。

以下是关于Java类中使用super来调用父类中的指定操作:

1. super可用于访问父类中定义的属性
2. super可用于调用父类中定义的成员方法
3. super可用于在子类构造方法中调用父类的构造器

注意:
- 尤其当子类和父类出现同名成员时,可以用super进行区分
- super的追溯不仅限于直接父类
- super和this的用法很像,this代表本类对象的引用,super代表父类的内存空间的标识
  其实在子类CheckAccount中我们使用super关键字来显示的调用父类中指定的构造器,其实如果不使用super关键字显示的调用父类中指定的构造器时默认调用父类中空参的构造器,所以在不显示的使用super时父类中必须有空参的构造器,否则会报错。在使用super时需要注意的是:
1.在构造器内部,super必须声明在首行
2.this或super只能出现一个,应为二者都必须声明在首行
3.不显示使用this或super,默认调用父类中空参的构造器

  子类中对父类方法的重写也是继承性中的一个重要概念,我们将单独写一篇博客来介绍子类对父类的方法重写,敬请期待。

特殊声明:本人并不是大佬,只是说一说自己在学习Java过程中的理解,文章有不正确的地方欢迎大家批评指正。最后希望大家不喜勿喷,营造良好的学习环境。
温馨提示:道路千万条,学习第一条。平时不学习,招聘两行泪!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值