为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2021-05-17 18:10:22
调试并实现利用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.javapublic 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());}}
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

您好,第一、在子类构造方法中要调用父类的构造方法,用“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和超类变量v

System.out.println("------1-----");
System.out.println(v); //输出局部变量v
System.out.println(this.v); //输出(子类)成员变量v
System.out.println(super.v); //输出超类成员变量v

System.out.println("------2-----");
System.out.println(x); //输出超类成员变量v,子类继承而来
System.out.println(super.x); //输出超类成员变量v

System.out.println("------3-----");
outinfo(); //调用子类的outinfo()方法
this.outinfo(); //调用子类的outinfo()方法
super.outinfo(); //调用父类的outinfo()方法
}

public static void main(String[] args) {
new Son().test();

}
}

子类Son运行结果:

Father构造方法被调用!
Son无参数构造方法被调用!
------1-----
哈哈哈哈!
Son
Father
------2-----
输出了Father类的public成员变量x!!!
输出了Father类的public成员变量x!!!
------3-----
Son的outinfo()方法被调用
Son的outinfo()方法被调用
Father的outinfo方法被调用


查看完整回答
反对 回复 2021-05-23
?
白板的微信

TA贡献1883条经验 获得超3个赞

1.
main 因为是static静态的,不能指示新创建的类和父类
this(有参数/无参数) 用于调用本类相应的构造函数
super(有参数/无参数) 用于调用父类相应的构造函数
this. 后跟方法或属性 指示本类的方法或属性
super. 后跟方法或属性(父类中指明的public protected)

2.
调用父类方法改变此变量就只能改变父类里面的此变量,而不能改变子类里面的变量,为什么呢?

调用父类的方法改变的变量只能是父类的变量这是必然的,因为父类中不存在子类新加的变量,因此只能改变父类中的变量

查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 307 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信