Кодирование внутреннего класса с помощью Point в качестве внешнего класса - PullRequest
1 голос
/ 14 ноября 2011

Для задания мне нужно создать класс внутри класса Point из java.awt.Point. Мне нужно иметь возможность использовать точечные методы при создании собственных переменных для внутреннего / вложенного класса. Меня немного смущают различия между статическими вложенными классами и внутренними классами, и я не знаю, какой из них использовать. Я попытался использовать статический вложенный класс и обнаружил ошибку, в которой говорится, что «модификатор static не разрешен здесь»

Моя ошибочная попытка:

class Point {
    static class RobotJAW {

        int goldcollected, x, y;

        RobotJAW() {
            goldcollected = 0;
            alive = true;
            x = 0;
            y = 0;
        }

    }
}

Смысл создания этого класса в том, чтобы робот поискал поле золота и бомб и собирал золото, будучи уничтоженным бомбами. Я могу использовать только классы Point и Scanner из Java API. Мне нужно использовать точечные методы equals (obj), move (int x, int y), getLocation () и setLocation (int x, int y). Но мне нужно добавить goldcollected и живые переменные. Кроме того, это задание для школы, поэтому я хотел бы получить больше знаний по этому предмету и получить некоторые рекомендации, не предоставляя кому-либо еще работу.

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Для задания мне нужно создать класс внутри класса Point из java.awt.Point.

Вы можете создать класс внутри класса, только если у вас есть исходный код для внешнего класса и вы можете перекомпилировать его. Вы не можете сделать это для java.awt.Point.

Если вы думаете, что ваше задание говорит , что вы делаете это, вы вероятно неверно истолковываете то, что говорит ваше назначение.

Конечно, не имеет смысла создавать вложенный класс внутри Point. AFAIK, нет ничего (разумного), что мог бы сделать класс, вложенный в Point, что не может сделать не вложенный класс. Возможно, задание просит вас extend класс Point; т.е. создать подкласс, а не вложенный класс.


(На самом деле теоретически это возможно сделать, но не с помощью чистой Java; например,

  • Вы можете скачать исходный код OpenJDK, добавить свой вложенный класс в java.awt.Point и перестроить. Но в итоге вы НЕ ЯВЫ.

  • Вы можете использовать магию байт-кода для создания файла классов для вложенного класса. Если вы правильно поняли, он был бы загружаемым, и (я думаю) он мог бы получить доступ к закрытым методам и атрибутам внешнего класса. Но это не чистая Ява.

Оба подхода - абсолютно плохие идеи, и это почти наверняка не то, что от вас ожидает ваше задание.)

0 голосов
/ 14 ноября 2011

Урок о том, как работают внутренние классы, затем некоторые сомневаются, что это то, что вам действительно нужно. Внутренний класс используется для описания класса с чрезвычайно сильным отношением принадлежности к другому классу. Факт настолько сильный, что он не может выжить без внешнего класса. Настолько сильный, что тебе это редко нужно. Внутренний класс доступен только через экземпляр внешнего класса:

public class A{
  public int value1;
  public class B{
    public int value2;
  }
}
...
A a1 = new A()
a1.value1 = 202
A.B b1 = new a1.B();
System.out.println(b1.value1); //Prints 202
A.B b2 = new B(); //Compiler error! Not allowed

Статический внутренний класс на самом деле не является внутренним классом. Это просто класс, который определен внутри внутреннего класса.

Мне кажется, что вы хотите, чтобы RobotJaw либо был точкой , либо имел точку . Вы не хотите, чтобы это был объект, недостижимо содержащийся в точке. Так что либо пусть RobotJaw расширяет точку, либо содержит точку.

...