猿问

如下所示,有个问题不是很理解,关于super和this关键字的使用?

调试并实现利用super关键字重写方法。
源文件1: Employee.java 
public class Employee {
public String name = "zhangSan";
public double salary = 5000;
public String getDetails() {
return " Name:" + name + "\n" + " Salary:" + salary;
}
}

源文件2: Manager.java
public class Manager extends Employee {
pubilc String department = "Office";
public String getDetails() {
return " Name:" + name + "\n" + " Salary:" + salary + "\n" + " Department: " + department;
}
}

源文件3: TestEx203a.java 
public class TestEx203a{
public static void main(String args[ ]) {
Employee e = new Employee();
Manager m = new Manager();
System.out.println("Employee:"+"\n" +e.getDetails());
System.out.println("Manager:"+"\n" +m.getDetails());
}
}

慕雪6442864
浏览 309回答 2
2回答

慕容森

您好,第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。package org.leizhimin;public class Father {public String v="Father";public String x="输出了Father类的public成员变量x!!!";public Father() {System.out.println("Father构造方法被调用!");}public Father(String v){this.v="Father类的带参数构造方法!运行了.";}public void outinfo(){System.out.println("Father的outinfo方法被调用");}public static void main(String[] args) {// TODO 自动生成方法存根}}package org.leizhimin;public class Son extends Father{public String v="Son";public Son() {super(); //调用超类的构造方法,只能放到第一行.System.out.println("Son无参数构造方法被调用!");//super(); //错误的,必须放到构造方法体的最前面.}public Son(String str){super(str);System.out.println("Son带参数构造方法被调用!");}//覆盖了超类成员方法outinfo()public void outinfo(){System.out.println("Son的outinfo()方法被调用");}public void test(){String v="哈哈哈哈!"; //局部变量v覆盖了成员变量v和超类变量vSystem.out.println("------1-----");System.out.println(v); //输出局部变量vSystem.out.println(this.v); //输出(子类)成员变量vSystem.out.println(super.v); //输出超类成员变量vSystem.out.println("------2-----");System.out.println(x); //输出超类成员变量v,子类继承而来System.out.println(super.x); //输出超类成员变量vSystem.out.println("------3-----");outinfo(); //调用子类的outinfo()方法this.outinfo(); //调用子类的outinfo()方法super.outinfo(); //调用父类的outinfo()方法}public static void main(String[] args) {new Son().test();}}子类Son运行结果:Father构造方法被调用!Son无参数构造方法被调用!------1-----哈哈哈哈!SonFather------2-----输出了Father类的public成员变量x!!!输出了Father类的public成员变量x!!!------3-----Son的outinfo()方法被调用Son的outinfo()方法被调用Father的outinfo方法被调用

白板的微信

1.main 因为是static静态的,不能指示新创建的类和父类this(有参数/无参数) 用于调用本类相应的构造函数super(有参数/无参数) 用于调用父类相应的构造函数this. 后跟方法或属性 指示本类的方法或属性super. 后跟方法或属性(父类中指明的public protected)2.调用父类方法改变此变量就只能改变父类里面的此变量,而不能改变子类里面的变量,为什么呢?调用父类的方法改变的变量只能是父类的变量这是必然的,因为父类中不存在子类新加的变量,因此只能改变父类中的变量
随时随地看视频慕课网APP

相关分类

Java
Android
我要回答