Zmienne - jakie wiązanie w Javie

Zmienne - jakie wiązanie w Javie
Tomek Polak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
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?

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0

binding / wiązanie ???

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

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 731
0

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

Tomek Polak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

To pytanie z kolokwium. Mam taki kod

Kopiuj
public class A
{
    int a = 0;
    public int getA()
    {
        return a;
    }
}
Kopiuj
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ę

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

wyświetlane jest 1 0

I to mnie właśnie nurtuje.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

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

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
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...).

stivens
  • Rejestracja: dni
  • Ostatnio: dni
1
Tomek Polak napisał(a):

To pytanie z kolokwium. Mam taki kod

Kopiuj
public class A
{
    int a = 0;
    public int getA()
    {
        return a;
    }
}
Kopiuj
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ę

Kopiuj
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

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
2

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

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.