2014-01-02 1 views
-1

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

Главный класс.

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import java.lang.*; 
public class Main extends Applet{ 

    public int[] a = {2}; 
    public int[] b = new int[1]; 

    public void init(){ 
    b[0] = 4; 
    Otherclass s = new Otherclass(); 
    } 
} 

Это Другой класс.

import java.util.*; 
import java.lang.*; 
public class Otherclass extends Main{ 

    public Otherclass(){ 
    System.out.println(super.a[0]); 
    System.out.println(super.b[0]); 
    } 
} 

Ожидаемый результат:

2 
4 

Фактический выход:

2 
0 

Что я делаю неправильно?

Спасибо заранее, Михей

+0

Нет никакого смысла, чтобы родительский класс удерживал переменные дочерними классами. На самом деле это на грани безумия. Почему у вас это есть? –

+3

@everybody: это апплет, 'init()' вызывается браузером. Тем не менее, это полное непонимание того, как работает наследование. – moonwave99

+0

@ moonwtave99: amen. Снова код просто сумасшедший. –

ответ

2

Когда вы создали экземпляр класса Otherclass, это экземпляр diffrentent для вашего основного экземпляра. Таким образом, b [0] = 4 в основном экземпляре, но не инициализируется в экземпляре Otherclass.

Вы видите одно и то же значение [0], потому что оно инициализируется классом.

+0

Кроме того, вам не нужен префикс 'super.' – NickJ

+0

Хорошо, это имеет смысл. Тогда возникает вопрос, каким образом я могу получить доступ к массиву, который фактически находится в основном классе, а не в том, который был инициализирован в экземпляре OtherClass? Потому что массив в основном классе должен постоянно меняться! –

+0

Вы получаете доступ к массиву в основном классе. 'Otherclass' не имеет собственных массивов, он наследует их от' Main'. Но, если я правильно вас понимаю, вы хотите увидеть те же значения массивов из всех экземпляров 'Main' и' Otherclass', поэтому объявите их как 'static'. – NickJ

1

Вы используете b в конструкторе Otherclass - которые будут выполняться до запуска Applet получает выполнить init.

Если поставить это утверждение:

b[0] = 4; 

в конструктор Main, он будет выполнен перед конструктором тела Otherclass.

Обратите внимание, что ваша инициализация s в init бессмысленна.

0

Причина в том, что вы никогда не инициализировали этот массив в экземпляре только что созданного вами OtherClass. Когда экземпляр OtherClass создается, что фрагмент кода, который вы имеете в главном методе Init():

b[0] = 4; 

никогда не выполняется для OtherClass массива экземпляр б, который является совершенно другая переменная в памяти чем массив b, который существует для экземпляра Main класса. Вот почему вы не видите, что «4» в массиве

+0

Хорошо, это имеет смысл. Тогда возникает вопрос, каким образом я могу получить доступ к массиву, который фактически находится в основном классе, а не в том, который был инициализирован в экземпляре OtherClass? Потому что массив в основном классе должен постоянно меняться! –

+0

Если вам нужно поделиться этой информацией между обоими объектами, наследование не является ответом, потому что он умножает экземпляры массива b в каждом создаваемом вами объекте. Попробуйте создать композицию вместо этого - просто создайте метод getter для массива в Main class и получите доступ к нему через ссылку на объект или просто оставьте его статическим в основном классе. –

+0

Я добавил эти два геттера к главному событию: 'code' public int [] getArrA() {return a;} public int [] getArrB() {return b;}'/code' и изменил другой класс на 'code 'int [] aa = super.getArrA(); int [] bb = super.getArrB(); System.out.println (аа [0]); System.out.println (бб [0]); '/ code', и это все еще не сработало! Тот же выход! –

Смежные вопросы