44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
1

Почему здесь ошибка доступа?

08.02.2014, 23:26. Показов 1012. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой код:
Java
1
2
3
4
package base;
public class Parent {
       protected void doSomething(){}
}
Java
1
2
3
4
5
6
7
8
9
package base.child;
import base.Parent;
public class child extends Parent {
    public static void main(String [] args){
        Parent parent = new child();
        parent.doSomething();//тут мне IDE гоаворит, что так нельзя
        new child().doSomething();// а так можно
    }
}
Cобственно вопрос почему
Java
1
parent.doSomething()
нельзя, а
Java
1
new child().doSomething();
можно.

Почему тип ссылки влияет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2014, 23:26
Ответы с готовыми решениями:

Почему здесь ошибка?
Сдавал экзамен по информатике, где была практическая задача. Условие особо не важно, вся суть в...

Flask голосовалака: почему здесь ошибка?
# coding: utf8 from flask import Flask, render_template, request import os app =...

Где здесь ошибка? Почему нельзя юзать константу
//ранее const b:array of char=('a','b','c','d','e','f'); // ранее case x of b:inc(a);...

Incompatible types: 'Integer' and 'TMsgDlgBtn' mbNo красный почему здесь ошибка
procedure TForm2.Button1Click(Sender: TObject); begin Res := MessageDlg('Бастайсыз ба?',...

15
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.02.2014, 23:28 2
потому что protected - он доступен только в классах наследниках
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
08.02.2014, 23:32  [ТС] 3
child же наследник
0
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
08.02.2014, 23:45 4
Цитата Сообщение от gredwhite Посмотреть сообщение
/тут мне IDE гоаворит, что так нельзя
выложите еще ошибку которую выдает среда
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
08.02.2014, 23:50  [ТС] 5
Цитата Сообщение от mutagen Посмотреть сообщение
потому что protected - он доступен только в классах наследниках
Java
1
2
3
4
5
6
7
package base;
public class Parent {
    protected void doSomething() {}
    public static void main(String[] args) {
           new Parent().doSomething();
    }
}
так можно

Добавлено через 50 секунд
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
выложите еще ошибку которую выдает среда
вот:
java: doSomething() has protected access in base.Parent
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
08.02.2014, 23:54 6
Цитата Сообщение от gredwhite Посмотреть сообщение
child же наследник
Но тип ссылки то-Parent. Это правило.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
08.02.2014, 23:55  [ТС] 7
Цитата Сообщение от RomanovD Посмотреть сообщение
Но тип ссылки то-Parent. Это правило.
можете его по русски сформулировать?
0
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
08.02.2014, 23:55 8
странно, но у меня код работает отлично, ни намека на ошибку
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
09.02.2014, 00:02 9
Цитата Сообщение от gredwhite Посмотреть сообщение
можете его по русски сформулировать?
Вот такое правило я запомнил:
Класс, который наследует, не может получить доступ к членам базового класса через ссылку типа базового класса, если они находятся в разных пакетах.

Java
1
2
Parent parent = new Parent();
        parent.doSomething();
Тоже не пройдет из child класса.

В 1ом сообщении parent - reference variable типа Parent, но указывает на класс Child.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
09.02.2014, 00:14  [ТС] 10
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
странно, но у меня код работает отлично, ни намека на ошибку
код с первого поста

Добавлено через 4 минуты
Цитата Сообщение от RomanovD Посмотреть сообщение
Вот такое правило я запомнил:
Класс, который наследует, не может получить доступ к членам базового класса через ссылку типа базового класса, если они находятся в разных пакетах.

Java
1
2
Parent parent = new Parent();
        parent.doSomething();
Тоже не пройдет из child класса.

В 1ом сообщении parent - reference variable типа Parent, но указывает на класс Child.
мммм, звучит как костыль.


Нет более общего правила?
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
09.02.2014, 00:28 11
Цитата Сообщение от gredwhite Посмотреть сообщение
код с первого поста

Добавлено через 4 минуты


мммм, звучит как костыль.


Нет более общего правила?
Вот что нашел в документации:
http://docs.oracle.com/javase/... ls-6.6.2.1
0
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
09.02.2014, 01:20 12
Цитата Сообщение от gredwhite Посмотреть сообщение
код с первого поста
с первого
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
09.02.2014, 01:34 13
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
с первого
Классы в разных пакетах и вызов метода через ссылку типа Parent?


Нашел такой ответ.
protected member can be accessed (through inheritance) by a subclass even if the subclass is in a different package
through inheritance
Что-то вроде доступа через добавление метода/поля в subclass. Поэтому нельзя получить доступ к protected членам через ссылку базового класса. Мы их не видим, но наследуем.

Я еще пока мало знаю, могу ошибаться.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
09.02.2014, 01:39  [ТС] 14
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
с первого
и классы в разных пакетах?

Добавлено через 3 минуты
Цитата Сообщение от RomanovD Посмотреть сообщение
Вот что нашел в документации:
http://docs.oracle.com/javase/... ls-6.6.2.1
Let C be the class in which a protected member is declared. Access is permitted only within the body of a subclass S of C.

In addition, if Id denotes an instance field or instance method, then:

If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.
Есть класс C у него protected field - id.
S - наследник

по Q.id можно обратиться только в том случае если Q это S или его подкласс


ну да, это я понял.

Но нафига так делать я не понимаю.
0
40 / 40 / 14
Регистрация: 26.12.2013
Сообщений: 309
09.02.2014, 02:06 15
Цитата Сообщение от RomanovD Посмотреть сообщение
Классы в разных пакетах и вызов метода через ссылку типа Parent?
вызов то через Parent, но все в одном пакете, а я разве забыл это сказать? забыл
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
09.02.2014, 14:16  [ТС] 16
Цитата Сообщение от IVIakCollideR Посмотреть сообщение
вызов то через Parent, но все в одном пакете, а я разве забыл это сказать? забыл
ну так а в моём первом посте разные пакеты!!!
0
09.02.2014, 14:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2014, 14:16
Помогаю со студенческими работами здесь

В чем здесь ошибка, почему дублируется? Сделать первую букву большой после параграфа
пытаюсь составить регулярное выражение, которое бы заменяло букву а, либо букву А, на Б. Обрезал...

Какая здесь ошибка? Программа должна считать сумму в столбцах, но почему-то неверно считает
#include <iostream> #include <stdlib.h> main() { int S=0, a, Sum; for (int i = 1; i <=3; i++)...

Есть ли здесь ошибка? Писал скрипт в Unity для игры, но почему-то при запуске все зависает и нечего не работает
Я скинул пару примеров с циклами может ошибка в них. 1) int Amaunt = 0; foreach (int...

почему ошибка доступа (ошибка 3008)
Доброго дня! Вот такая у меня засада случилась. Простая, табличка, простой отчет. событие -...

Почему происходит ошибка доступа к памяти?
GetK32: __1: cmp byte ptr ,00h jz WeFailed cmp word...

Ошибка доступа access violation: почему класс-наследник не видит protected данные-члены класса-родителя?
Подскажите есть базовый класс в разделе protected разместил переменную, которая по идее должна быть...


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

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

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