• 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
61 wizyt
pytanie zadane 7 sierpnia 2016 w Java przez itcloud Gaduła (3,070 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,670 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,070 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,670 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,070 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
2 odpowiedzi 62 wizyt
0 głosów
6 odpowiedzi 92 wizyt
pytanie zadane 23 marca 2016 w C# i .NET przez Vento Stary wyjadacz (14,350 p.)
...