关闭

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

标签: java继承
546人阅读 评论(0) 收藏 举报
分类:

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

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

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:67016次
    • 积分:3078
    • 等级:
    • 排名:第11309名
    • 原创:248篇
    • 转载:0篇
    • 译文:0篇
    • 评论:14条
    最新评论