Cwiczenie z Thinking in Java, (klasa, składowe)

0

Witam,

to pierwszy mój post na tym forum, mam nadzieje że nie zostanę wyklęty na początek ;-P

uczę się javy od niedawna, zacząłem od Thinking in Java IV.

proszę o pomoc przy ćwiczeniu z tej ksiażki

ćwiczenie 5 str 103:

"Utwórz klasę o nazwie Dog (pies) zawierającą dwie składowe typu String: name (imie psa) i says ("daj głos"). W funkcji main() utwórz dwa obiekty tej klasy, o nazwach spot (który na komende "daj głos" reaguje szczekiem "Hau") i scruffy (który warczy "Wrrr"). Wypisz na wyjściu imiona psów i głos jaki psy wydają. "

zrobiłem coś takiego i nie jestem pewny czy to na pewno o to chodziło, jeszcze mam problemy z terminologią jąvy(czy składowe to są argumenty tej klasy?).

public class Roz3cw5 {

	static void dog(String name, String says)  {
		
		System.out.println(name + " mówi: " + says);
		
		
	}
	
	public static void main(String[] args) {
		dog("spot","Hauuu!");
		dog("scruffy","Wrrr!");
		

	}

}
0

Hmm, a co rozumiesz przez "argumenty klasy"? Składowe, to składowe: String name i String says. W konstruktorze przypisujesz tym zmiennym wartości przekazane jako parametry konstruktora. Poza tym komentarz "na komende "daj głos" reaguje szczekiem "Hau"" według mnie wskazuje na to, że w klasie powinna się znaleźć też metoda dajGlos().

0

myślałem że składową możemy nazwać argumentem (to chyba nazewnictwo jakie było przy funkcjach w Pascalu, bo tego 'języka' sie kiedyś uczyłem w szkole ;-P )

a jeśli chodzi o komendę dajglos() to niestety nie wiem jak to mozna napisać... jeśli możesz to napisz kawałek kodu jak by to miało działać.

poza tym dzięki za pomoc [soczek]

0

W javie dalej masz coś takiego jak argumenty funkcji, ale nie klas.
Aha, na jeszcze jedną rzecz nie zwróciłam uwagi w Twoim kodzie... Nie masz konstruktora, a metody tutaj nie powinny być statyczne (poza mainem).
Ja bym to napisała tak:

public class Dog {

  private String name;
  private String says;

  public Dog (String name, String says) {
    this.name = name;
    this.says =says;
  }

  public String getName() {
    return name;
  }

  public String dajGlos() {
    return says;
  }

  public static void main(){
     Dog spot = new Dog("spot","hau");
     Dog scruffy = new Dog("scruffy","wrr");

     System.out.printline(spot.getName() + " " + spot.dajGlos());
     System.out.printline(scruffy.getName() + " " + scruffy.dajGlos()); 
 }
}
0

dzięki bardzo za pomoc,

kod jest dla mnie bardzo pomocny, postaram sie jak najwięcej z niego wyciągnąć :-)

pozdrawiam!

0

niestety coś chyba źle robie, bo twój kod nie chce mi się skompilować :/

wywala mi taki błąd:

java.lang.NoSuchMethodError: main
Exception in thread "main"

poza tym eclipse czepia mi się tej komendy:

System.out.printline

co może być nie tak?

0

System.out.println("");

0
kam napisał(a)

niestety coś chyba źle robie, bo twój kod nie chce mi się skompilować :/

wywala mi taki błąd:

java.lang.NoSuchMethodError: main
Exception in thread "main"

poza tym eclipse czepia mi się tej komendy:

System.out.printline

co może być nie tak?

W jaki sposób odpalasz program? java nazwa_programu.class czy java nazwa_programu? Wydaje mi się, że ta druga opcja jest prawidłowa.

Sprawdziłem u siebie:)
Funkcja MAIN musi posiadać argument args i ma wyglądać tak:
public static void main(String args[]).
Teraz powinno śmigać :>

0

też do tego doszedłem (println() i String[] args), ale myślałem że to moze jakieś zmiany w nowej javie, a że ja mam nieaktualny kompilator albo cos takiego :/
skoro to był błąd to wszystko w porzadku, zaczynam łapać terminologie :-)

poprawiony pogram wygląda tak, jeśli ktoś śledzi temat:

public class Dog {

  private String name;
  private String says;

  public Dog (String name, String says) {
    this.name = name;
    this.says =says;
  }

  public String getName() {
    return name;
  }

  public String dajGlos() {
    return says;
  }

  public static void main(String[] args){
     Dog spot = new Dog("spot","hau");
     Dog scruffy = new Dog("scruffy","wrr");

     System.out.println(spot.getName() + " " + spot.dajGlos());
     System.out.println(scruffy.getName() + " " + scruffy.dajGlos());
 }
}
0

Ja bym jeszcze poprawił funkcję dajGlos i do niej zaimplementował wyrzucenie na ekran (dużo ładniej to wygląda!). Wyglądałoby to tak:

public class Dog {

  private String name;
  private String says;

  public Dog (String name, String says) {
    this.name = name;
    this.says =says;
  }

  public void dajGlos() {
    System.out.println(name + " mowi: " + says);
  }

  public static void main(String[] args){
     Dog spot = new Dog("spot","hau");
     Dog scruffy = new Dog("scruffy","wrr");

     spot.dajGlos();
     scruffy.dajGlos();
 }
}
0

Aj, niedopatrzenie ;). Sorry, pisałam z głowy, nie w kompilatorze :), zresztą chodziło o ideę. Poza tym jeżeli ktoś używa Eclipse, to polecam skrót: wpisujesz syso i wciskasz ctrl+spacja - bardzo przydatne :D.

dirkpitt, też się zastanawiałam nad wyrzucaniem na ekran w metodzie dajGlos, ale ostatecznie stwierdziłam, że to trochę niszczy zasadę obiektowości, bo przecież kto powiedział, że ktoś, kto będzie korzystał później z Twojej klasy będzie chciał wyświetlić dane w konsoli a nie np. w oknie. Do tego celu użyłabym raczej dekoratora. Może na tym poziomie to jeszcze nie jest istotne, ale takie już mam przyzwyczajenia :).

0

kod można napisać bez używania "this" co pewnie sugerował autor książki:

class Dog{
String x;
String y;

Dog(String name, String says){
x=name;
y=says;
}
void dajGlos(){
System.out.println(x+" daje glos: "+y);
}
public static void main(String[]args){
Dog scruffy=new Dog("scruffy","wrrrr");
Dog spot=new Dog("spot","hau");

spot.dajGlos();
scruffy.dajGlos();
}
}
0

Skoro się tutaj uczymy to może taka uwaga:

Daj głos nie powinno korzystać z konsoli. Powinno zwracać tylko Stringa. Teraz dalczego?

Prosta analogia: pies wie jak wydać głos ale nie wie czy będą go słyszeli na powietrzu, w pomieszczeniu, w samochodzie czy właśnie na konsoli.

Robiąc w ten sposób uzależniasz psa niejako od tego, że szczekać może tylko na konsolę. A lepiej byłoby, gdyby powiedzieć, że pies szczeka, szczeknięcie jest odgłosem (a w tym wypadku napisem) a gdzie sie rozchodzi - czy na konsolę, czy do pliku muzycznego - to powinno być obsługiwane przez otoczenie psa a nie przez niego samego.

Pozdrawiam,

1 użytkowników online, w tym zalogowanych: 0, gości: 1