Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема с созданием метода


Автор: FrenchCheese 19.11.2010, 13:20
Только начал изучение Java, столкнулся с проблемой...
Код

class vector {
    double x;
    double y;
    double z;
}

вот есть такой простенький класс и мне надо написать к нему методы

начал с тестов попроще..
почему такой код не работает?

Код

class Test {
    class digit {
     int a;
     
     int add (digit x, digit y) {
         return (x.a + y.a);
     }
    }

    
    
    public static void main(String[] args) {

     digit a = new digit();
     digit b = new digit();
     a.a = 1;
     b.a = 2;
     System.out.println(add(a,b));
     
    }

}

Автор: Nofate 19.11.2010, 13:51
Много почему.

Например, строка 18. Вызывается метод add без указания экземпляра класса. 
Кроме того надо бы членам класса digit (а лучше переименовать его в Digit)  установить спецификаторы доступа.

Автор: FrenchCheese 19.11.2010, 13:55
Цитата(Nofate @ 19.11.2010,  13:51)
Например, строка 18. Вызывается метод add без указания экземпляра класса. 

это как?

и для чего добавлять спецификаторы доступа? зачем они здесь?

Автор: Nofate 19.11.2010, 15:09
вы вызываете add(a, b). Как компилятор догадается в каком классе искать этот метод?


Автор: FrenchCheese 19.11.2010, 15:13
Цитата(Nofate @ 19.11.2010,  15:09)
вы вызываете add(a, b). Как компилятор догадается в каком классе искать этот метод?

ага, мысль понял, но запутался...
как таки ему дать понять где искать?
что загуглить? что прочитать?

Автор: Nofate 19.11.2010, 15:46
У вас есть класс digit. В общем случае вы можете обращаться к методам класса через экземпляры данного класса.

Экземплярами класса digit в вашем примере будут как раз a и b. 

То есть вы можете написать:
Код

a.add(a, b);


Но тогда получается масло масляное. Ведь из метода add мы итак можем обратиться к значению члена a. Так что один параметр можно будет из метода add убрать, немного изменив его тело.

Вобщем почитайте самые основы. Что такое классы и как именно они работают. И про ключевое слово this заодно. Почитать можно например http://www.intuit.ru/department/pl/javapl/2/3.html

Автор: FrenchCheese 19.11.2010, 15:49
Цитата(Nofate @ 19.11.2010,  15:46)
У вас есть класс digit. В общем случае вы можете обращаться к методам класса через экземпляры данного класса.

Экземплярами класса digit в вашем примере будут как раз a и b. 

То есть вы можете написать:
Код

a.add(a, b);


Но тогда получается масло масляное. Ведь из метода add мы итак можем обратиться к значению члена a. Так что один параметр можно будет из метода add убрать, немного изменив его тело.

Вобщем почитайте самые основы. Что такое классы и как именно они работают. И про ключевое слово this заодно. Почитать можно например http://www.intuit.ru/department/pl/javapl/2/3.html

огромное спасибо!

Автор: duk 19.11.2010, 17:53
Что-то похожее, на Ваш код:
Код

class Test {
    static class Digit {
     int a;
     
     int add (Digit x, Digit y) {
         return (x.a + y.a);
     }
    }
    
    
    public static void main(String[] args) {
     Test.Digit a = new Digit();
     Test.Digit b = new Digit();
     a.a = 1;
     b.a = 2;
     System.out.println(a.add(a,b));
     
    }
}

Автор: Nofate 19.11.2010, 21:10
@duk
Ну вот, все испортили. А человек уже почти сам разобрался )

Автор: nc30 20.11.2010, 10:14
FrenchCheese,
IMHO, Nofate, указал вам правильное направление.  От себя добавлю пару слов.
Не стоит без знания самых основ пытаться создавать свои примеры. Иначе с самого начала вы научитесь неправильно мыслить и плохо излагать свои идеи в коде. Переучиваться будет гораздо сложнее + потеряете время.

Из хороших книг для обучения могу порекомендовать классический труд Кея Хорстманна и Гари Корнелла "Java 2. Том 1. Основы." (8-е издание). Для себя я охарактеризовал ее, как "продвинутый букварь". Кто-то рекомендует книгу Шилдта "Java. Руководство для начинающих". Лично я считаю, что лучше Хорстманн, т. к. Шилдт менее внятен и не так живо и полно излагает материал. После книги Шилдта я читал Хорстманна с гораздо большим удовольствием и пользой.

Также считаю, что приведенный вами пример лучше оставить в покое (без попыток какой-либо модернизации): неоправданное использование вложенных классов, отсутствие какой-либо системы доступа к данным, нарушение уровней взаимодействия объектов (экземпляр класса (== объект) Digit не должен иметь возможности производить операцию сложения объектов Digit: это функциональность более высокого уровня) и т. п. Слишком много потребуется исправлений - это будет уже другой код smile

Резюмируя: лучше начать с основ и начать правильно.

Удачи  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)