Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > подклассы и одинаковые методы


Автор: ressac 18.1.2009, 21:54
Код

public class Base {

    int x = 0;

    public void f() {
        System.out.println("f() : clase base !");
    }

    public void g() {
        System.out.println("g() : clase base !");
    }
}


Код

public class Derivada1 extends Base {

    int x = 1;

    @Override
    public void f() {
        System.out.println("f() : clase derivada 1 !");
    }

    @Override
    public void g() {
        System.out.println("g() : clase derivada 1 !");
    }
}


Код

public class Derivada2 extends Base {

    int x = 2;

    @Override
    public void f() {
        System.out.println("f() : clase derivada 2 !");
    }

    @Override
    public void g() {
        System.out.println("g() : clase derivada 2 !");
    }
}


Код

public class Anula {

    public static void main(String[] args) {
        Base b = new Base();
        Derivada1 d1 = new Derivada1();
        Derivada2 d2 = new Derivada2();

        Base p = b;
        System.out.println(p.x);
        p.f();
        p.g();

        p = d1;
        System.out.println(p.x);
        p.f();
        p.g();

        p = d2;
        System.out.println(p.x);
        p.f();
        p.g();
    }
}


получаю я вот это 

0
f() : clase base !
g() : clase base !
0
f() : clase derivada 1 !
g() : clase derivada 1 !
0
f() : clase derivada 2 !
g() : clase derivada 2 !

так вот я не пойму почему атрибут всегда показан правильно, тойсть атрибут отца.
а методы вызываются подклассов. я ведь не делаю кастинг ((Derivada1)p).f(); или ((Derivada2)p).f();

пожалуйста расталкуйте наглядно, спасибо!

Автор: rygel 18.1.2009, 22:01
поля объекта в полиморфизме не участвуют

Автор: ressac 18.1.2009, 22:56
rygel, но если я добавлю только метод "Н" например в один из под классов , то это метод я ни как не смогу вызвать из базового класса.

Автор: rygel 18.1.2009, 23:25
да, не сможешь, если необходимо использовать методы подкласса то и используй работая с объектом подкласса ссылку типа подкласса

Автор: ressac 18.1.2009, 23:43
rygel, тогда почему в первом случае это прокатывает? я имею в виду методы g и f

Автор: rygel 18.1.2009, 23:47
дык только что ведь этот вопрос обсуждался

http://forum.vingrad.ru/forum/topic-238762.html

Автор: ressac 19.1.2009, 01:17
rygel, да причём тут динамический биндинг? smile туту вообще другая структура вроде smile

эх, опять 23 %)

Автор: Hroft 21.1.2009, 18:45
ressac, удивительно, если честно. Тебе все четко пишут, а ты не желаешь читать.
Все методы в java виртуальные. Поля виртуальными не бывают. Ты обращаешься к полю базового класса. С какой стати там должно выводиться что-то еще, кроме значения поля в экземпляре базового класса? И как тут может быть ни при чем "динамический биндинг", если пример как раз на это?

Автор: ressac 27.1.2009, 04:19
я просто новичок, а вы сразу накинулись.

Автор: math64 27.1.2009, 09:40
Код

class Base {
int x = 0;
int getX() { return x; }
void setX(int x) { this.x = x }
}
class Derivada extends Base {
int x = 1;
int getX() { return x; }
void setX(int x) { this.x = x }
}
public class Main {
public static void main(String[] args) {
Base b = new Base();
System.out.println("Base:"+b.getX());
Base b = new Derivada();
System.out.println("Derivada:"+b.getX());
}
}

Вывод:
Код

Base:0
Derivada:1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)