Przysłanianie zmiennej

0

Witajcie,

Co należy zrobić aby klasy, które są potomnymi przesłoniły zmienną z klasy bazowej?

class A {
    int i = 1;
    
    void test() {
        System.out.println(i);
    }
}

class A1 extends A {
    int i = 2;
}

class A2 extends A {
    int i = 3;
}
public class JavaApplication2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        A1 obj1 = new A1();
        A2 obj2 = new A2();
        
        System.out.println(obj1.i);
        System.out.println(obj2.i);
        
        obj1.test();
        obj2.test();
    }
}

bo wynik dostaję taki:

2
3
1
1

Czyli metoda z klasy bazowej jest dziedziczona ale wartość zmiennej i brana jest z klasy bazowej a nie z klasy potomnej.

0

Metoda działa w "kontekście" klasy bazowej i realizuje jej logikę czyli m.in. korzysta z pól klasy bazowej.

2

Pewnie to miałeś na myśli, tak jak podąłeś klasa A ma swoją składową i zaś klasy A1 i A2 mieli swoje zmienne i.

class A {
    int i = 1; 
    void test() {
        System.out.println(i);
    }
}
 
class A1 extends A {
    A1() { i = 2; }
}
 
class A2 extends A {
    A2() { i = 3; }
}
public class JavaApplication2 {
    public static void main(String[] args) {
        A1 obj1 = new A1();
        A2 obj2 = new A2();
 
        System.out.println(obj1.i);
        System.out.println(obj2.i);
 
        obj1.test();
        obj2.test();
    }
}
0

to są te tzw. konstruktory?

0

Tak, możesz też nadpisać metodę.

class A1 extends A {
    int i = 2;
    void test() {
        System.out.println(i);
    }	
}
0

W klasie bazowej jest int i = 1; natomiast w klasach potomnych jest np. i = 2. W takiej formie działa spoko, natomiast gdy w klasie potomnej dodam int i = 2 to niestety już nie. Dlaczego?

0

Bo jak w klasach potomnych deklarujesz i to jest to inne i niż te z klasy bazowej mimo, że się tak samo nazywa.

0
Sarrus napisał(a):

Bo jak w klasach potomnych deklarujesz i to jest to inne i niż te z klasy bazowej mimo, że się tak samo nazywa.

hmm.. czytam książkę "rusz głową! Java" kończę rozdział o polimorfizmie ale wydaje mi się że nic na ten temat jeszcze nie było.

0

No to jak to zrobić aby było zgodnie ze sztuką? Załóżmy że mam klasę bazową w której definiuje jakąś metodę która będzie wspólna dla klas potomnych. Natomiast klasy potomne będą miały swoje zmienne ale każda inne dane, z których ta metoda będzie korzystać. Dokładniej to wymyśliłem sobie coś takiego dla programu, który ma generować hasła. Metoda generowania za każdym razem jest taka sama. Natomiast w klasach potomnych chcę zdefiniować zmienną w której będzie przechowywana tablica znaków z których będzie generowane hasło np. w jednej będą tylko litery w innej klasie litery oraz cyfry jeszcze w innej cyfry, litery oraz znaki specjalne. Być może złą obrałem drogę, możliwe że lepiej byłoby to zrobić na zasadzie jednej metody, jednej klasy tylko pobawić się warunkami ewentualnie switch.

0

@_13th_Dragon zamieścił kod, gdzie pole w klasach potomnych jest inicjalizowane innymi wartościami. Myślę jednak, że w tym przypadku powinieneś dodać metodę wirtualną, która będzie zwracać odpowiednie dane, np. getPasswordChars()

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