Zobacz wyniki ankiety: Co sprawiłoby, że ten kurs byłby lepszy

Głosujących
8. Nie możesz głosować w tej sondzie
  • więcej przykładów

    3 37.50%
  • więcej szczegółów

    4 50.00%
  • więcej ćwiczeń do samodzielnego wykonania

    4 50.00%
  • więcej materiału w pojedyńczych lekcjach

    5 62.50%
  • mniej materiału w pojedyńczych lekcjach

    0 0%
  • ogólnie kiepsko napisany kurs, wiele by zmieniać

    0 0%
Ankieta wielokrotnego wyboru
Strona 2 z 3 PierwszyPierwszy 123 OstatniOstatni
Pokaż wyniki 11 do 20 z 22

Temat: Część druga - main i hello world... cz1.

  1. #11
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    OK.... wykopalem kod ktory napisalem na podstawie 2 czesci - tak jak ja zrozumialem

    Kod:
    public class Samochod {
    
        double stan_baku=35;
        double predkosc=0;
        String marka;
        double pojemnosc_silnika;
        double spalanie_na_100;
        
        public void main(String args[]){
            System.out.println(marka + " ma " + pojemnosc_silnika + "l pojemnosci i spala " + spalanie_na_100 + "l/100km");
        }
        
    }
    a uzywam tego nastepujaco

    Kod:
    public class Main {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
            Samochod car1 = new Samochod();
            car1.marka="Porshe";
            car1.stan_baku=55;
            car1.spalanie_na_100=15.5;
            car1.pojemnosc_silnika=4.5;
            Samochod car2 = new Samochod();
            car2.marka = "Ferrari";
            car2.stan_baku = 70;
            car2.pojemnosc_silnika=4.5;
            car2.spalanie_na_100=16.2;
            car1.main(args);
            car2.main(args);
        }
    Jesli zostawie main() w klasie Samochod jako static to nie moge polaczyc tekstow bo zmienne sa dynamiczne a funkcja statyczna. Jest to w pelni logiczne, wiec pytanie brzmi jak ma wygladac poprawna notacja albo gdzie zrobilem blad?

    EDIT:
    Ledwo zadalem proste pytanie o typy a juz wpadlismy w problem asynchronicznosci :P szczegolnie w edycji watkow :P

    EDIT 2:

    Kod naprawiony, wszystko jasne - braklo rozroznienia na pola klasy i pola instancji (obiekt jest instancja klasy - wcieleniem danego typu)... Po prostu main() w definicji klasy innej niz Main bedzie robic problemy... wiec zmienilem nazwe funkcji i po sprawie - teraz wywoluje jako

    Kod:
    car1.show();
    car2.show();
    i dziala No to teraz wracam do zabawy z rodzajami zmiennych - double vs. Double itd...
    Ostatnio edytowane przez TQM : 04-01-2008 - 11:33
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  2. #12
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    Ta linia:
    System.out.println(marka + " ma " + pojemnosc_silnika + "l pojemnosci i spala " + spalanie_na_100 + "l/100km");
    gdyby była umieszczona w mainie klasy main nie powodowałaby tych błedów, jednak musiałbyś odnosić się tak:

    System.out.println(samochod1.marka + " ma " + samochod1.pojemnosc_silnika + "l pojemnosci i spala " + samochod1.spalanie_na_100 + "l/100km");
    Klasa samochod, tak na prawdę nie musi mieć wcale żadnego maina, żeby było ciekawiej! Dobrze, ze tak się stało bo moze to pomoże zrozumieć lepiej pewne rzeczy. Jeśli tą linię wyrzucisz do maina Klasy Main, to możesz w klasie Samochod bez problemu zrobic static.
    Ponadto:
    car1.main(args);
    car2.main(args);
    Tego nie musisz umieszczać wcale, tylko kiedy chcesz by wykonał się kod z metody maj klasy Samochod na rzecz obiektów car1 i car2.

    A co się dzieje z pozostałymi? nikt nie ma wątpliwości, czy po prostu nikt po za naszą 3 tutaj nie zagląda?

  3. #13
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    TQM, a spróbuj - może to Ci ułatwi ugryzienie tematu, zrobić sobie jakąś wspólną wartość dla wszystkich instancji klasy Samochod np. dynstans_do_mety; Tak by modyfikując tylko raz, zmieniała się dla wszystkich.
    Podpowiem, że trzeba pokombinować ze static. Static możesz wstawić też przed zmienną.

  4. #14
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Ok - aby rozwiac watpliwosci co i jak zrobilem i dlaczego mialem problem - kod stary jest powyzej, kod nowy ponizej :P

    Cytat Napisał Car.java
    public class Car {

    double tankCapacity=35;
    double speed=0;
    String make;
    double engineCC;
    double fuelUsage;

    public void show(){
    System.out.println(make + " has " + engineCC
    + "l of engine capacity and uses " + fuelUsage + "l/100km");
    }
    }
    na razie wywalilem kalkulacje zasiegu i zmienilem nazwe funkcji z main() na show() zostawiajac w ten sposob domyslny konstruktor main() dostarczany przez JVM.

    Cytat Napisał Main.java
    public class Main {
    public static void main(String[] args) {
    Car car1 = new Car();
    car1.make="Porshe";
    car1.tankCapacity=55;
    car1.fuelUsage=15.5;
    car1.engineCC=4.5;
    Car car2 = new Car();
    car2.make = "Ferrari";
    car2.tankCapacity = 70;
    car2.engineCC=4.5;
    car2.fuelUsage=16.2;
    car1.show();
    car2.show();
    }
    }
    Teraz wszystko dziala i nic sie nie gryzie... pozwole sobie wprowadzic kilka dodatkowych terminow ktore sa bardzo czesto uzywane w literaturze... wlasnie mi kolega wyjasnil kawalek z ktorym mialem problem i zrobil to oczywiscie po angielsku, wiec dla kogos kto o Javie nie ma pojecia bylo to cos zupelnie innego - inna terminologia itd... ale ze tlumaczyl mi to przez Perla to jakos poszlo :P

    Pola (zmienne - variables) zadeklarowane w klasie Car sa domyslnymi wartosciami - chyba ze zadeklaruje je jako static, wtedy nie bede mogl zmienic poprzez car1.make = "marka wozu" tylko poprzez Car.make="marka" i to bedzie wspolne dla wszystkich czlonkow klasy Car (samochodow bedacych obiektami/instancjami klasy Car). Gdy tworze obiekt car1 czy car2 te wartosci domyslne sa przypisywane polom obiektu (czyli instancji danej klasy, staja sie polami nie klasy ale instancji - ma to znaczenie jak pozniej bedziemy sie do nich odwolywac).

    Moj problem polegal na tym, ze uzywalem w statycznym Car.main() nie-statycznych zmiennych nalezacych do instancji zamiast zmiennych klasy. Zapis ktory podalem wczesniej aby poskladac napis oznaczal ze pola marka itd sa polami klasy... ale w funkcji show() sa to juz pola danego obiektu, czyli car1.make, itd... i rownie dobrze moglbym je zapisac jako System.out.println(this.make + " is a car");

    Bardzo zamieszalem? Do czasu az mi to ktos wyjasnil bylo to wybitnie nielogiczne :P
    Ostatnio edytowane przez TQM : 04-01-2008 - 11:53
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #15
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    public void show(){
    System.out.println(make + " has " + engineCC
    + "l of engine capacity and uses " + fuelUsage + "l/100km");
    }
    tak jest OK!. Więc będę teraz tłumaczył po perlowemu
    Pamiętaj jednak, że main NIE jest konstruktorem. Jest to metoda, której kod jest zawsze wykonywany przy tworzeniu obiektu.Jeśli go nie napiszesz w ogóle, nic się nie stanie. Konstruktor musiałbyś zdeklarować tak:
    Car(){
    //jakieś działania
    }
    Konstruktor zawsze nazywa się tak jak klasa. Widzę, że nieco mylą Ci się pojęcia main oraz konstruktor. Kontruktor, tworzy obiekt. Może np. ustawiać wartości pól. Możesz np. zrobić konstruktor z parametrami:
    Car(int param1, int param2){
    }
    W takim wypadku nie jest to konstruktor domyślny bobieranie danych z parametrów wygląda jak w PHP, taki sam jest też zasięg zmiennych. Musiałbyś go wywoływać tak:

    Car car1 = new Car(10,20);
    Omówię to szerzej na najbliższej lekcji. Natomiast metoda main, w praktyce w takich klasach których obiekty sobie tworzysz jest używana raczej żadko. Najczęsciej używa się jej w głównej klasie programu. Oczywiście możesz np. użyć i konstruktora i maina, np. po to by wyizolować ustawianie pól, oraz wykonanie jakiegoś dodatkowego kodu - typu np. wyświetlenie na konsoli informacji o stworzeniu nowego obiektu.
    Wyglądałoby to tak:
    public class Car{
    int pole1;
    int pole2;
    Car(){
    /*to jest konstruktor domyślny. Tutaj powiedzmy ustawiamy sobie pola na wartość 1. Niech to będzie konstruktor do tworzenia obiektów, dla których na początku nie znamy wartości.*/
    this.pole1=1;
    this.pole2=1;
    }

    Car(int para1,int para2){
    /*To już nie jest konstruktor domyślny, ten konstruktor, musi otrzymać parametry*/
    this.pole1=para1;
    this.pole2=para2;
    }
    }
    "this" oznacza, że chodzi o pole klasy, a nie pole wewnątrz konstruktora - np. gdybyś zdeklarował w konstruktorze pole o takiej samej nazwie. Przykład:
    public class Nietoperz
    int masa;
    Nietoperz(){
    int masa;
    this.masa=10;//odniesiesie do pola w klasie
    masa=10;//odniesienie do pola w konstruktorze
    }
    Wracając do naszych 2 konstruktorów. Możesz teraz stworzyć obiekt na 2 sposoby: (poniżej main z klasy Main)

    public static void main(String[] args){
    Car car1 = new Car(); //utworzenie obiektu w którym obydwa pola=1
    Car car2 = new Car(30,20); /* Tak tworzysz obiekt przy użyciu tego konstruktora sparametryzowanego. pola w obiekcie od razu zostają ustawione na 30 i 20, tak napisaliśmy w tym konstruktorze*/
    }
    A teraz powiedzmy chcemy by przy tworzeniu obiektów zawsze był o tym wypisywany komunikat na konsolę. Nasz main w klasie Car wyglądać musi więc tak:
    public static void main(String[] args){
    System.out.println("Stworzono nowy obiekt!");
    }
    I teraz przy każdym tworzeniu obiektu będzie pojawiał się tekst w konsoli.
    Ostatnio edytowane przez javaman : 04-01-2008 - 12:45

  6. #16
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Pytanie z innej beczki... przepisalem kod (w sumie napisalem od zera) w Eclipse. Zrobilem eksport do car.jar podajac HelloWorld jako klase startowa - pod windows dziala, po skopiowaniu pod linuxa i odpaleniu mam takie cos:

    Kod:
    $ java -jar car.jar
    Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
            at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
            at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
            at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    Jakies pomysly? Kod to tylko stworzenie obiektow w klasie Car, ustawienie wartosci pol dla obiektow i wyswietlenie tekstow w metodzie show();

    Komunikat wspomina 'bad version' ale tam nie ma w ogole wersji...
    Ostatnio edytowane przez TQM : 04-06-2008 - 15:53
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  7. #17
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    sprawdź w jakiej wersji masz JRE w linuchu a w jakiej w Winie. może tutaj leży problem. Pewnie eclipse wkompilował biblioteki z repo nowszej wersji

  8. #18
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    To by sie zgadzalo... na Ubuntu mam:
    Kod:
    $ java -version
    java version "1.5.0_13"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_13-b05, mixed mode, sharing)
    a na windzie:
    Kod:
    >java -version
    java version "1.6.0_05"
    Java(TM) SE Runtime Environment (build 1.6.0_05-b13)
    Java HotSpot(TM) Client VM (build 10.0-b19, mixed mode, sharing)
    Chyba musze poszukac gdzie w Eclipse zmienic aby uzywal tej samej, starszej wersji... ale wtedy znowu nie wiem czy wszystkie dodatki beda mi dzialac jak bym chcial :P

    Troche mnie to rozwalilo - nie ukrywam... wiec widac ze bedzie problem jesli ja pisze w nowszym JDK niz platforma docelowa ma JRE :-/
    Ostatnio edytowane przez TQM : 04-06-2008 - 17:06
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  9. #19
    Zarejestrowany
    Nov 2006
    Skąd
    Polska/Poland
    Postów
    1,191

    Domyślnie

    zawsze możesz obsłużyć wyjątek wersji i wywalić info o tym...
    ***********
    * markossx *
    ***********

  10. #20
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    zdaje się że tylko jeśli używasz eclipse. On ma jakieś dziwne badziewia które wkompilowuje. Ale często się to zdaza. Dlatego najlepiej używać najpowszechniejszej wersji JRE> 1.5

Podobne wątki

  1. Odpowiedzi: 22
    Autor: 02-03-2019, 07:35
  2. hello world ;)
    By blackicenavarro in forum Assembler
    Odpowiedzi: 38
    Autor: 04-01-2011, 15:56
  3. int main
    By SARS in forum C/C++
    Odpowiedzi: 7
    Autor: 03-31-2008, 09:42
  4. Odpowiedzi: 4
    Autor: 01-31-2008, 18:34

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj