Java(方法重写与变量覆盖)(super,this的使用)

原创 2016年08月29日 21:55:21

在类的继承过程中,如果子类中新增的变量和方法与父类中原有的变量和方法同名,则会覆盖从父类继承来的同名变量和方法。覆盖又分为变量覆盖和方法覆盖,变量覆盖是指父类和子类中的变量名相同,数据类型也相同。方法覆盖又称方法重写,与之前介绍的方法重载相比,方法覆盖的要求更严格:
!!不仅要求父类与子类中的方法名称相同,而且参数列表也要相同,只是实现的功能不同。
样例

class SuperCla
{
    int a=3;
    int b=4;
    void show()
    {
        System.out.println("super result="+(a+b));
    }
}
class SubCla extends SuperCla{
    int a=10;
    void show()
    {
        int c=a*b;
        System.out.println("sup result="+c);
    }
}
public class SimpleTest {
    public static void main(String[] args) {
        SuperCla sp=new SuperCla();
        SubCla sb=new SubCla();
        sp.show();
        System.out.println("In super Class:a="+sp.a);
        sb.show();
        System.out.println("In sub Class:a="+sb.a);
    }

}

结果
super result=7
In super Class:a=3
sup result=40
In sub Class:a=10
分析:
在子类SubCla中定义有与父类SuperCla同名的变量a和方法show(),因此,使用子类对象sb访问变量a和方法show时,引用的的是子类中的成员,父类的同名变量被覆盖,同名的方法被重写。

如果想在子类中访问父类中被覆盖的成员,可以使用关键字super来解决这以问题,基本格式如下。
访问父类成员:
super.成员变量或super。成员方法([参数列表])
访问父类构造方法:
super([参数列表])
样例:

class Employee{
    private String name;
    private int salary;
    public String getDetails(){
        return "Name:"+name+"\nSalary:"+salary;
    }
    Employee(){
        name="Tom";
        salary=1234;
    }
}

class Manager extends Employee{
    public String department;
    public String getDetails()
    {
        System.out.println("I am in Manager");
        return super.getDetails();
    }
    Manager(){
        super();
        department="sale";
    }
}
public class Inheritance {
    public static void main(String[] args) {
        Manager manager=new Manager();
        System.out.println(manager.getDetails());
        System.out.println("department:"+manager.department);
    }

}

结果
I am in Manager
Name:Tom
Salary:1234
department:sale
分析:首先对于Manager实例化,并自动调用无参数构造方法Manager(),主要完成两项主要任务:一是通过super调用父类的无参数构造函数,即Employee(),二是对子类中新增的变量department进行初始化,接着,语句manager.getDetails()调用子类的同名方法getDetails(),并在方法体中通过super.getDetails()实现对父类中getDetails()方法的调用。
注意:
生成一个类的实例时,一定会执行该类的构造方法,但如果该类继承自某个父类,则执行子类的构造方法时,系统会自动的调用父类的无参数构造函数。因此,在上面Manager()中去掉语句super()的效果是完全一样的。

于super不同,关键字this的主要作用在于表示当前对象,当局部变量和类的成员变量同名时,该局部变量作用区域内的成员变量就被隐藏了,必须使用this来指明,如下例所示


public class Mydate{
        private int day,month,year;
        public void setday(int day){
        this.day=day;
        }
}

这里的this实际上指的是Mydate,如果将this省去,则=左右的变量day均为方法setday()中的局部变量。

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

相关文章推荐

java中重写、覆盖,重载三者的区别?

 java中重写、覆盖,重载三者的区别?  首先要明确Java中重写,覆盖,重载都是针对方法的几个不同概念。其中重写与覆盖等同,只是两种不同的称法而已。  现在主要来理解下重写与重载的区...

Java中的重写覆盖问题

首先,重写等于覆盖,常发生于父类与子类之间的变量和方法之间。

java继承覆盖总结

java的继承与覆盖基本是java笔试中常出的题,也比较绕,我这里对java的继承覆盖做一个总结1.构造函数:        当子类继承一个父类时,构造子类时需要调用父类的构造函数,存在三种情况   ...
  • stonecao
  • stonecao
  • 2011年04月12日 10:21
  • 37849

JAVA方法的重载(overload)和覆盖(override)

方法的重载(overload)和覆盖(override)   有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我们最常用的System.out.println...

浅谈java的方法覆盖与变量覆盖

首先,我们看看关于重载,和覆盖(重写)的简明定义: 方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。 方法覆盖:如果在子类中定义一个方法,其名称、返回类型...

java方法重写和super关键字

方法的重写 在子类中可以根据需要对从基类继承来的方法进行重写 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回类型 重写方法不能使用比被重写方法更严格的访问权限 在J...

浅谈方法重写 super

自己梳理整理一下留作以后回顾           1.方法重写(Override),也可称为方法覆盖,是一种子类包含与父类同名方法的现象。           2.规则:“两同两小一大”规则。①“...

JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载

JAVA基础再回首(六)——父与子的继承、super关键字、方法重写、方法重载 不墨迹,才是时间管理的最大利器,学无止境。 继承 首先我们来学习继承的概述多个类中存在相同属性和行为时,将这些内...
  • m366917
  • m366917
  • 2016年08月02日 22:10
  • 1686

java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)

众所周知,java中this关键字指的是当前调用对象,一般使用方法不在此阐述public class HelloA { public static void main(String[] arg...

Java中的方法重写和方法重载

今天是去公司上班的第三个星期,因为自身的原因每天写博客的习惯还是有点坚持不下来,所以博客一直丢下了两个星期没写,今天终于又敲起键盘来写博客了。         这两个星期一直都在公司复习Java基础知...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java(方法重写与变量覆盖)(super,this的使用)
举报原因:
原因补充:

(最多只允许输入30个字)