Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пакеты и наследование 
V
    Опции темы
Christoph
Дата 29.12.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Вопрос достаточно просто, только изучаю Java 
Создаю 2 пакета 

Код

package p1;

public class BLoj {
    protected int i;
    public static void main(String args[])
    {
        System.out.println("Hello");
    }

}


Код

package p2;

public class BLoj extends p1.BLoj {
    public static void main(String args[])
    {
        p1.BLoj ob1=new p1.BLoj();
        ob1.i=50;
        System.out.println("Heo"+ob1.i);
    }

}


в пакете р1 есть поле protected, и я получить к ней доступ из другого пакета при условии что, класс другого пакета будет подклассом, верно? мне пишет компилятор что переменнная i не видна в пакете p2. Или может что то я не так понял, спасибо!


--------------------
user posted image
PM MAIL ICQ   Вверх
jk1
Дата 29.12.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Помните, что наследование в Java добавляет в класс-наследник все не-private члены класса-предка, кроме конструкторов. Правильное обращение в таком случае будет выглядеть как
Код

i=50;

Но даже в этом случае ваш код не скомпилируется: вы обращаетесь из статического метода (это метод класса) к переменной объекта (непонятно какого и есть ли он вообще). Чтобы объявить переменную класса, используйте модификатор static


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
LSD
Дата 29.12.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Это сделано специально, вот немного модифицированный второй класс:
Код

package p2;

public class BLoj extends p1.BLoj
{
  public void foo(BLoj p2BLoj, p1.BLoj p1BLoj)
  {
    this.i = 0;
    p2BLoj.i = 0;
    p1BLoj.i = 0;
  }
}

Как видишь первый два присваивания к this и p2BLoj проходят, а к p1BLoj - нет. И так сделано чтобы избежать следующей ситуации: есть базовый класс A с protected переменной i, от него наследуется класс B, который использует переменную i, при этом произвольно менять значение переменной i нельзя, чтобы не испортить данные. А теперь мы создаем класс Z, который наследуется от A, определим в нем подобный метод и передадим туда экземпляр класса B. Если бы доступ был, то можно было бы произвольно изменить переменную i и нарушить целостность B.


Теперь по поводу пакаджей, дело в том что protected переменная так же доступна и внутри пакаджа (это сделано, чтобы упорядочить модификаторы по строгости, и умолчальный модификатор был более строгим чем protected). И если оба класса находятся в одном пакадже, то доступ идет как package private переменной.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Samotnik
Дата 29.12.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Christoph, ты можешь к ней (переменной i) обратиться через this и  не из статического метода
PM MAIL   Вверх
Christoph
Дата 29.12.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Код

package p2;

public class BLoj extends p1.BLoj {
    public static void main(String args[])
    {
            System.out.println("Heo");
         }

    public void foo()
    {
        i=50;
        System.out.println("foo");
    }
    
}


Теперь вот так будет правильно? получается что из статического метода можно вызывать только статические переменные, и методы, вы уж простите, но я вот хотел узнать что, для чего нужны статические методы, чтоб можно было вызывать без объекта? - это получается что это обычная функция? или же статическая переменная- как по мне это просто глобальная переменная которая доступна во всех подклассах.Может быть статические методы используются для чего то другого, спасибо


--------------------
user posted image
PM MAIL ICQ   Вверх
jk1
Дата 29.12.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Вот цитата "из первых рук" и пример:
Цитата

When a number of objects are created from the same class blueprint, they each have their own distinct copies of instance variables. In the case of the Bicycle class, the instance variables are cadence, gear, and speed. Each Bicycle object has its own values for these variables, stored in different memory locations.
Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.

For example, suppose you want to create a number of Bicycle objects and assign each a serial number, beginning with 1 for the first object. This ID number is unique to each object and is therefore an instance variable. At the same time, you need a field to keep track of how many Bicycle objects have been created so that you know what ID to assign to the next one. Such a field is not related to any individual object, but to the class as a whole. For this you need a class variable, numberOfBicycles, as follows:

Код

public class Bicycle{
    
    private int cadence;
    private int gear;
    private int speed;
    
    // add an instance variable for the object ID
    private int id;
    
    // add a class variable for the number of Bicycle objects instantiated
    private static int numberOfBicycles = 0;
    ......
}

подробнее читайте тут или тут

Это сообщение отредактировал(а) jk1 - 29.12.2009, 18:15


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
MaxPayneC
Дата 29.12.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Статические методы вызываются у класса, нестатические (также называемые instance-методы) - у экземпляра класса. Это нужно для того, что не всегда действия выполняются с сущностью, а иногда с классом этой сущности.

Из статических методов доступны только статические переменные класса, но обратное неверно - из инстанс-методов доступны и инстанс-переменные, и статические переменные.
PM   Вверх
Christoph
Дата 29.12.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Спасибо за информацию буду читать


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 29.12.2009, 20:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Раз уж вы во всем разобрались, то объясните мне при чем тут статические переменные (я говорю про первый пример)?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Christoph
Дата 29.12.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



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


--------------------
user posted image
PM MAIL ICQ   Вверх
jk1
Дата 29.12.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

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

Это не так, читайте внимательнее приведенные статьи. Из методов класса (статика) можно вызывать методы объекта (не статика), но для этого объект должен существовать. Вот пример:
Код

// статика
 public static void main(String[] arguments){
      // создали объект
       JFrame frame = new JFrame();
      // и работаем с методами объекта
      frame.setVisible(true);
    }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Christoph
Дата 29.12.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Код

package p1;

public class BLoj {
    protected int i;

    protected void f1()
    {
        System.out.println("Heollllllll");
    }
    

                           }

package p2;

public class BLoj extends p1.BLoj {
    public static void main(String args[])
    {
        p1.BLoj ob1=new p1.BLoj();
        ob1.f1();
    }


Ну вот существует реальный объект, но вызвать не могу smile




--------------------
user posted image
PM MAIL ICQ   Вверх
jk1
Дата 30.12.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Унаследованный protected-метод будет доступен как метод объекта вызывающего класса:
Код

package p1;
public class BLoj {
    protected int i;
    protected void f1()
    {
        System.out.println("Heollllllll");
    }
    
                           }
package p2;
public class BLoj extends p1.BLoj {
    public static void main(String args[])
    {
        p2.BLoj ob1=new p2.BLoj();
        ob1.f1();
    }


Это сообщение отредактировал(а) jk1 - 30.12.2009, 09:06


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
LSD
Дата 30.12.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Может уже пора внимательно посмотреть на первый пример, попробовать его скомпилировать и внимательно прочитать сообщение об ошибке? smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Christoph
Дата 30.12.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Цитата(LSD @  29.12.2009,  15:43 Найти цитируемый пост)
Как видишь первый два присваивания к this и p2BLoj проходят, а к p1BLoj - нет. И так сделано чтобы избежать следующей ситуации: есть базовый класс A с protected переменной i, от него наследуется класс B, который использует переменную i, при этом произвольно менять значение переменной i нельзя, чтобы не испортить данные. А теперь мы создаем класс Z, который наследуется от A, определим в нем подобный метод и передадим туда экземпляр класса B. Если бы доступ был, то можно было бы произвольно изменить переменную i и нарушить целостность B.


немного не улавливаю смысл, если я в классе В изменю значение i то что получится? что эта переменная измениться в классе А, и изменится во всех подклассах? И что будет если я изменю переменную i в классе В? И почему я не могу изменить Z классе, через объект В изменить перемееную? простите
Или же имелось ввиду что только класс В может менять protected перемееную, и никто больше......?

Это сообщение отредактировал(а) Christoph - 30.12.2009, 17:42


--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2722 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.