Почему мое значение равно нулю при вызове метода суперкласса из подкласса? - PullRequest
0 голосов
/ 18 октября 2019

Я работаю с Java и Android Studio IDE. Я пытаюсь вызвать метод в родительском классе из его подкласса. Я написал небольшую процедуру тестирования, но получаю только нулевой результат.

В моем основном проекте у меня есть родительские и дочерние объекты / классы, и я хотел бы получить значение из родительского объекта / класса, вызываемого из подкласса / объекта. (Объект Дома состоит из Объектов стены, и мой Объект стены пытается получить «Тип стены», указанный в классе Дома. Но ниже приведен небольшой пример того, с чем я работаю.

Я пытался найтиэта проблема, но чтение кода других людей много раз только делает эту проблему более запутанной для меня. Я, должно быть, неправильно понимаю, как это должно работать.

Я пытался переписать, как я получаю данные, либоВызов затем super.getMethod () или Переопределение метода Родителя. Я также играл с моими переменными / методами, являющимися публичными / частными и защищенными, но ничего не достиг.

Мой Родительский Класс:

public class Parent {
    protected String myName;
    protected Child parentsChild;

    public Parent() {}

    public Parent (String myName, Child parentsChild) {
        this.myName = myName;
        this.parentsChild = parentsChild;
    }

    public String getMyName() {
        return this.myName;
    }

    public void setMyName(String myName) {
        this.myName = myName;
    }

    public Child getParentsChild() {
        return this.parentsChild;
    }

    public void setParentsChild(Child parentsChild) {
        this.parentsChild = parentsChild;
    }
}

Мой дочерний класс:

public class Child extends Parent {
    String childName;

    public Child() {

    }

    public Child(String childName) {
        this.childName = childName;
    }

    public String getChildName() {
        return childName;
    }

    public void setChildName(String childName) {
        this.childName = childName;
    }

    public String getParentName() {
        return super.getMyName();
    }

    @Override
    public String getMyName() {
        return super.getMyName();
    }
}

My MainActivity:


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        Child child = new Child("Logan");

        Parent parent = new Parent("Karrie", child);

        System.out.println("Parent: My name is " + parent.getMyName());
        System.out.println("Child: My parent's name is " + child.getParentName());
        System.out.println("@Override-> Child: My Parent's name is " + child.getMyName());
    }
}

Я надеюсь получить имя Родителя в том виде, в котором оно было передано при создании класса Parent с помощью «Karrie». Я получаю только «ноль». Какой бедный ребенок!: - (

Вот мой журнал:

2019-10-17 20:25:36.594 27040-27040/com.example.android.superclassinheritancetesting I/System.out: Parent: My name is Karrie
2019-10-17 20:25:36.594 27040-27040/com.example.android.superclassinheritancetesting I/System.out: Child: My parent's name is null
2019-10-17 20:25:36.594 27040-27040/com.example.android.superclassinheritancetesting I/System.out: @Override-> Child: My Parent's name is null

Спасибо за любую помощь!:]

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Как указано в комментариях, в этом случае наследование может быть неправильным подходом.

Вы можете определить один класс Node для моделирования отношений.

class Node {

  String name;
  Node parent;

  public Node(String name) {
    this.name = name;
  }

  public Node(String name, Node parent) {
    this.name = name;
    this.parent = parent;
  }

  public String getParentName() {
    return this.parent != null ? this.parent.name : null;
  }

}

Тогда в вашем коде клиента:

Node parent = new Node("ParentName");
Node child = new Node("ChildName", parent)
System.out.println(child.getParentName());
1 голос
/ 18 октября 2019

Это происходит из-за того, как вы добавляете дочерние значения в parent.

Вам необходимо передать эти значения через конструктор дочернего класса. Я предлагаю вам создать другую конструкцию в Parent , где вы можете получить только атрибут myName , а в Child классе вы передаете myName (parentName) в Parent, используя super, напримервы используете в своих методах get. Можно сделать следующее:

Добавить (или изменить) новую конструкцию в Parent :

public Parent (String myName) {
   this.myName = myName;
}

И в Child :

public Child(String childName, String parentName) {
    super(parentName)
    this.childName = childName;
}

А в методе onCreate вам просто нужно создать дочерний экземпляр, например:

Child child = new Child("Logan", "Karrie"); 

Таким образом, родительский класс не должен знать исодержит переменную класса Child.

0 голосов
/ 18 октября 2019

Как уже говорили другие, использование наследования здесь, вероятно, не является правильным способом реализации желаемой функциональности. Ссылка на Java-учебники определенно поможет вам понять наследование и отличить его от состава или агрегации. Ваш пример использует оба в одно и то же время, что затрудняет понимание концепций как новичка. Если вы все еще заинтересованы в иерархических отношениях (родитель / потомок, а не супер / подкласс), взгляните на этот интерфейс и его реализации из JDK. Существуют методы для получения родительских и дочерних объектов в иерархии. https://docs.oracle.com/javase/8/docs/api/javax/swing/tree/TreeNode.html

...