• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Blok w konstruktorze i dziwne wartości

0 głosów
62 wizyt
pytanie zadane 7 sierpnia 2016 w Java przez itcloud Gaduła (3,090 p.)
edycja 7 sierpnia 2016 przez itcloud

Mam taki kod:

import java.util.*;

public class Test {
	
	private int a;
	private String napis;

	//konstruktor
	public Test(){
		this(1,"pusto");
	}
	
	//konstruktor nr2 z argumentami
	public Test(int a, String n){

		
		this.a = a;
		this.napis = n;
		
		{
			a=666;
			napis="lalala";
		
		}
	}

	
	public int getA(){
		return this.a;
	}
	

	public String getNapis(){
		return this.napis;
	}


	public void setA(int x){
		this.a = x;
	}

	public void setNapis(String n){
		this.napis = n;
	}
	
	public static void main(String[] args){
		
		Test t1 = new Test();
		//t1.setA(333);
		//t1.setNapis("Blablabla");		
		System.out.println("a="+t1.getA()+", napis="+t1.getNapis());

		
	}
	
}

Otrzymuję wynik:

a=1, napis=lalala

Dlaczego zmienna 'a' nie jest równa 666 ? Napis się zmienił poprzez blok w konstruktorze 2-argumentowym.

Co dziwne, gdy zmienię argument przekazywany w tym konstruktorze z 'a' na 'z' jest ok:

	//konstruktor nr2 z argumentami
	public Test(int z, String n){

		
		this.a = z;
		this.napis = n;
		
		{
			a=666;
			napis="lalala";
		
		}
	}

Wiem, że jak tam zmienie parametr konstruktowa z 'n' na 'napis' to też będzie inaczej, ale nie potrafię tego sobie wytłumaczyć.

1 odpowiedź

+1 głos
odpowiedź 7 sierpnia 2016 przez Porcupine Nałogowiec (31,720 p.)
Najwidoczniej zmienna "a" z konstruktora przesłania pole w klasie.
Spróbuj napisać this.a = 666; i powinno działać tak jak oczekujesz :)
komentarz 7 sierpnia 2016 przez itcloud Gaduła (3,090 p.)
To akurat nie jest rozwiązanie problemu:) Już bardziej to, że argument w konstruktorze ma inną nazwę niż składowa klasy i to wiem, tylko zastanawiam się, czemu tak się dzieje :)
2
komentarz 7 sierpnia 2016 przez Porcupine Nałogowiec (31,720 p.)

Tak sobie twórcy Javy i wielu innych języków (jeśli ufać wiki to już począwszy od ALGOLa) wymyślili :) Z jednej strony jest to fajne, bo daje Ci możliwość wielokrotnego wykorzystania tej samej nazwy zmiennej. Z drugiej, w przypadku pól w klasie może być to mylące (tzn. nie powinno się (po za setterami) korzystać z tych samych nazw, które są nazwami pól klasy) - działa, ale po prostu jest nieczytelne. 

https://en.wikipedia.org/wiki/Variable_shadowing

komentarz 7 sierpnia 2016 przez itcloud Gaduła (3,090 p.)
Ok, będę po prostu inaczej nazywać składowe i inaczej argumenty (parametry metod, konstruktorów itp).

Podobne pytania

0 głosów
0 odpowiedzi 59 wizyt
0 głosów
1 odpowiedź 70 wizyt
+1 głos
1 odpowiedź 44 wizyt
pytanie zadane 29 stycznia w C i C++ przez robRoy Początkujący (370 p.)
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,636 zapytań

76,523 odpowiedzi

149,475 komentarzy

18,086 pasjonatów

Przeglądających: 219
Pasjonatów: 11 Gości: 208

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...