有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承无法理解Java中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 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继承前两个参数,我只需要应用最后两个参数

我错过了什么


共 (5) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

     Person me = new Person("Bob", 23);
     Principal hj = new Principal("Dan", 39, "Male", 1);
    

    在这里,您将创建两个不同的对象。所以,人“我”是另一个对象,主体“hj”是另一个对象。校长HJ将有自己的“实例”作为父母。所以,您必须将所有参数传递给hj,以便这个parent person实例获得其中两个参数。这就是为什么你叫super

  3. # 3 楼答案

    I thought that super(name, age); was supposed to inherit the first two parameters from the object me and I would only need to apply the last 2 parameters.

    这到底意味着什么
    参数值必须来自某处


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

  4. # 4 楼答案

    首先,什么超级(…);根据您的超级类构造函数,调用超级类构造函数,该构造函数接受该数字和类型参数

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

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

    或者,你可以创建一个constructor,它接受一个Person对象,并复制它的属性,然后你可以将其称为:

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

    希望澄清

  5. # 5 楼答案

    没什么难的

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