Java. konstruktory i słówko *this*

Java. konstruktory i słówko *this*
Władyslaw Parchomenko
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 63
0

Privet
Kto może objaśnić po co używamy konstruktorów ?
Czy możemy zapisywać taki kod bez słówka THIS?
Jaka różnica jest, kiedy używamy this, a kiedy nie?(Ponieważ wszystko jedno kod działa w obu sytuacjach.)

Kopiuj
package javaapplication11;

public class Person {
    String name;
    int age;
    String character;
    
    Person()
    {
        name = "Undefined";
        age = 18;
    }
    Person(String n)
    {
        name = n;
        age = 18;
    }
    Person(String n, int a)
    {
        name = n;
        age = a;
    }
    void displayInfo(){
        System.out.printf("Name: %s \tAge: %d\n", name, age);
    }
}

Berylo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 344
1
  1. konstruktorów używa się aby utworzyć obiekt (poczytaj o tym w internecie, nie ma sensu, żebym się rozpisywał skoro to jest podstawa podstaw i jest tysiące artykułów na ten temat)
  2. this, oznacza, że odwołujesz się do obecnej klasy. W twoim przypadku może i nie ma różnicy ale co jeśli chcesz zrobić coś takiego:
Kopiuj
public class Person {
	private String name;

	public Person(String name) {
		//i co teraz? jak przypisać name do name?
		name = name; //ten kod tak naprawdę nie robi nic.
		this.name = name; //to jedyne wyjście. this wskazuje, że chodzi Ci o pole klasy. W ten sposób najczęściej używa się this.
	}
	
	public void someMethod() {
		name = "Jacek";
		this.name = "Jacek";
		//nie ma znaczenia jak napiszesz. Program zadziała tak samo.
	}
}
maniutek20
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 138
1

Matko święta wyszukiwarka się popsuła?
A tak na poważnie:
https://4programmers.net/Forum/Java/285881-java_this_uzywac_czy_nie

Swoja drogą: jak już musisz to nie "Privet" tylko "priviet" (nauczanie rosyjskiego w Polsce zakończono na roczniku '85 - mało kto rozumie takie kalki językowe)

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

@Berylo pokazał jak za pomocą przedrostka this. dostać się do przesłoniętych zmiennych. Takie przesłanianie zwyczajowo następuje w konstruktorze (co też @Berylo przestawił) oraz w setterach i to właśnie w tych miejscach ląduje większość wystąpień słówka kluczowego this.

Kombinowanie z:

Kopiuj
name = jestemKoślawyName;
age = jestemKoślawyAge;

jest nie-Javowe. Javowy idiom to:

Kopiuj
this.name = name;
this.age = age;

W Javie pisz po Javowemu :) Inaczej koledzy z OCD zaczną się złościć.

CS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 296
0
Berylo napisał(a):
  1. konstruktorów używa się aby utworzyć obiekt (poczytaj o tym w internecie, nie ma sensu, żebym się rozpisywał skoro to jest podstawa podstaw i jest tysiące artykułów na ten temat)
  2. this, oznacza, że odwołujesz się do obecnej klasy. W twoim przypadku może i nie ma różnicy ale co jeśli chcesz zrobić coś takiego:
Kopiuj
public class Person {
	private String name;

	public Person(String name) {
		//i co teraz? jak przypisać name do name?
		name = name; //ten kod tak naprawdę nie robi nic.
		this.name = name; //to jedyne wyjście. this wskazuje, że chodzi Ci o pole klasy. W ten sposób najczęściej używa się this.
	}
	
	public void someMethod() {
		name = "Jacek";
		this.name = "Jacek";
		//nie ma znaczenia jak napiszesz. Program zadziała tak samo.
	}
}

Raczej this to odwołanie do obiektu, który będzie utworzony na podstawie klasy, którą definiujesz. W większości przypadków nie potrzebujesz jawnego this, a tworzenie konstruktorów wg powyższego schematu to dobrze widziana konwencja niż wymóg języka. Bez this nie dasz rady zrobić jednego: zdefiniować metody zwracającej obiekt, która ją wywołała np.:

Kopiuj
public class Person {
	private String name;

	public Person(String name) {
		//i co teraz? jak przypisać name do name?
		name = name; //ten kod tak naprawdę nie robi nic.
		this.name = name; //to jedyne wyjście. this wskazuje, że chodzi Ci o pole klasy. W ten sposób najczęściej używa się this.
	}
	
	public Person someMethod() {
		name = "Jacek";
		return this;
 	}
	
	public String getName(){
		return name;
	}
 }

wtedy możesz zrobić tak:

Kopiuj
Person me = new Person("JA");
System.out.println(me.someMethod().getName());

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.