Zmienne - jakie wiązanie w Javie

0

Cześć, mam pytanie odnoście wiązania zmiennych. Czy wiele stron mówi, że zmienne mogą być wiązane dynamicznie bądź statycznie. Jednak przysłanianie zmiennych w Javie działa tak, że tworzona jest nowa zmienna. W związku z tym mam pytanie, bo nie wiem czy dobrze to zrozumiałem. Jeśli w klasie zdefiniuję sobie zmienną np. int x = 0 i w drugiej klasie int x = 1; to zgodnie z geeksforgeeks zmienna ta będzie wiązana dynamicznie.

private, final and static members (methods and variables) use static binding while for virtual methods (In Java methods are virtual by default) binding is done during run time based upon run time object.

W związku z tym mam pytanie. Czy zmienne mogą być wiązane statycznie i dynamicznie, ale zawsze zachowują się jakby były wiązane dynamicznie?

0

binding / wiązanie ???

Z jakiego kontekstu to jest? Bo wyjęte poza kontekst jest ... mocno dziwne

0

o kurde, ni w ząb nie rozumiem tego pytania, to jakieś pytanie z rozmowy technicznej na rekrutacji?

0

To pytanie z kolokwium. Mam taki kod

public class A
{
    int a = 0;
    public int getA()
    {
        return a;
    }
}
public class B extends A
{
    int a = 1;
    public int getA()
    {
        return a;
    }
public static void main (String[] args) {
A obiekt = new B();
System.out.println(getA());
}

Z jakiegoś powodu dostaję wynik równy 1. Nie rozumiem dlaczego. Według mnie wiązanie metody getA() jest dynamiczne czyli powinno zwrócić 0, ponieważ obiekt obiekt (niefortunna nazwa) jest typu A. Jednak nie rozumiem dlaczego zwracana jest wartość 1. Gdy wezmę natomiast

taką instrukcję

System.out.println(obiekt.getA()+" "+obiekt.a);

wyświetlane jest 1 0

I to mnie właśnie nurtuje.

0

W Javie wywołanie polimorficzne (aka dynamiczne) dotyczy jedynie metod instancyjnych, a nie pól w klasach.

1
Tomek Polak napisał(a):

Według mnie wiązanie metody getA() jest dynamiczne czyli powinno zwrócić 0, ponieważ obiekt obiekt (niefortunna nazwa) jest typu A.

Skoro wiązanie jest dynamiczne to powinno zwróćić 1. Szczególnie, że obiekt jest typu B. Jego referencja jest typu A... ale co to ma za znaczenie, jeśli mamy wiązanie dynamiczne.
( za dużo C...).

1
Tomek Polak napisał(a):

To pytanie z kolokwium. Mam taki kod

public class A
{
    int a = 0;
    public int getA()
    {
        return a;
    }
}
public class B extends A
{
    int a = 1;
    public int getA()
    {
        return a;
    }
public static void main (String[] args) {
A obiekt = new B();
System.out.println(getA());
}

Z jakiegoś powodu dostaję wynik równy 1. Nie rozumiem dlaczego. Według mnie wiązanie metody getA() jest dynamiczne czyli powinno zwrócić 0, ponieważ obiekt obiekt (niefortunna nazwa) jest typu A. Jednak nie rozumiem dlaczego zwracana jest wartość 1. Gdy wezmę natomiast

taką instrukcję

System.out.println(obiekt.getA()+" "+obiekt.a);

wyświetlane jest 1 0

I to mnie właśnie nurtuje.

To ze w ogole mozna tak zrobic (w scopie klasy) to lekki rak. W Kotlinie dostajesz taki compile-time error: hides member of supertype 'A' and needs 'override' modifier

2

true, w kotlinie jest prosto ( w sensie spójnie)

open class A {
    open val a = 1 
}

class B:A() {
    override val a = 2 
}


fun main() {
    val x = A()
    println(x.a) //1
    
    val y = B()
    println(y.a) //2
    
    val z:A = B()
    println(z.a) //2
}

Zresztą bardzo ładnie to się sprawdza do zarządzania zależnościami w DI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1