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

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

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()中的局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值