Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
1

Наследование и модификатор доступа protected

28.10.2019, 10:15. Показов 1363. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте всем. У меня есть 3 класса, которые каждый наследуется друг от друга, но третий лежит в другом пакете.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
package java_0;
 
public class Animal {
    protected int weight;
 
    public int getWeight() {
        return weight;
    }
 
    public void setWeight(int weight) {
        this.weight = weight;
    }
}
Java
1
2
3
4
package java_0;
 
public class Bird extends Animal {
}
Java
1
2
3
4
5
6
7
8
9
10
package java_core;
 
import java_0.Bird;
 
public class Parrot extends Bird {
    public static void main(String[] args) {
        Bird bird = new Bird();
//        bird.weight = 10; не работает?
    }
}
Вопрос такой у меня поле weight в классе Animal protected, разве это не должно значить что оно доступно мне и в других классах наследников в других пакетах? Или это значит только что если я внутри наследника с ним что-то делаю то все хорошо, а если хочу создать экземпляр наследника в другом пакете то сразу все становится недоступно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2019, 10:15
Ответы с готовыми решениями:

Модификатор доступа protected. Не понятен смысл
Модификатор доступа protected используется тогда, когда мы хотим, чтобы элемент был виден за...

Модификатор доступа protected перед именем класса
Решил опробовать работу protected на классе. В одном пакете есть класс Main, у которого есть...

Модификатор доступа для конструктора
есть ли разница какой модификатор доступа применять к конструктору если сам класс объявлен как...

Для чего написано: protected String name; protected int age;?
package com.company; import java.io.Serializable; public class person implements Serializable {...

14
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
28.10.2019, 11:59 2
Цитата Сообщение от АнатолийШ Посмотреть сообщение
разве это не должно значить что оно доступно мне и в других классах наследников в других пакетах?
да, так оно и есть.

Java
1
2
[quote="АнатолийШ;13941382"]Bird bird = new Bird();
// * * * *bird.weight = 10; не работает?[/quote]
И не должно работать. Можно обращаться к полю только изнутри класса
weight = 10 будет работать, но это будет скорее всего не тот эффект который нужен
0
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
28.10.2019, 12:25  [ТС] 3
KEKCoGEN, но разве это не противоречит тому описанию самого модификатора.
Я класс наследник в другом пакете как в моем примере и я хочу использовать доступную мне переменную от класса наследника. Почему тогда я не могу этого сделать?Все равно до конца не могу сообразить.
Заучить понятно можно но хочется понимать этот момент. Можете помочь истолковать?

Добавлено через 20 минут
от класса родителя я имел ввиду , описался.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
28.10.2019, 15:05 4
АнатолийШ, смотри на эти переменные как будто они у тебя в классе объявленны и ты ни от кого не наследуешься. Тогда логично что к этим переменным изнутри класса ты можешь обращаться, а снаружи - нет
0
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
28.10.2019, 15:31  [ТС] 5
KEKCoGEN, подождите. Так в том то и дело что если я внутри класса объявил переменную private только так я не могу ее использовать во всех остальных случаях все норм. Или protected как бы становится private если я использую класс наследник в другом пакете?
0
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
28.10.2019, 15:34 6
АнатолийШ, если не лень, то прочитай. Если лень, то хотя бы глянь на табличку
0
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
28.10.2019, 15:41  [ТС] 7
Gungala, я все это читал. Просто сейчас при изучении повторно этих вопросов у меня в голове нормально не хочет складываться картина почему не компилируется код выше что я написал.
По идеи раз я класс наследник и наследую переменную то я должен мочь ее извлечь из своего класса и делать что захочу, а тут получается что нет. И вот как то странно для меня это все.
0
1021 / 561 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
28.10.2019, 16:15 8
Ну, очевидно, subsubclass не попадает под определение subclass

Добавлено через 6 минут
а, не, тут именно трабла в том, что ты в другом классе пытаешься её получить
0
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
28.10.2019, 16:24  [ТС] 9
Gungala, ну вот это я пока осознать и не могу, это неявно для меня
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
28.10.2019, 16:34 10
и не надо осознавать. На практике в 90% случаев все равно будет private и public. Вот когда потребуется тебе что-то наследовать и private не хватит, вспомнишь про protected.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12464 / 7487 / 1756
Регистрация: 25.07.2009
Сообщений: 13,771
29.10.2019, 00:05 11
АнатолийШ, если это как-то прояснит картину...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A {
    protected int n;
}
 
class B extends A {
    public B(int nVal) {
        n = nVal;
    }
 
    public int getN() {
        return n;
    }
}
 
public class TestProtected {
    public static void main(String[] args) {
        B b = new B(10);
        System.out.println(b.getN());
    }
}
Код
[andrew@easybook classes]$ javac TestProtected.java 
[andrew@easybook classes]$ java TestProtected
10
[andrew@easybook classes]$
0
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
29.10.2019, 14:23  [ТС] 12
easybudda, опять таки вот это понятно, потому что тут использован модификатор public. Скорее пока не понятно почему я напрямую к переменной в данном случае не могу обратиться хоть у меня и потомок.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12464 / 7487 / 1756
Регистрация: 25.07.2009
Сообщений: 13,771
29.10.2019, 14:31 13
Цитата Сообщение от АнатолийШ Посмотреть сообщение
Скорее пока не понятно почему я напрямую к переменной в данном случае не могу обратиться хоть у меня и потомок
Потому, что переменная не объявлена с модификатором public в родительском классе, а в потомке она вообще не объявлена.
(К.О. подсказал)
1
4 / 4 / 0
Регистрация: 26.06.2016
Сообщений: 115
29.10.2019, 14:44  [ТС] 14
easybudda, а теперь понятно. Т.е. она неявно присутствует и с ней работать можно, но если с ней работать уже не внутри класса , в где то в другом пакете, то тут уже нельзя, т.к. явно её нету. Понял. Спасибо
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12464 / 7487 / 1756
Регистрация: 25.07.2009
Сообщений: 13,771
29.10.2019, 14:56 15
АнатолийШ, ну, можно и так сказать.

Не по теме:

"His name is Robert Paulson! (c)"

0
29.10.2019, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2019, 14:56
Помогаю со студенческими работами здесь

Модификатор доступа protected
Здравствуйте!!! Возник такой вопрос: на сайте MSDN написано, что к типу или элементу с...

Модификатор protected internal
Правильно ли я понимаю, что модификатор protected internal позволяет: получать доступ к членам в...

Private/protected/public наследование
Есть такой код: class Base { public: int publicX; protected: int protectedX; private:

Модификатор доступа private
Добрый день, Я считал, что поле класса объявленное с модификатором private доступно только в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru