zoukankan      html  css  js  c++  java
  • java学习之继承

    1.什么是继承?

    继承是在一些比较一般的类(超类)的基础上构造、建立、扩充新类(子类)的一种手段。并且子类与超类之间一般存在is-a关系,例如:在理论上来说,在Manager与Employee之间存在着明显的is-a关系。is-a关系是继承的一个明显的特征。

    2.继承的作用

    • 继承简化了人们对事物的认识和描述,能清晰的体现相关类间的层次结构关系。
    • 继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要在描述与超类(类A)不同的少量特征(数据成员和成员方法)即可。这种方法能减少代码量和数据冗余度,大大增加程序的重用性。
    • 继承通过增强一致性来减少模块间的接口与界面,大大增加了程序的易维护性。
    • 提供了多重继承机制。从理论上来说,一个类可以多个超类的 子类 ,它可以从多个 超类 中继承属性与方法,这便是多继承。 但java处于安全性和可靠性的考虑,仅支持单重继承,而通过接口机制来实现多重继承。

    3.注意点

    • 当在子类中的方法不是在超类中定义的,超类的对象就不能使用它。
    • 当超类与子类具有相同的方法时,子类中的方法会覆盖超类的这个方法
    • 子类中可以增加域、增加方法或覆盖超类的方法,然而决不能删除继承的任何域或者方法。

    4.实例(以下代码来自于 Java核心卷|

    1. inheritance/ManagerTest.java

       package inheritance;
       public class ManagerTest{
       	public static void main(String[] args){
       	//constrcut a Manager object
       	Manager boss = new Manager("Cracker",80000,1988,12,15);
       	boss.setBonus(5000);
       	Employee[] staff = new Employee[3];
       	//fill the staff arry with Manager and Employee object
       	staff[0] = boss;
       	staff[1] = new Employee("Harry",50000,1986,10,1);
       	staff[2] = new Employee("Tommy",40000,1987,3,15);
       	//print out information about all Employee objects
       	//体现了多态与动态捆绑
       	for(Employee e : staff)
       		System.out.println("name:" + e.getName() + ",salary:" + e.getSalary());
       	}
       }
      
    2. inheritance/Employee.java

       package inheritance;
       
       import java.util.Date;
       import java.util.GregorianCalendar
       public class Employee {
       private String name;
       private double salary;
       private Date hireDay;
      
       	public Employee(String n,double s ,int year,int month,int day){
       		name = n;
       		salary = s;
       		GregorianCalendar calendar = new GregorianCalendar(year, month-1, day);
       		hireDay = calendar.getTime();
       	}
      
       	public String getName(){
       		return name;
       	}
       	public double getSalary(){
       		return salary;
       	}
      
       	public Date getHireDay(){
       		return hireDay;
       	}
      
       	public void raiseSalary(double byPercent){
       		double raise = salary * byPercent / 100;
       		salary += raise;
       	}
       }
      
    3. inheritance/Manager.java

      package inheritance;
      //Manager类继承了Employee类	
      public class Manager extends Employee{
      private double bonus;	
      	public Manager(String n, double s, int year, int month, int day){
      		//利用super关键词调用Employee类的构造器
      		super(n, s, year, month, day);
      		bonus = 0;
      	}
      	//覆盖了Employee类中的getSalary方法
      	public double getSalary(){
      		//用super关键字调用Employee类的方法
      		double baseSalary = super.getSalary();
      		return baseSalary + bonus;
      	}
      	public void setBonus(double b){
      		bonus = b;
      	}
      }
      

    5.super关键字的使用(实例中出现的问题)

    • super调用超类的方法

      使Manager类中的getSalary方法返回薪水和奖金的总和,由于Employee类中的salaryprivate,所以在Manager类中用使用超类的salary时需使用super来调用。

    • super调用超类的构造器

      1. 由于Manager类的构造器不能访问Employee类的私有域,所以必须利用Employee类的构造器对这部分私有数据进行初始化。
      2. 使用 super调用构造器的语句必须是子类构造器的第一条语句。
      3. 如果子类的构造器没有显式地调用超类的构造器,则将自动调用超类的默认(没有参数)的构造器。
  • 相关阅读:
    获取远程图片的Blob资源
    Vue使用SCSS进行模块化开发
    Vue设置页面的title
    Vue里边接口访问Post、Get
    module.exports 、 exports 和 export 、 export default 、 import
    Vue设置不同的环境发布程序
    记一个鼠标略过时候的css动画
    关于正则表达式中^和$
    [LOJ#2305]「NOI2017」游戏
    [LOJ#6437][BZOJ5373]「PKUSC2018」PKUSC
  • 原文地址:https://www.cnblogs.com/mnzero/p/4603964.html
Copyright © 2011-2022 走看看