Akcesor i mutator - które ustawienie mutatora jest poprawne?

0

Uczę się javy z kilku źródeł co wprawiło mnie kolejny raz w zagwozdkę nad pewną kwestią. Chodzi mi o mutatory i akcesory:

	private int promien;
	public void setPromień(int r)
	{
		this.promien = r;
	} 
	private int promien;
public void setPromień(int r)
	{
		promien = r;
	} 

Które ustawienie mutatora jest poprawne?

I chodzi mi jeszcze o samo rozumienie tego zagadnienia.
Jeżeli w klasie dziedziczącej chcę zmienić wartość pola "promien" (ale nie zmieniać wartości tego pola w super-klasie) to powinienem korzystać z akcesora i mutatora - Tak to działa?

0
rubesom napisał(a):

Które ustawienie mutatora jest poprawne?
Wsio jedno, oba kody są równoważne. this jest zbędne w tym przypadku, więc zazwyczaj ludzie tego nie piszą. this jest potrzebne jeśli jest jakiś konflikt nazw np.

private int x;
void setX(int x) {
    this.x = x;
}

Jeżeli w klasie dziedziczącej chcę zmienić wartość pola "promien" (ale nie zmieniać wartości tego pola w super-klasie)
co to znaczy zmienić pole w klasie dziedziczącej a nie zmieniać tego pola w klasie bazowej?

0

Jeżeli w klasie dziedziczącej chcę zmienić wartość pola "promien" (ale nie zmieniać wartości tego pola w super-klasie)
co to znaczy zmienić pole w klasie dziedziczącej a nie zmieniać tego pola w klasie bazowej?</quote>

Tak jak napisałem chodzi mi o zmianę wartości pola, żeby zmienić wartość pola dla klasy dziedziczącej a nie w klasie po, której dziedziczy - dobrze to rozumiem?

0

Mówisz jakby były 2 pola o nazwie promien, gdy jest tylko jedno.

0
twonek napisał(a):

Mówisz jakby były 2 pola o nazwie promien, gdy jest tylko jedno.

To jak mam poprawnie rozumieć sytuacje gdzie dane pole jest prywatne, a żeby je zmienić muszę użyć mutatora przy dziedziczeniu? Co wtedy zostaje zmienione, jakiś klon/kopia pola z super-klasy?

0

Żeby był klon/kopia muszą być 2 pola (oryginał i klon), a ciągle jest tylko 1 pole. Jeśli jest protected lub public (albo nic co oznacza dostęp w obrębie pakietu) to obiekt klasy pochodnej też ma dostęp do niego, a jeśli jest private to obiekt klasy pochodnej nie ma:

class A {
	public int x = 99;
}
	
class B extends A {
	public void f() { 
		x = -1; 
	}
	
	public void g() {
		super.x = 123;
	}
}

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		B b = new B();
		System.out.println(b.x);
		b.f();
		System.out.println(b.x);
		b.g();
		System.out.println(b.x);
	}
}

http://ideone.com/Ip0CYh
Wtedy dostęp jest możliwy tylko przez nieprywatne metody klasy bazowej (np. mutator).

0

Pozwalają one modyfikować wartości atrybutów klasy objętych klauzulą private, czyli ukrytych dla zewnętrznych klas.

Czyli dzięki temu mogę np. używać konstruktora jednoargumentowego gdzie pole z którego korzysta jest prywatne - o to chodzi?

1

"Pozwalają one modyfikować wartości atrybutów klasy objętych klauzulą private, czyli ukrytych dla zewnętrznych klas."

To nie ma nic wspólnego z dziedziczeniem czy konstruktorami. Weźmy kod:

class A {
    private int x;
}

class B {
    void f() {
        A a = new A();
        a.x = 5;
    }
}

To nie przejdzie bo x jest private. Więc jak chcesz to zrobić to możesz np. dodać nieprywatną metodę:

class A {
    private int x;

    public void setX(int newValue) {
        x = newValue;
    }
}

class B {
    void f() {
        A a = new A();
        a.setX(5);
    }
}

I tyle.

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