Итак, у меня есть подкласс, который наследуется от другого класса. Я хочу создать объект подкласса Test и передать его свойства другому классу под названием Engine (объяснено ниже).
package comulap;
public class Test extends Comulap {
public String fudge = "fudge";
public static void main(String[] args){
Test c = new Test();
}
}
Это суперкласс Comulap
package comulap;
import comulap.core.Engine;
public class Comulap {
public String fudge;
Engine engine;
public Comulap(){
engine=new Engine(this);
}
}
И это класс движка, в котором я хочу использовать методы и атрибуты Test:
package comulap.core;
import comulap.Comulap;
public class Engine {
Comulap comulap;
public Engine(Comulap c){
comulap=c;
System.out.println(comulap.fudge);
}
}
Однако, когда я запускаю это, объект движка считает, что fudge имеет значение null, как будто передается только обычный объект Comulap, а не класс Test. Как передать класс Test в обычном конструкторе класса Comulap, а не только в стандартный класс Comulap?
Переменные не являются полиморфными, и вместо этого вы захотите не скрывать переменную fudge, как вы это делаете, а вместо этого устанавливать и получать ее через сеттеры и геттеры.
Я только что осознал эту ошибку, исправил ее, назначив fudge в конструкторе теста, однако это все равно возвращает null в объекте движка.
Вы 1) избавились от повторного объявления переменной в Test? 2) Используете ли вы для доступа к нему геттеры и сеттеры? 3) Правильно ли вы его назначаете в конструкторе? В супер конструкторе тоже?
Кроме того, вы пытаетесь получить доступ к fudge String в конструкторе Engine, который вызывается в конструкторе Comulap - поэтому вы пытаетесь оценить состояние объекта Comulap до, который был полностью построен, что вам следует сделать никогда.
Вы определяете новую, другую переменную-член
fudge
вTest
. Вместо этого установитеfudge
в конструктореTest
и не определяйте его (снова).