• 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
59 wizyt
pytanie zadane 7 sierpnia 2016 w Java przez użytkownika itcloud Bywalec (2,960 punkty)
edycja 7 sierpnia 2016 przez użytkownika 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 użytkownika Porcupine Nałogowiec (31,710 punkty)
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 użytkownika itcloud Bywalec (2,960 punkty)
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 użytkownika Porcupine Nałogowiec (31,710 punkty)

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 użytkownika itcloud Bywalec (2,960 punkty)
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 57 wizyt
0 głosów
2 odpowiedzi 61 wizyt
pytanie zadane 22 maja 2016 w PHP, Symfony, Zend przez użytkownika Kacper Duda Obywatel (1,800 punkty)
0 głosów
6 odpowiedzi 87 wizyt
pytanie zadane 23 marca 2016 w C# i .NET przez użytkownika Vento Stary wyjadacz (13,950 punkty)
...