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中为什么字段不能被重写

(转载)http://www.xinxingzhao.com/blog/2015/09/05/why-field-cantt-be-overridden/ 原文地址 在Java中字段能...
  • u010746364
  • u010746364
  • 2016年01月19日 09:50
  • 1070

java继承中,成员变量的覆盖

其实Java继承中,成员变量(包括静态变量,实例变量,常量)没有覆盖(override)一说,应该叫隐藏(hidden)。override只针对方法来说的。 当成员变量为private时,其他类不能直...
  • xiemk2005
  • xiemk2005
  • 2010年08月12日 00:00
  • 6658

Java多态之向上转型、同名变量以及方法覆盖

Java向上转型时多态的体现,父类与子类有同名变量是内存的分配,向上转型时方法的覆盖...
  • yifeiboss
  • yifeiboss
  • 2016年11月29日 21:14
  • 537

java继承覆盖总结

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

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

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

java中方法的覆盖与覆写

方法覆写 a、  在子类中可以根据需要对从基类中继承来的方法进行重写。 b、  重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。 c、  重写方法不能使用比被重写方法更严格的访问权...
  • eclipse_yin
  • eclipse_yin
  • 2016年04月07日 19:28
  • 1560

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

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

java方法调用之动态调用多态(重写override)的实现原理——方法表(三)

上两篇篇博文讨论了java的重载(overload)与重写(override)、静态分派与动态分派,这篇博文讨论下动态分派的实现方法,即多态override的实现原理。 java方法调用之重载、重...
  • fan2012huan
  • fan2012huan
  • 2016年03月30日 16:32
  • 4044

java方法调用之重载、重写的调用原理(一)

前一段时间看了《深入理解JVM》第三部分虚拟机执行子系统的内容,看到了重载与重写在JVM层面的调用原理(详见8.3 方法调用一节),但是没有写成博客总结一下,这里讨论讨论。在讨论过程中,难免会涉及到 ...
  • fan2012huan
  • fan2012huan
  • 2016年03月29日 11:34
  • 4522

Java的重写与调用父类方法问题

一. Java重写父类方法 class Father{ public void tostring() { System.out.println("Hello!"); } } class S...
  • ZSGG_ACM
  • ZSGG_ACM
  • 2015年11月18日 10:41
  • 4093
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java(方法重写与变量覆盖)(super,this的使用)
举报原因:
原因补充:

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