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

Как запретить динамическое связывание?

09.08.2012, 17:50. Показов 1809. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Вот код:
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
import java.util.*;
 
class A
{
    public void Func()
    {
        System.out.println("A");
    }
}
 
class B extends A
{
    public void Func()
    {
        System.out.println("B");
    }
}
 
class C extends A
{
    public void Func()
    {
        System.out.println("C");
    }
}
 
class dinamic
{
    public static void main(String[] args)
    {
        ArrayList<A> a = new ArrayList<A>();
        a.add(new B());
        a.add(new C());
        for(A classA : a)
        {
            classA.Func();
        }
    }
}
Вопрос: на что нужно заменить строчку "classA.Func();" что бы не выводилось "B C", а выводилось "A A"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.08.2012, 17:50
Ответы с готовыми решениями:

Динамическое связывание
Приветствую. Читаю Хорстманна добрался до раздела Динамическое связывание Не могу вникнуть в эту тему, не могли бы Вы написать...

Динамическое связывание
Здравствуйте! Возник вопрос. Если у нас есть if и в теле if создаётся переменная, то какое в данном случае связывание? Я предполагаю, что...

Динамическое связывание
Доброго времени суток! В языке java есть динамическое связывание, суть которого в том, что определение класса из которого нужно...

10
66 / 55 / 11
Регистрация: 16.04.2010
Сообщений: 190
Записей в блоге: 1
09.08.2012, 18:15
Как вариант - запретить переопределение, т.е. метод Func в классе A объявить final
0
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261
09.08.2012, 19:18  [ТС]
Нет, нужно поменять именно строчку classA.Func();
Мне этот вопрос на собеседовании задали, и Я не знаю как это решить, а скоро повторное собеседование, могут спросить опять.
0
66 / 55 / 11
Регистрация: 16.04.2010
Сообщений: 190
Записей в блоге: 1
09.08.2012, 19:31
Может на собеседовании хотели услышать от Вас, что такое не возможно?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
09.08.2012, 19:45
Цитата Сообщение от raiderx Посмотреть сообщение
Может на собеседовании хотели услышать от Вас, что такое не возможно?
У меня тоже такое ощущение. Вызов метода родительского класса при его переопределении в дочернем невозможен ниоткуда кроме дочернего класса. Как вариант - сделать в A абстрактный метод, который определить в B и С так, чтобы они вызывали именно родительский метод Func. Но это не одну строчку поменять.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.08.2012, 21:32
Цитата Сообщение от Hacker_ Посмотреть сообщение
на что нужно заменить строчку "classA.Func();" что бы не выводилось "B C", а выводилось "A A"?
Нужно заменить на строчку:
Java
36
            System.out.println("A");
Добавлено через 13 минут
Еще вариант:
Java
36
            new A().Func();
Добавлено через 46 секунд
Если можно менять одну другую строчку - то можно сделать метод в классе A статическим, тогда именно он и будет вызываться.

Не по теме:

Все, теперь точно смогу заснуть.

0
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261
10.08.2012, 13:25  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
У меня тоже такое ощущение. Вызов метода родительского класса при его переопределении в дочернем невозможен ниоткуда кроме дочернего класса. Как вариант - сделать в A абстрактный метод, который определить в B и С так, чтобы они вызывали именно родительский метод Func. Но это не одну строчку поменять.
Можете переписать код, что бы Я понял как это должно быть.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
10.08.2012, 14:02
Цитата Сообщение от Hacker_ Посмотреть сообщение
Можете переписать код, что бы Я понял как это должно быть.
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
package ru.skipy.tests;
 
import java.util.*;
 
 
/**
 * ParentCallTest
 *
 * @author Eugene Matyushkin sks Skipy
 * @since 10.08.12
 */
public class ParentCallTest {
    public static void main(String[] args) {
        ArrayList<A> a = new ArrayList<A>();
        a.add(new B());
        a.add(new C());
        for (A classA : a) {
            classA.callSuper(); // 1
        }
    }
}
 
abstract class A {    // 2
    public void Func() {
        System.out.println("A");
    }
 
    public abstract void callSuper(); // 3
}
 
class B extends A {
    public void Func() {
        System.out.println("B");
    }
 
    @Override // 4 start 
    public void callSuper() {
        super.Func();
    } // 4 end
}
 
class C extends A {
    public void Func() {
        System.out.println("C");
    }
 
    @Override // 5 start
    public void callSuper() {
        super.Func();
    } // 5 end
}
0
9 / 9 / 1
Регистрация: 17.06.2012
Сообщений: 168
10.08.2012, 21:39
Нигде не нашел информации.
У абстрактных классов есть конструкторы?
Просто при создании полноценного объекта наследника что происходит?
ссори за оффтоп

Добавлено через 17 минут
По теме, а если просто написать public final void Func()....
Компилятор позволит создать класс с таким же именем в производном и перекроет метод с аналогичным именем суперкласса.(т.е. аналог раннего связывания)
Или просто рассмотрит это как попытку наследования и запретит?

Компилятора сейчас нет под рукой.

Добавлено через 4 минуты
Мне сегодня задали вопрос на собеседовании.
"какие модификаторы наследования Вы знаете".
Сначала хотел сказать интервьреру, что не понял вопроса и попросить назвать хотя бы один, я бы рассказал о нем если знал, но забил и просто сказал, что не знаю.
Сейчас думаю речь о final и шла.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.08.2012, 22:37
Цитата Сообщение от ntny Посмотреть сообщение
По теме, а если просто написать public final void Func()....
Компилятор позволит создать класс с таким же именем в производном и перекроет метод с аналогичным именем суперкласса.(т.е. аналог раннего связывания)
Или просто рассмотрит это как попытку наследования и запретит?
Компилятора сейчас нет под рукой.
Запретит http://ideone.com/vy5mC

Добавлено через 6 минут
Цитата Сообщение от ntny Посмотреть сообщение
У абстрактных классов есть конструкторы?
Да, но на них можно только ссылаться из других конструкторов, с помощью this() в самом классе или super() в наследниках.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.08.2012, 10:52
Цитата Сообщение от turbanoff Посмотреть сообщение
Да, но на них можно только ссылаться из других конструкторов, с помощью this() в самом классе или super() в наследниках.
Уверены? А как насчет вот такого вызова?

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
package ru.skipy.tests;
 
/**
 * AbstractClassTest
 *
 * @author Eugene Matyushkin aka Skipy
 * @since 13.08.12
 */
public abstract class AbstractClassTest {
 
    protected String message;
 
    public AbstractClassTest(String message){
        this.message = message;
    }
 
    public static void main(String[] args) {
        AbstractClassTest act = new AbstractClassTest("Hello, abstract classes' world!") {
            @Override
            public void hello() {
                System.out.println(message);
            }
        };
        act.hello();
    }
 
    public abstract void hello();
}
Не this(), не super() и вообще не из конструктора. В чем подвох?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2012, 10:52
Помогаю со студенческими работами здесь

Динамическое связывание DLL
Как создавать библиотеку dll и чтобы работала программа, которую я напишу? Как осуществить динамическое связывание без импорта?

Динамическое связывание и пакет swing
Необходимо нарисовать несколько фигур: прямоугольник, эллипс и линия (пакет swing). Нарисовать их нужно методом gr.draw(ссылка на объект)...

Почему компилятору нужно динамическое связывание?
Допустим A *ptr = &amp;B; ptr-&gt;addvalue; , при компиляции не подставится адрес функции вместо имени, потому что ещё не создана таблица...

Как запретить скачивание файла но не запретить его исполнение.
Я составил сайт простенький. На нем у меня есть исполнительный файл в формате JAR ( Java - архив). Возникла необходимость запретить...

Как реализовать двустороннее связывание?
Какие есть способы сделать двустороннее связывание? Первое, что пришло в голову -- это использование медиатора(посредника) ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru