• 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

VPS Starter Arubacloud
0 głosów
117 wizyt
pytanie zadane 7 sierpnia 2016 w Java przez itcloud Gaduła (3,380 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,560 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,380 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,560 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,380 p.)
Ok, będę po prostu inaczej nazywać składowe i inaczej argumenty (parametry metod, konstruktorów itp).

Podobne pytania

0 głosów
3 odpowiedzi 221 wizyt
0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 3 października 2017 w Java przez heartagram Obywatel (1,770 p.)
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 14 kwietnia 2020 w C i C++ przez nanautzin Obywatel (1,510 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...