我对
感到困惑super.i = j + 1;
这行代码。我认为它只会更改A类中的变量i,而不会更改B类中的继承变量i。
为使问题更清楚,我添加了另一个示例(示例2)。在示例2中,我们使用
super(balance,name);
初始化从父类继承的属性。当我们调用super并更改变量的余额和名称时,我们不会在父类中更改变量的余额和名称。
在示例1中,我们使用
super.i = j + 1;
实际上,我们更改了父类中的变量i,而不是从父类继承的变量i。这两个样本有什么区别?非常感谢。
编辑于2019年7月18日
我在示例2中添加了一个diriver类。在CheckingAccount中创建对象c后,c中的余额为200,名称为“ XYZ”。我们在子类中使用super(参数),是否在父类中更改了余额和名称? 如果没有,为什么要更改示例1中的变量i?
//Sample one
class A{
int i;
}
class B extends A{
int j;
void display() {
super.i = j+1;
System.out.println(j+ " "+i);
}
}
public class CC {
public static void main(String[] args) {
// TODO Auto-generated method stub
B obj = new B();
obj.i =1;
obj.j = 2;
obj.display();
}
}
//sample 2
//parent class
public class BankAccount {
protected double balance=0;
protected String name="ABC";
public BankAccount(double balance, String name) {
this.balance = balance;
this.name = name;
}
}
//child class
public class CheckingAccount extends BankAccount{
final int CHARGE = 5;
final int NO_CHARGE = 0;
private boolean hasInterest;
public CheckingAccount(double balance, String name, boolean hasInterest) {
super(balance,name);
this.hasInterest = hasInterest;
}
}
//driver class
public class DriveClass {
public static void main(String[] args) {
CheckingAccount c = new CheckingAccount(200,"XYZ",true);
}
}
输出为
2 3
答案 0 :(得分:0)
这是B类中的i
在A类中隐藏i
的地方。而this.i
和super.i
是不同的。
class A {
int i;
void print() {
System.out.println("i = " + i);
}
}
class B extends A {
int j;
int i;
void display() {
i = j + 1;
super.i = 1000;
System.out.println(j + " " + i);
print(); // this will print the i in A
}
}
答案 1 :(得分:0)
超级(余额,名称)
这称为父类的构造函数,以初始化父类中的变量balance和name。是的,它确实更改了父类中的余额和名称的值
super.i = j + 1
这将j + 1分配给父类变量i。
一个通过构造函数初始化父类变量,另一个是直接将值分配给父类变量。两者都不一样