zoukankan      html  css  js  c++  java
  • 巩固java(四)----super和super()

    引言:

            一个公司里有普通员工和经理,他们之间有很多共同点,但也有一些差异,比如薪水问题,普通员工只有普通工资,经理在完成绩效后有一定比例的奖金。这时我们可以定义两个类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关键字。




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

  • 相关阅读:
    excel查找定位操作(for lutai)
    sqlserver检查sql执行时间
    excel操作for(lutai)
    android studio 3.0+发布签名apk注意的情况
    二维码
    svn文件合并
    生成wsdl代理c#代码
    LOCK_TIMEOUT
    支持chrome30下载文件
    miniui处理多重子表级联,一次性提交多表数据的ui要点
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931761.html
Copyright © 2011-2022 走看看