Can';我不懂super';Java中的s功能

Can';我不懂super';Java中的s功能,java,inheritance,super,Java,Inheritance,Super,首先,我将向您展示我的代码: 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 Perso

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

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)中添加前2个参数。我认为
super(姓名、年龄)
应该从对象
me
继承前两个参数,我只需要应用最后两个参数

我错过了什么

我觉得超级(名字,年龄);应该从对象me继承前两个参数,而我只需要应用最后两个参数

这到底是什么意思?
参数值必须来自某个地方


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

首先,什么是super(…);根据您的超类构造函数的不同,调用采用该数字和类型参数的超类构造函数

然后,你在混合东西,你从类继承,而不是从类(对象)的instace继承,这意味着它们共享属性(每个principle对象都有Person对象所拥有的属性(名称、年龄),就像principle从Person继承一样)

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

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

Person m = new Person("David", 12);
Principal hj = new Principal(m, "Male", 1);
希望澄清

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

传递的参数决定调用哪个构造函数

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

 Person me = new Person("Bob", 23);
 Principal hj = new Principal("Dan", 39, "Male", 1);
在这里,您将创建两个不同的对象。所以,人“我”是另一个对象,主体“hj”是另一个对象。校长HJ将有自己的“实例”作为父母。因此,您必须将所有参数传递给hj,以便该父person实例获得其中两个参数。这就是为什么你叫“超级”的原因。

没什么难事


super()调用父类构造函数,并为子类提供或添加属性值。

如果不指定这些参数,Java应该从何处获取它们?
me
hj
之间绝对没有任何关系。使用
\u
作为标识符的第一个字母会伤害我的眼睛。@SotiriosDelimanolis这就是我一直在问自己的问题,但我也被超级(…)的目的绊倒了如果我在你的代码中重新指定参数,如果你认为Person对象和Pricipal对象有某种自动创建的关系,那就不对了。“我”和“hj”在你的代码中是完全不同的对象。我同意:那些下划线太可怕了。。。因为缺乏压痕。