0

首先,我将向您展示我的代码:

public class Person {
String _name;
int _age;
public Person(String name, int age){
    _name = name;
    _age = age;
}
public String toString(){
    return "Age:" + _age + ". Name: " + _name;
  }
}

public class Principal extends Person{
String _gender;
int _rank;
public Principal(String name, int age, String gender, int rank){
    super(name, age);
    _gender = gender;
    _rank = rank;
}
public String toString(){
    return "Age:" + _age + " .Name: " + _name + " .Gender: " + _gender + " .Rank: " + _rank;
}

}

主要的:

public class Main {
public static void main(String[] args){
    Person me = new Person("Bob", 23);
    System.out.println(me);
    Principal hj = new Principal("Dan", 39, "Male", 1);
   }
}

我不明白为什么我必须在Principal hj = new Principal("Dan", 39, "Male", 1);. . . 我认为super(name, age);应该从对象继承前两个参数me,我只需要应用最后两个参数。

我想念什么?

4

5 回答 5

1

我以为 super(name, age); 应该从对象 me 继承前两个参数,我只需要应用最后两个参数。

这甚至意味着什么?
参数值必须来自某个地方


super(...)只需调用基类构造函数,并使用您想要传递给它的任何参数。

于 2013-11-11T03:35:28.810 回答
0

首先,什么 super(...); 确实是调用接受该数字和类型参数的超类构造函数,具体取决于您的超类构造函数。

然后,您正在混合内容,您从类继承,而不是从类(对象)的实例继承,这意味着它们共享属性(每个主要对象都具有所有 Person 对象具有的属性(名称,年龄),作为 Principle继承自人)。

您没有将 Person 对象转换为 Principal 对象(向下转换),因为您可能会有意外的行为,这是有风险的。然后你能做的,有两件事,你可以将一个 Principal 类向上转换为一个 Person 类,然后属性保持不变,你可以使用所有常见的 Person 属性。

或者,您可以在主体中创建一个构造函数,它接受一个 Person 对象并复制其属性,然后您可以将其称为:

Person m = new Person("David", 12);
Principal hj = new Principal(m, "Male", 1);

希望它澄清!

于 2013-11-11T03:41:46.947 回答
0

很简单,super()调用父类中的构造函数。

您传递的参数确定调用哪个构造函数。

父类对传递给子类中的构造函数的参数一无所知。

于 2013-11-11T03:41:51.273 回答
0
 Person me = new Person("Bob", 23);
 Principal hj = new Principal("Dan", 39, "Male", 1);

在这里,您正在创建两个不同的对象。因此,人“我”是一个不同的对象,而校长“hj”是另一个对象。校长 HJ 将拥有自己的 Person“实例”作为其父级。因此,您必须将所有参数传递给 hj 以便此父 person 实例获取其中两个。这就是为什么你叫超级。

于 2013-11-11T03:42:58.733 回答
0

没什么难的。。

super() 调用您的父类构造函数,并为您的子类赋予或添加属性值。

于 2013-11-11T03:45:34.990 回答