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

Члены родительского класса private

14.02.2017, 09:44. Показов 993. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый!

Помогите разобраться. Есть вот такой код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class TestClass {
     private int first;
     private int second;
 
    TestClass(int a, int b) {
        this.first = a;
        this.second = b;
    }
}
 
public class Test extends TestClass {
    private int third;
 
    Test(int a, int b, int c) {
        super(a,b);
        this.third = c;
    }
}
 
public class Main {
    public static void main(String[] args) {
        TestClass first = new TestClass(5,10);
 
        Test second = new Test(19,20,41);
 
        second.first = 15; // так нельзя, ибо first в классе-родителе помечен, как private
    }
}
Вопрос простой. Для чего делать класс наследуемым, если его члены помечены как private? Ведь класс-потомок все равно не сможет ими оперировать. Может я что-то упускаю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2017, 09:44
Ответы с готовыми решениями:

Как вызвать метод вложенного класса в методе родительского класса
Имеется родительский класс для прорисовки графики Jogj package objects; import com.jogamp.opengl.GL2; import...

Не доступен метод из родительского класса
Есть классы, оин не несут никакого смысла, просто тестирую: public class employee { public static String name; public...

Конструктор родительского класса с аргументом
abstract class Animal { private String name; public String getName() { return name; } public Animal (String...

6
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
14.02.2017, 10:32
Цитата Сообщение от FacelessShadow Посмотреть сообщение
Для чего делать класс наследуемым, если его члены помечены как private?
А своих методов у этого класса нет?

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Ведь класс-потомок все равно не сможет ими оперировать.
И правильно, что не может.
0
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
14.02.2017, 10:57  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
А своих методов у этого класса нет?
У родителя? Это намек на использование какого-нибудь сеттера или геттера?
Не очень понимаю смысл такого наследования, если честно.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
14.02.2017, 11:01
Цитата Сообщение от FacelessShadow Посмотреть сообщение
У родителя?
Ну да.

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Это намек на использование какого-нибудь сеттера или геттера?
Нет, это вопрос про наличие методов.

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Не очень понимаю смысл такого наследования, если честно.
А какого понимаешь?
0
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
14.02.2017, 13:37  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет, это вопрос про наличие методов.
В данном конкретном случае методов нет.

Цитата Сообщение от korvin_ Посмотреть сообщение
А какого понимаешь?
Ну на крайний случай получить и изменять значения через геттеры и сеттеры.
А какой смысл в том, если я не могу получить значение через <имя класса>.<поле>?
Я прошу не пинать меня сильно. Я в самом начале ООП и некоторые вопросы могут смешно выглядеть.

Добавлено через 28 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Line {
    public int x1, x2, y1, y2;
    public float length;
 
    Line(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        calcLength();
    }
 
    public void calcLength() {
        length = (float) Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        Line line = new Line(2,4,3,7);
        System.out.println("Length = " + line.length); // длина для координат
        line.x1 = 3; // меняем координату
        System.out.println("Length = " + line.length); // длина не меняется
    }
}
В данном случае, если мы поменяем координату, длина не поменяется, потому что длина вычисляется в конструкторе.
Если мы сделаем переменные типа private, а для каждой координаты установим свой сеттер с методом расчета длины, получим актуальную длину отрезка при каждом изменении координаты.
Все верно?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
14.02.2017, 14:09
Цитата Сообщение от FacelessShadow Посмотреть сообщение
А какой смысл в том, если я не могу получить значение через <имя класса>.<поле>?
https://en.wikipedia.org/wiki/... rogramming)
https://en.wikipedia.org/wiki/... _principle
0
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
14.02.2017, 14:22  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class Line {
    private int x1, x2, y1, y2;
    private float length;
 
    Line(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        calcLength();
    }
 
    public void calcLength() {
        length = (float) Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
    }
 
    public float getLength() {
        return length;
    }
 
    public int getX1() {
        return x1;
    }
 
    public int getY1() {
        return y1;
    }
 
    public int getX2() {
        return x2;
    }
 
    public int getY2() {
        return y2;
    }
 
    public void setX1(int x1) {
        this.x1 = x1;
        calcLength();
    }
 
    public void setY1(int y1) {
        this.y1 = y1;
        calcLength();
    }
 
    public void setX2(int x2) {
        this.x2 = x2;
        calcLength();
    }
 
    public void setY2(int y2) {
        this.y2 = y2;
        calcLength();
    }
}
 
public class printableLine extends Line {
    printableLine(int x1, int y1, int x2, int y2) {
        super(x1,y1,x2,y2);
        print();
    }
 
    public void print() {
        System.out.println("Point 1 ("+this.getX1()+", "+this.getY1()+")");
        System.out.println("Point 2 ("+this.getX2()+", "+this.getY2()+")");
    }
}
 
    public static void main(String[] args) {
        Line line = new Line(2,4,3,7);
        System.out.println("Length - " + line.getLength());
        line.setX2(13);
        line.setX2(10);
        System.out.println("Length - " + line.getLength());
 
        printableLine prLine = new printableLine(5,3,2,1);
        System.out.println("Length - " + prLine.getLength());
 
        prLine.setX1(10);
        prLine.setY1(15);
        prLine.print();
        System.out.println("Length - " + prLine.getLength());
    }
}
Получается вот такая вещь.

Если бы поля класса Line были помечены как public, мы могли бы из любого класса поменять координату, при этом длина осталась прежней, что не есть хорошо.
Пометка полей как protected дала бы защиту от всех, кроме потомков. Опять же, прямой доступ к полям.
А вот пометка полей как private дает нам уверенность в том, что поля не будут изменены без актуализации длины, которая вызывается методом через сеттер.
Правильно мыслю?
За ссылки спасибо, на досуге почитаю

Добавлено через 13 секунд
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class Line {
    private int x1, x2, y1, y2;
    private float length;
 
    Line(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
        calcLength();
    }
 
    public void calcLength() {
        length = (float) Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
    }
 
    public float getLength() {
        return length;
    }
 
    public int getX1() {
        return x1;
    }
 
    public int getY1() {
        return y1;
    }
 
    public int getX2() {
        return x2;
    }
 
    public int getY2() {
        return y2;
    }
 
    public void setX1(int x1) {
        this.x1 = x1;
        calcLength();
    }
 
    public void setY1(int y1) {
        this.y1 = y1;
        calcLength();
    }
 
    public void setX2(int x2) {
        this.x2 = x2;
        calcLength();
    }
 
    public void setY2(int y2) {
        this.y2 = y2;
        calcLength();
    }
}
 
public class printableLine extends Line {
    printableLine(int x1, int y1, int x2, int y2) {
        super(x1,y1,x2,y2);
        print();
    }
 
    public void print() {
        System.out.println("Point 1 ("+this.getX1()+", "+this.getY1()+")");
        System.out.println("Point 2 ("+this.getX2()+", "+this.getY2()+")");
    }
}
 
    public static void main(String[] args) {
        Line line = new Line(2,4,3,7);
        System.out.println("Length - " + line.getLength());
        line.setX2(13);
        line.setX2(10);
        System.out.println("Length - " + line.getLength());
 
        printableLine prLine = new printableLine(5,3,2,1);
        System.out.println("Length - " + prLine.getLength());
 
        prLine.setX1(10);
        prLine.setY1(15);
        prLine.print();
        System.out.println("Length - " + prLine.getLength());
    }
}
Получается вот такая вещь.

Если бы поля класса Line были помечены как public, мы могли бы из любого класса поменять координату, при этом длина осталась прежней, что не есть хорошо.
Пометка полей как protected дала бы защиту от всех, кроме потомков. Опять же, прямой доступ к полям.
А вот пометка полей как private дает нам уверенность в том, что поля не будут изменены без актуализации длины, которая вызывается методом через сеттер.
Правильно мыслю?
За ссылки спасибо, на досуге почитаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2017, 14:22
Помогаю со студенческими работами здесь

Получить доступ к private полям из inner класса
В документации и книгах написано что можно получить доступ к полям внешнего класса из inner класса таким образом class OuterClass { ...

Доступ к полям private final из класса в класс
Здравствуйте! Подскажите пожалуйста, можно ли осуществить доступ к закрытому полю объекта класса &quot;B&quot; когда доступ к этому...

Разработка родительского, дочернего и главного класса в BlueJ
Народ, выручайте. Прочитал методичку по этой теме, но не могу понять, как сделать это. задание следующее: Разработайте в BlueJ...

Вызов одноименных функций классов наследников из родительского класса
Как вызвать функцию классов наследников из родительского класса. Нужно что бы было универсальное решение, если мы захотим создать еще...

Приведение родительского класса к дочернему?
Здравствуйте. Прошу помочь. Вопрос в заголовке темы. Есть 3 класса: public class A { public String str() { ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru