Kuinka on mahdollista (tai onko edes) saada toisessa tiedostossa kirjoitetun metodin käyttöön itse "pää" tiedostossa, jossa main-metodi sijaitsee? Eli kutakuinkin näin:
**tiedosto1 public class metodiJotaKutsutaan { public String Hello () { return "output"; } }
**tiedosto2 public class test { public static void main (String[] args) { System.out.println(Hello()); } }
Varmaan ihan normaalisti..
**tiedosto2 public class test { public static void main (String[] args) { metodiJotaKutsutaan olio = new metodiJotaKutsutaan(); System.out.println(olio.Hello()); } }
Täytyy tosin sanoa, että luokan nimeäisin ehkä hieman vähemmän hämärästi. Vaikkapa "LuokkaJokaSisältääFunktionJotaKutsutaan", jos tuolle linjalle pitää lähteä.
Ja tietty jos teet staattisia funktiota, niin luokkaa ei tarvitse luoda erikseen vaan voit käyttää suoraan metodiJotaKutsutaan.Hello()
Jos ei ole oliolle tarvetta, kannattaa tietenkin käyttää staattisia funktiota. (Aha, Grez keksi saman.)
// A.java public class A { public static void main(String [] args) { System.out.println(B.f()); } }
// B.java public class B { public static String f() { return "Teksti"; } }
Onpa näppärää, kiitokset ;)
Olet tehnytkin tuota kysymääsi jo melko monta kertaa aiemminkin, tosin et ehkä tietoisesti. :P
Otetaan esimerkiksi vaikka tuo yksi rivi omasta esimerkistäsi:
System.out.println(...);
Missä siis haet System-luokasta (joka sattumoisin on tiedostossa nimeltä System.class) staattisen olion out (tyyppiä PrintStream, vastaavasti sattumoisin tiedostossa PrintStream.class) ja kutsut tämän metodia println(String).
Mutta mielestäni on hieman Javan olio ajattelun vastaista edellä esitetyn ongelman ratkaisuun käyttää/opastaa käyttämään staattisia luokkia.
Vaan mielummin juurikin niin kuten Grez kirjoittamassaan koodissa esitti.
Luomalla ensin luokan ilmentymä (olio)ja sen jälkeen käyttää luokan metodia.
Ja ei varmaan voida funktioista puhua ?
Ko. ohjelmassa nyt ei ole perusteltua edes kirjoittaa tulostuslausetta erilliseen metodiin saati luokkaan. Mutta kun Tumettaja halusi kokeilla ohjelman jakamista kahteen käännösyksikköön, niin tuo on lyhimpiä tapoja siihen testiin.
Olioiden opettelua varten sen sijaan kannattaisi ensin lukea olioparadigman perusteet jostain Java-oppaasta. Idea on lyhyesti sanottuna tiedon ja siihen liittyvien toimintojen paketointi ja toisaalta talletettavan tiedon ja olion ulkopuolelle näkyvän tiedon erottaminen. Vaikka on mahdollista tehdä tuollaisia olioita, joilla ei ole tietosisältöä, ei siihen ole olioajattelun pohjalta mitään syytä.
Itse Javahan sisältää valtavan määrän staattisia metodeja, kuten System.out.println. Siellä on myös staattisia metodeja, jotka luovat olion, jonka voisi luoda suoraankin (JOptionPane.showMessageDialog) tai palauttavat olion, jota ei voikaan luoda suoraan. Esim. Calendar-oliota ei voi luoda new Calendar käskyllä, tosin sen muistaakseni voi periyttää omalle luokalle ja luoda tämän ilmentymän. Mutta Javassa on valmiina staattinen Calendar.getInstance -metodi kalenteriolion tekoon. Sama luokka sisältää monia staattisia vakiokenttiä.
Terminologiaa on toisaalta yleisempää ja toisaalta ohjelmointikielestä riippuvaa. Javassa puhutaan metodeista, mutta voi niitä kutsua myös vaikka proseduureiksi ja funktioiksi. Funktiolla on perinteisesti kyllä tarkoitettu arvon palauttavaa aliohjelmaa / rutiinia / metodia, mutta kyllähän php:ssä kaikki aliohjelmat ovat funktioita.
Ville kirjoitti:
Mutta mielestäni on hieman Javan olio ajattelun vastaista edellä esitetyn ongelman ratkaisuun käyttää/opastaa käyttämään staattisia luokkia.
Vaan mielummin juurikin niin kuten Grez kirjoittamassaan koodissa esitti.
Luomalla ensin luokan ilmentymä (olio)ja sen jälkeen käyttää luokan metodia.
Jos staattisten luokkien käyttö olisi ehdottoman väärin tilanteesta riippumatta, olisiko koko ominaisuutta olemassa? Jos oliolle ei ole tarvetta, kannattaako sitä luoda - ts. noudatetaanko tässä "sokeasti paradigmaa ilman todellisia syitä"?
Staattiset jäsenfunktiot ovat Javan lähin vastine C:n (staattisille) funktioille.
Ville kirjoitti:
Ja ei varmaan voida funktioista puhua ?
Teen varmasti kamalan virheen, mutta käsittääkseni useimmin metodia ja funktiota käytetään toistensa synonyymeinä ja Javan yhteydessä puhutaan usein metodeista esimerkiksi koska Sunkin näin tekee.
Mikä tuossa oli vaikea ymmärtää? Ei ole syytä luoda ketjun aloittajan kuvaamaa oliota, jossa ei ole tietosisältöä, ja olioajattelu ei tarkoita, ettei staattisia metodeja käytettäisi tai tarpeettomia olioita pitäisi luoda. System.out.println:ää ei suinkaan käytetä luomalla olio ja kutsumalla sitten metodia, vai?
Taisin tuossa äsken ymmärtää väärin hk:n viestin.
Eli siis hk tarkoitti että jos oikeasti tarvetta ei ole säilöä tietoa, niin kannattaa käyttää staattisia metodeita, (eikä päinvastoin).
Edit: Sorry, näköjään ehdit vastailla tuohon viestiini jonka poistin, kun tajusin että ymmärsin väärin.
eq kirjoitti:
Teen varmasti kamalan virheen, mutta käsittääkseni useimmin metodia ja funktiota käytetään toistensa synonyymeinä ja Javan yhteydessä puhutaan usein metodeista esimerkiksi koska Sunkin näin tekee.
Ei mikään ole kamala virhe, kunhan tulee ymmärretyksi. Mutta kyllä Ville siinä on oikeassa, että aika yleisesti funktio-termi on varattu arvon palauttavalle ohjelmanpätkälle. Esim. ohjelmointikielten kehityksen kannalta tärkeissä Algolissa ja Pascalissa on erikseen Procedure ja Function -rakenteet. Matematiikastahan funktio-sana on peräisin, ja siellä funktio tarkoittaa kuvausta kahden joukon välillä, jolloin funktiolla on aina sekä argumentti että arvo. Toisaalta matematiikkaan sana on käsittääkseni tullut toimintaa tarkoittavasta yleiskielen sanasta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.