Gettery i settery w Javie

Gettery i settery w Javie
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

Chciałabym, aby ktoś na prostym przykładzie wytłumaczył mi o co chodzi z getterami i setterami w Javie, szukałam w google, na youtubie i w książce, "podstawy javy", swoją drogą dziwne że w książce nawet zdania o tym nie było.
Jedyne informacje jakie znajduje to teorie typu

"Gettery i settery to metody, które pozwalają odpowiednio pobierać i zapisywać wartość pól klasy."

Co nam w praktyce daje stosowanie takich metod ? Jak to zrozumieć ?

KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
4

Jeśli np. masz klasę "kwadrat" to pewnie nie chcesz żeby jego bok miał ujemną długość, więc jeśli zamiast umożliwienia po prostu modyfikacji zmiennej "bok" zrobisz funkcję "setBok" to w tej funkcji możesz sprawdzać czy długość boku jest sensowna i jeśli nie to np. jakiś wyjątek rzucić.

szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Lokalizacja:Kraków
  • Postów:1694
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Postów:597
1

Metody getter i setter bardziej ogólnie można nazwać mianem akcesorów. Pozwalają one zapewnić enkapsulację danego obiektu. Inaczej ujmując przechowujemy pola w ramach sekcji prywatnej bądź też chronionej natomiast dostęp do tych pól musimy zapewnić poprzez wykorzystanie tych metod getter i setter. Możemy tworzyć dostęp do pól do odczytu z wykorzystaniem metod get, lub/oraz do zapisu z wykorzystaniem metod set. Dzięki temu wyodrębniamy jakiś interfejs dostępu do danych, kolejną zaletę napisał kolega powyżej.

shagrin
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 6 lat
  • Lokalizacja:Norwegia, Stavanger
1

Poza tym, niektóre wartości obiektu mogą być np. automatycznie wyliczane na podstawie innych pol, wtedy raczej nie będziesz chciała udostępnić settera dla takiego pola.

Przykład:
Klasa kwadrat, będziesz chciała miec możliwość ustawienia długości pola a i b, jednak zamiast wprowadzić manualnie wartość pola tego kwadratu, raczej zadbasz o to, aby getPole() automatycznie je wyliczyło na podstawie podanych boków.

Czasem tez dany obiekt nie może istnieć bez jakiejś wartości, np Użytkownik bez loginu.
W takiej sytuacji powinnaś udostępnić konstruktor, w którym użytkownik będzie musiał podać login, sama metoda setLogin() może wtedy być pominięta.


W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

A w takim typowo prostym programie gdzie wczytuję, wyświetlam imię i nazwisko:

Kopiuj
public class firstHello {

	static Scanner wczytywarka = new Scanner(System.in);
	
	public static void main(String[] args) 
	{
		
		System.out.println("Podaj swoje imie: ");
		String imie = pobierzDane();
		System.out.println("Twoje imie to: " + imie);
		
		System.out.println("Podaj swoje nazwisko: ");
		String nazwisko = pobierzDane();
		System.out.println("Twoje nazwisko to: " + nazwisko);
	}

	public static String pobierzDane() 
	{
	    return wczytywarka.nextLine();
	}
	
}

Można na siłę użyć getterów i setterów ? Jakby to wyglądało ?
Moim zdaniem do takiego zadania nie jest to potrzebne, ale czytałam że trzeba od samego początku uczyć się tego używać nawet w miejscach które mogą się obyć bez tego.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@wioletta90 gettery i settery są związane z klasami/strukturami a twój program ma słowo class tylko dlatego że java wymaga żeby main() było w jakiejś klasie.
Wyobraź sobie że masz klasę

Kopiuj
class Osoba{
    private final String imie;
    private final String nazwisko;
}

i to do takiego obiektu chcesz wczytać dane a potem je wypisać...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

więc dodałam klasę Osoba, ale musiałam usunąć to

final
bo przecież imiona będą się zmieniały, a z tego co przeczytałam final oznacza że coś będzie niezmienne

przedstawia się to tak:

Kopiuj
public class Osoba {

    private String imie;
    private String nazwisko;
	
    public String getImie() {
    	return imie;
    }
    
    public void setImie(String imie) {
    	this.imie = imie;
    }
    
    public String getNazwisko() {
    	return nazwisko;
    }
    
    public void setNazwisko(String nazwisko) {
    	this.nazwisko = nazwisko;
    }
    
    
    
	static Scanner wczytywarka = new Scanner(System.in);
	
	public static void main(String[] args) 
	{
		Osoba osobnik = new Osoba();
		
		System.out.println("Podaj swoje imie: ");
		osobnik.setImie(pobierzDane());
		
		
		System.out.println("Podaj swoje nazwisko: ");
		osobnik.setNazwisko(pobierzDane());
		
	}

	public static String pobierzDane() 
	{
	    return wczytywarka.nextLine();
	}
	
}

czy tak to się robi ?

edytowany 1x, ostatnio: wioletta90
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Ano usuwanie tego finala to zły pomysł. Obiekty mutowalne są bardzo niewygodne i należy się ich wystrzegać jak ognia. Najwygodniej pracuje się z obiektami które nie mogą sie już zmienić po utworzeniu. Oczywiscie wtedy trzeba by zrobić jakieś

Kopiuj
new Osoba(wczytajDane(), wczytajDane());

Poza tym ta "wczytywarka" powinna być zmienną w funkcji main() a nie statycznym polem klasy. W ogóle klasa z main() raczej nie powinna mieć żadnych pól.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0
  1. Rozumiem, że obiekty mutowalne to takie które się zmieniają, ale
Kopiuj
private final String imie;

to pole a nie obiekt ?

  1. Takie rzeczy jak imię, nazwisko w programach raczej będę się zmieniały, a
Kopiuj
final

chyba to zablokuje i będzie jedno stałe imię/nazwisko ?

  1. Tego nie rozumiem od poczatku do końca:

Oczywiscie wtedy trzeba by zrobić jakieś

Kopiuj
new Osoba(wczytajDane(), wczytajDane());
  1. Gdy usunęłam static i przeniosłam
Kopiuj
Scanner wczytywarka = new Scanner(System.in);

do metody main() z klasy, to w metodzie pobierzDane() podkreśliło mi "wczytywarka" i wyświetliło bład "wczytywarka cannot be resolved", jak sobie z tym poradzić ?

W ogóle klasa z main() raczej nie powinna mieć żadnych pól.

Chodzi o metodę main() ? Jeżeli nie, to co to jest klasa z main() ? Tak jak mówi nazwa? Klasa w której jest metoda(main) ? W sumie jeszcze nie widziałam programu z dwiema klasami.

edytowany 1x, ostatnio: wioletta90
MU
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Polska, Wrocław
  • Postów:26
0

Klasa z main() to jakas klasa testowa. Np.:
public class JakasKlasaTestowa{
//tutaj nie ma pol zadnych
public static void main(String[] args){
...

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

@wioletta90 obiekty mutowalne to takie które mogą zmieniać swój stan, a stan obiektu zwykle określają jego pola właśnie. Nie odróżniasz OBIEKTU od KLASY. Klasą jest np. Krzesło a obiektem może być krzesło na którym teraz siedzisz i krzesła które masz w kuchni. Widzisz różnicę? Polem klasy może być materiał z którego wykonane jest krzesło, a każde z twoich krzeseł może być wykonane z innego materiału. Ten materiał zapewne jest "niezmienny" tzn drewniane krzesło nagle nie stanie sie metalowe. Więc jak widzisz niezmienność/niemutowalność nijak nie sprawia że nie możesz mieć różnych krzeseł. Tak samo jest z Osobami. Osoba raczej nie zmieni nagle swojego imienia i nazwiska ;]
Ten scanner musisz sobie teraz do tej metody przekazać jako parametr. Dużo łatwiej analizuje się kod kiedy metody/funkcje dostają w parametrach obiekty z którymi mają pracować.
Nie, nie chodzi mi o metodę main. Chodzi mi o klasę w której masz main(). Ta klasa powinna zawierać tylko tego maina i nic więcej.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
2

Ale kombinujecie. @wioletta90 pyta o tak podstawowe rzeczy jak akcesory, dopiero zaczyna się uczyć OOP a @Shalom z mutowalnością wyskakuje.

@wioletta90 jak najbardziej usuń final i korzystaj z akcesorów żeby zmieniać wartości obiektu. Na bardziej skomplikowane zagadnienia przyjdzie jeszcze czas. Ważne żebyś zrozumiała sens używania akcesorów.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Zobacz pozostały 1 komentarz
W9
a to Zelent źle uczy ? Nie jestem w temacie a oglądałam trochę.
Shalom
To przestań oglądać bo więcej z tego będzie krzywdy niż pożytku.
Aventus
@Shalom Mutowalność ma swoje zalety i wady tak samo jak i niemutowalność. Co za tym idzie nie są one ani dobre ani złe, wszystko zależy od kontekstu w jakich się ich używa. Twierdząc że niemutowalność jest jedyną słuszną drogą- to jest dopiero "doskonały plan".
Shalom
Chętnie poczytam o tych rzekomych zaletach mutowalności, szczególnie w kontekście dużych, prawdziwych aplikacji z wielowątkowością i wielodostępem.
T9
wydajność :P
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

a więc stworzyłam klasę main w której jest sama metoda main() i mój program wygląda następująco:

Kopiuj
package pl.wioletta.hello;

import java.util.Scanner;

public class Osoba {

    private final String imie;
    private final String nazwisko;
	
    public String getImie() {
    	return imie;
    }
    
    public void setImie(String imie) {
    	this.imie = imie;
    }
    
    public String getNazwisko() {
    	return nazwisko;
    }
    
    public void setNazwisko(String nazwisko) {
    	this.nazwisko = nazwisko;
    }
    
    
    
    public class KlasaZMain {
    	   	 
	
	public static void main(String[] args) 
	{
		Scanner wczytywarka = new Scanner(System.in);
		
		Osoba osobnik = new Osoba();
		
		System.out.println("Podaj swoje imie: ");
		osobnik.setImie(pobierzDane());
		
		
		System.out.println("Podaj swoje nazwisko: ");
		osobnik.setNazwisko(pobierzDane());
		
	}

    }	
	
	
	public static String pobierzDane() 
	{
	    return wczytywarka.nextLine();
	}
	
}

teraz mówisz, że muszę przekazać skanner do metody jako parametr, ale do której metody ? pobierz Dane() ? tam już chyba jest

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1
  1. To się teraz nie skompiluje bo dla zmiennych final nie możesz mieć settera ;]

tam już chyba jest

O RLY? String pobierzDane() ja tu widzę puste nawiasy w nagłowki metody, więc chyba jednak parametrów nie ma...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0
  1. jak setterów być nie może, to w sumie gettery też nie są potrzebne ?
  2. Pierwszy raz to robie ale chyba dobrze:
Kopiuj
	public static String pobierzDane(Scanner wczytywarka) 
	{
	    return wczytywarka.nextLine();
	}
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Gettery i settery generalnie są uważane za nieładne przy obiektach domenowych bo łamią enkapsulacje, niemniej czasem trudno ich uniknąć. Wyobraź sobie że masz teraz listę List<Osoba> w programie i chcesz wybrać z tej listy tylko osoby z nazwiskiem na jakaś literkę, albo o danym imieniu. Jak zrobisz to bez gettera? ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

a więc usunęłam settery i przekazałam odpowiednie parametry do metody pobierzDane(), teraz nie wiem jak bez setterów pobrać dane od użytkownika, wcześniej miałam

osobnik.setImie(pobierzDane());
, czyli wywoływałam metode dla obiektu osobnik z parametrem pobierzDane() [pokazuje jak myślę, jak źle to dajcie znać]

proponuję zrobić wczytywanie dla imienia taką linijką kodu:

Kopiuj
String imie = wczytywarka.nextLine();

to co aktualnie mam:

Kopiuj
package pl.wioletta.hello;

import java.util.Scanner;

public class Osoba {

    private final String imie;
    private final String nazwisko;
	
    public String getImie() {
    	return imie;
    }
    
    
    public String getNazwisko() {
    	return nazwisko;
    }
    
        
    public class KlasaZMain {
    	   	 
	
	public static void main(String[] args) 
	{
		Scanner wczytywarka = new Scanner(System.in);
		
		Osoba osobnik = new Osoba();
		
		System.out.println("Podaj swoje imie: ");

		
		
		System.out.println("Podaj swoje nazwisko: ");

		
	}

    }	
	
	
	public static String pobierzDane(Scanner wczytywarka) 
	{
	    return wczytywarka.nextLine();
	}
	
}
Shalom
Gettery i settery w Javie raptem kilka postów wyżej...
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
0

zadam pytanie przy temacie: czy settery na DTO są okey ?


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Settery na DTO sugerują że możesz przypadkiem trafić na obiekty które nie są do końca zainicjalizowane albo są niespójne. (a piewcy DDD w ogóle powiedzą że DTO to zło ;) )


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 7 komentarzy
szarotka
abstrahując od publicznych pól, bo tego nie trzeba komentować, to ty dajesz jakąś logikę w getterach setterach?!
caer
zdaję sobie z tego sprawę, w moich własnych projektach mam normalnie prywatne. podałem to po prostu jako ciekawostkę, że ktoś coś tak dziwnego wymyślił i to funkcjonuje
KA
pytanie do @Pythonowcow - jak sobie radzicie bez getterów i setterów. oraz czy dodatkowa logika w getterach i setterach to jest okey? generalnie wiem, że jest okey w normalnych projektach jak to w życiu bywa, ale gdybyśmy znajdowali sie w idealnym świecie ideii. to czy settery i gettery to są mądre i dodatkowa logika w nich jest ok? @szarotka dała dobrą myśl
Shalom
Na przykład "logika" walidująca poprawność danych, albo aktualizująca jakieś inne pola obiektu, albo w ogóle "getter" który coś wylicza i zwraca, bo potem z takiego DTO automatem generujemy sobie JSONa i chcemy tam mieć jakąś wartość która niekoniecznie jest polem obiektu. Python ma property -> http://www.python-course.eu/python3_properties.php
szarotka
Ehhh i komu tu teraz wierzyć
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
0

@Shalom okey czyli załóżmy jeżeli mam:

dao (model) -> service (pluje immutable DTOsami) -> JSFowy controller widoku

to teraz w tym controlerze pobieram sobie z serwisu np. List<AccountDto> accountList i tak to mogłabym trzymać tą listę w polu w klasie kontrolera jako private List<AccountDto>
i np w takim datatable się iterować i mieć na wierszu np. input texta z value="#{acc.name}" itd... AccountDto ma settery i na końcu wołam jedynie service.update(accountList).

a tak to jak AccountDto jest immutable i nie mam setterow to co wtedy? muszę zrobić specjalnie kolejną klasę tym razem muttable opakowującą AccountDto dla jsfowego kontrolera?
interesuje mnie ten konretny przypadek z datatable.

Nie mówię, że ta dodatkowa klasa to źle tylko pytam z niewiedzy i zastanawiam się na jakim etapie złamanie tych zasad ma sens i przy jakiej skali wielkości projektu
przestrzeganie tych wszystkich zasad daje więcej czasu i fajności niż zabiera.


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
edytowany 2x, ostatnio: karolinaa
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Mam nadzieje że to co nazwałaś "controller widoku" i w którym to chcesz mieć pola, to jest Managed Bean, bo inaczej to jest jakiś WTF.
To jest oczywiście szczególny przypadek kiedy robisz input beana do którego chcesz wpakować dane z Widoku, bo wtedy technologia może na tobie wymusić posiadanie bezparametrowego kontruktora i setterów (zgodnie z konwencja JavaBeans). I o ile tylko tam w sposób niejawny te settery są użyte to ok.
Analogiczny problem może występować np. dla klas @Entity ale to jest zupełnie inna bajka kiedy mówimy o czymś co wymusza na tobie użyta technologia.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
szarotka
jaki szczególny przypadek? typowa formatka!
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
0

Tak tak managed bean. Okey czyli jednak pewnych rzeczy nie przeskoczę.


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

siedzę przy tym już długo i nic nie wymyśliłam,

liczę na jakąś podpowiedź

Kopiuj
new Osoba(wczytajDane(), wczytajDane());
Shalom
Nie bardzo rozumiem o co pytasz. Przecież masz podany kod.
shagrin
@wioletta90 no i ekstra, ja bym tylko utworzyła zmienne imię i nazwisko i przekazała do konstruktora te zmienne zamiast wczytajDane() - kwestia czytelności kodu
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

w kodzie mam

Kopiuj
Osoba osobnik = new Osoba();

czyli niby teraz do konstruktora mam przekazać jako parametr 2 takie same metod wczytajDane(), ale po co ? Chciałam,aby program wczytał imię po linijce

Kopiuj
System.out.println("Podaj swoje imie: ");

więc skąd program będzie wiedział o co chodzi ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4

Jejku, no to wczytaj o_O

Kopiuj
System.out.println("Podaj swoje imie: ");
String imie = wczytajDane(scanner);
System.out.println("Podaj swoje nazwisko: ");
String nazwisko = wczytajDane(scanner);

Osoba osoba = new Osoba(imie, nazwisko);

Zaraz muszę gdzieś poszukać chyba ten link z pracą jako pomocnik piekarza...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
shagrin
Nie musisz być uszczypliwy, koleżanka rozkminia problem kilka godzin, zdarza się że po takim czasie nie dostrzega się oczywistości o_O
shagrin
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 6 lat
  • Lokalizacja:Norwegia, Stavanger
4

OK, nie śledziłam całego wątku, ale właściwie czemu nie zrobisz:

Kopiuj
public static void main(String[] args) 
    {
        Scanner wczytywarka = new Scanner(System.in);
 
        System.out.println("Podaj swoje imie: ");
 	String imie = wczytajDane(scanner);
 
        System.out.println("Podaj swoje nazwisko: ");
 	String nazwisko = wczytajDane(scanner);

	//teraz masz juz imię i nazwisko, więc tworzysz obiekt
	Osoba osobnik = new Osoba(imie, nazwisko);
 
    }

edytowany 1x, ostatnio: shagrin
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
4

Wydaje mi się, że zbytnio kombinujesz. Nie programuj na ślepo permutacjami tylko poczytaj solidnie o podstawach i pomyśl jak to wykombinować i prawidłowo zrobić.
Nie tak byle działało tylko pomyśl tak jak komputer. Popatrz czemu nie zrobisz w taki sposób:

Kopiuj
System.out.println("Podaj swoje imie: ");
final String imie = wczytajDane(scanner);
System.out.println("Podaj swoje nazwisko: ");
final String nazwisko = wczytajDane(scanner);

final Osoba obiektOsoba = new Osoba(imie, nazwisko);

oczywiście wbij to do bloku public static void main(String[] args) { ;]

EDIT: poproszę o plusa


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
edytowany 1x, ostatnio: karolinaa
W9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

a nie można najpierw stworzyć obiekt ?

Kilka rzeczy mam podkreślonych, chociażby parametr imie i nazwisko przy tworzeniu obiektu, tak to wygląda u mnie:

Kopiuj
package pl.wioletta.hello;

import java.util.Scanner;

public class Osoba {

    private final String imie;
    private final String nazwisko;
	
    public String getImie() {
    	return imie;
    }
    
    
    public String getNazwisko() {
    	return nazwisko;
    }
    
        
    public class KlasaZMain {
    	   	 
	
	public static void main(String[] args) 
	{
		Scanner wczytywarka = new Scanner(System.in);
						
				
		System.out.println("Podaj swoje imie: ");
		String imie = wczytajDane(Scanner);
		
		
		System.out.println("Podaj swoje nazwisko: ");
		String nazwisko = wczytajDane(Scanner);
		
		Osoba osobnik = new Osoba(imie, nazwisko);
	}

    }	
	
	
	public static String pobierzDane(Scanner wczytywarka) 
	{
	    return wczytywarka.nextLine();
	}
	
}
shagrin
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 6 lat
  • Lokalizacja:Norwegia, Stavanger
1

W klasie Osoba brakuje Ci konstruktora, który przyjmie te dwa parametry.


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)