• 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

Object Storage Arubacloud
0 głosów
123 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 225 wizyt
0 głosów
1 odpowiedź 345 wizyt
pytanie zadane 3 października 2017 w Java przez heartagram Obywatel (1,770 p.)
0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 14 kwietnia 2020 w C i C++ przez nanautzin Obywatel (1,510 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...