引言:

一个公司里有普通员工和经理,他们之间有很多共同点,但也有一些差异,比如薪水问题,普通员工只有普通工资,经理在完成绩效后有一定比例的奖金。这时我们可以定义两个类Employee和Manager,显然两个类之间存在明显的"is-a"关系---经理也是公司员工,而“is-a”关系是继承关系的特征,所以Employee和Manager之间存在继承关系。

正文:

       下面是Employee类:

/**
* 员工类
*/
public class Employee { private int no ; //员工编号
private String name ; //员工姓名
private double salary ; //员工薪水 public Employee(){ } public Employee( int no,String name, double salary){
this. no = no;
this. name = name;
this. salary = salary;
} public double getSalary(){
return salary;
}
}

如果按如下方法定义Manager类,显然是错误的:

/**
* 经理类
* 错误代码
*/
class Manager extends Employee{
private double reward ; //奖金 public void Manager( int no,String name, double salary,double reward){
this .no = no;
this .salary = salary;
this .name = name ;
this .reward = reward;
}
}

Manager类继承了Employee类,所以它继承了Employee的所以成员变量,但Manager本身并没有no,salary和name属性,而Employee的这三个属性是私有的,不能被它自己以外的任何类调用,即使是它的子类,那怎么办呢?如下:
class Manager extends Employee{
private double reward ; //奖金 public Manager( int no,String name, double salary,double reward){
super (no,name,salary); //必须放在构造方法第一行
this .reward = reward;
}
}

super(no,name,salary)是调用Employee类的public Employee( int no,String name, double salary)的简写。

需要提及的是,如果写super(),则会调用其超类的空构造方法,但是如果不在子类中显示的调用其超类的构造方法,还是会默认调用其超类的空构造方法的,如果此时超类没有空构造方法,会报编译错误。



对Manager来说其薪水是slalary+reward,所以,在Manager中需重写getSalary()方法,先看下面的代码:

 //错误代码
public double getSalary(){
return reward + salary;
}

这段代码是错误的,为什么?因为子类无法直接调用其超类的私有域。如果通过超类的getSalary()方法获取呢


//错误代码

public double getSalary(){

return reward +getSalary();

}

这段代码虽然不会报错,但其实也是错的,虽然超类有getSalary(),但子类Manager也有继承了该方法,而子类中的成员变量和成员方法优先级高,所以会优先调用子类的该方法,就是现在正在写的方法,这样写会造成无限次的递归调用。

正确的写法是使用super关键字,如下:

public double getSalary(){

return reward + super.getSalary();

}

super和this的异同【文字来源:http://blog.csdn.net/anmei2010/article/details/4093118】:

1)super(参数):调用超类中的某一个构造函数(应该为构造函数中的第一条语句)

2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)

4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)



5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

6)super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

7)super()和this()均需放在构造方法内第一行。

8)尽管可以用this调用一个构造器,但却不能调用两个。

9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

10)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

版权声明:本文为博主原创文章,未经博主允许不得转载。

巩固java(四)----super和super()的更多相关文章

  1. JAVA中this和super用法

    参考网上资料和自行理解总结java中this和super中各自用法及其差异 <一>. this的用法 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器返回该类的对 ...

  2. java的继承 和super关键字 构造器

    面向对象的特性二继承: 继承的好处: 1.减少代码的冗余.提高了代码的复用性 2.便于功能的扩展 3.为之后多态的使用,提供了前提 继承的格式: class A extends B{} A:子类.派生 ...

  3. [Java基础]java中this和super

    一.this关键字 1.this概念 (参考:http://www.cnblogs.com/xdp-gacl/p/3636071.html)   this是一个引用,它指向自身的这个对象,它的内存分析 ...

  4. Java中this与super的区别【6】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

  5. 你真的理解Java的this和super吗?

    你不知道的this 很多介绍java的书籍都说this指该对象本身.我们来看下面代码: class Base{ private int i = 3; public Base() { this.disp ...

  6. Java基础-this和super的区别

    package com.cn.This; /** * this与super的区别: * 1.this相当于指向本类的对象的指针,调用本类的另一种类型的构造方法 * 2.super调用的是父类中形参相同 ...

  7. java方法重写和super关键字

    //java方法重写和super关键字 //在继承中,其实就是子类定义了和父类同名的方法 //就是方法,属性都是相通的 //重写限制: //被子类重写的方法不能拥有比父类方法更加严格的权限 //sup ...

  8. java基础学习总结——super关键字

    一.super关键字

  9. java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序

    this this 表示当前对象 使用上细分的话,this有 this. 和this()的使用情况 ,下面我们开始细撸 this . 使用场景一: 在成员方法中,this.变量名 指带当前对象的变量, ...

随机推荐

  1. Linux文件系统及常用命令

    Linux文件系统介绍: 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上.目录提供了管理文件的一个方便而有效的途径. Linux使用树状目录结 ...

  2. obj-c编程03:多个参数方法的定义

    好吧,虽说本猫不能自吹精通十几种语言,但是也见过十几种语言的语法啊.像obj-c这样奇葩,或者说另类的写法还是头一次见到,完整写法我都不知道怎么起方法名了.虽说有简短写法,可和C比起来那个" ...

  3. LeetCode(48)-Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  4. python标准库之MultiProcessing库的研究 (1)

    MultiProcessing模块是一个优秀的类似多线程MultiThreading模块处理并发的包之前接触过一点这个库,但是并没有深入研究,这次闲着无聊就研究了一下,算是解惑吧.今天先研究下appl ...

  5. VS Code python初体验笔记

    之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Pyth ...

  6. pandas数据处理基础——筛选指定行或者指定列的数据

    pandas主要的两个数据结构是:series(相当于一行或一列数据机构)和DataFrame(相当于多行多列的一个表格数据机构). 本文为了方便理解会与excel或者sql操作行或列来进行联想类比 ...

  7. myBatis之入门示例

    1. myBatis目录结构: --src ---entity [POJO类] ---mappers [映射类] ----*Mapper.java [方法接口,相当于Dao] ----*Mapper. ...

  8. 【图文详解】HDFS基本原理

    本文主要详述了HDFS的组成结构,客户端上传下载的过程,以及HDFS的高可用和联邦HDFS等内容.若有不当之处还请留言指出. 当数据集大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区,并 ...

  9. SQL解决时间段重复合并问题

    合并时间段: 将连续或者重叠的时间段合并. create table timesheets ( task_id char(10) not null primary key, startdate dat ...

  10. 阿里云服务器连接邮箱SMTP服务器time out的解决

    给官方提了个工单,回复如下: 去年9月底开始,出于上级对垃圾邮件管控的要求,新购VPC服务器限制了25端口,我们建议您使用邮件服务商的加密465端口. 或者您查询下所希望访问的发信服务是否提供了像阿里 ...