Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
1

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

14.02.2017, 09:44. Просмотров 282. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2017, 09:44
Ответы с готовыми решениями:

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

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

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

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

Доступ к полям private final из класса в класс
Здравствуйте! Подскажите пожалуйста, можно ли осуществить доступ к закрытому...

6
korvin_
2235 / 1734 / 328
Регистрация: 28.04.2012
Сообщений: 6,143
14.02.2017, 10:32 2
Цитата Сообщение от FacelessShadow Посмотреть сообщение
Для чего делать класс наследуемым, если его члены помечены как private?
А своих методов у этого класса нет?

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

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

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Не очень понимаю смысл такого наследования, если честно.
А какого понимаешь?
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
14.02.2017, 13:37  [ТС] 5
Цитата Сообщение от 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
korvin_
2235 / 1734 / 328
Регистрация: 28.04.2012
Сообщений: 6,143
14.02.2017, 14:09 6
Цитата Сообщение от FacelessShadow Посмотреть сообщение
А какой смысл в том, если я не могу получить значение через <имя класса>.<поле>?
https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)
https://en.wikipedia.org/wiki/Open/closed_principle
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
14.02.2017, 14:22  [ТС] 7
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
14.02.2017, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2017, 14:22

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

Приведение родительского класса к дочернему?
Здравствуйте. Прошу помочь. Вопрос в заголовке темы. Есть 3 класса: ...

Доступ к private-данным одного класса из другого
Как получить доступ к private данных одного класса в другом? В принципе нельзя....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru