» »

[Java] Objekt poslan k metodi v kakšnem stanju?

[Java] Objekt poslan k metodi v kakšnem stanju?

shadeX ::

Imam to kodo:

public void setEnrollmentDate(GregorianCalendar setDate) {
		
		
		this.enrollmentDate = setDate;
		
	}
	


Ko je objekt ustvarjen ter kliče setEnrollmentDate metodo katera zahteva objekt, me sedaj zanima kako je objekt poslan k metodi? .. dam lažji primer:

Če imaš npr:

public void kolikoLetImas(int leta) {

 // koda
}



Ko kličeš to metodo ji pošlješ vrednost npr: x.kolikoLetImas(30). To je preprosto..

Kako to delajo objekti kot argumenti? Ker sem kar nekaj googlal in nekje je pisalo da so objekti poslani kot reference drugi da kot kopije... zato sem malo zmeden.

pa še eno vprašanje. Ker nevem kako objekt "pade" k metodi tako tudi te vrstice ne razumem točno.

this.enrollmentDate = setDate;


Kaj se pripiše k fieldu tukaj?

Mavrik ::

V Javi vedno prekladaš okoli reference. Izjema so primitivni tipi (double, int, byte... z malo) ter String (ki se ga ne da spreminjati).

Tako da če v tvojem primeru rečeš:


Calendar cal = Calendar.getInstance();
cal.setDay(20);

objekt.setEnrollmentDate(cal);
objekt.enrollmentDate.setDay(8);

System.out.println(cal.getDay());


Boš dobil rezultat "8".
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

Spura ::

String ni izjema.

shadeX ::

Aha to bo to ja.. Mi je uspelo rešit zadevo. Hvala.

infiniteLoop ::

V Javi vedno prekladaš okoli reference. Izjema so primitivni tipi (double, int, byte... z malo) ter String (ki se ga ne da spreminjati).


V resnici v javi vedno naokoli prekladas vrednosti. V primeru reference na objekt se poda vrednost reference - torej referenca in ne objekt. Treba se je zavedati, da nobena spremenljiva s katero delas ne hrani objektov ampak samo reference.
None of us is as dumb as all of us.

shadeX ::

Kolikor sem razumel. Primitivni tipi ( int, double, float, boolean ... ) prekladaš vrednosti! Pri objektih pa prekladaš reference??

Ne me sedaj še bolj zmest :D

Spura ::

Parameter je vedno kopija vrednosti s katero je bila klicana funkcija. V primerih referencnih tipov (torej Object in podrazredi) je vrednost referenca, torej dobis kopijo reference.

Podajanje po referenci ala C#:
string a = "a";
string b = "b";
swap(a,b); // sedaj a = "b" in b = "a"

void swap(ref string s1, ref string s2) {
    string temp = s1;
    s1 = s2;
    s2 = temp;
}

In pri javi je pass by value
String a = "a";
String b = "b";
swap(a,b); // doesn't do shit captain, ker funkcija spreminja kopije referenc

void swap(String s1, String s2) {
    String temp = s1; 
    s1 = s2;
    s2 = temp;
}

Mavrik ::

In kak točno se "podajanje reference" in "podajanje po referenci" razlikuje pri izvajanju? :)
The truth is rarely pure and never simple.

Spura ::

Podajanje reference je pass-by-value, kjer je value referenca.
Ne razumem kaj je tle tezkega za razumet.
String s = new String("s");
myMethod(s);

Recimo da je string objekt na naslovu 0x80000000.
Spremenljivka s je na stacku na naslovu 0x00100000.
Njena vrednost je 0x80000000.

Ob klicu myMethod se postavi nov stack frame na naslovu recimo 0x00100100, v katerega se v slot za parameter skopira vrednost spremenljivke s, torej 0x80000000. Temu se rece pass-by-value, v parameter slot na stack frameu se skopira vrednost spremenljivke uporabljene za parameter.

Pri pass-by-reference bi se v stack frame skopirala vrednost 0x00100000, torej naslov spremenljivke, ne vrednost spremenljivke.

Ce pa sprasujes kako se razlikujeta nacina pri uporabi imas pa tocno dan primer v kodi nad tvojim postom.

Mavrik ::

Opozarjam te samo da s svojim brezveznim iskanjem dlake v jajcu nikakor ne pomagaš nekomu, ki se še komaj uči in ga zanimajo osnove. Namesto da mi razlagaš nekaj, kar že znam in se obešaš na terminologijo bi raje izboljšal in poenostavil mojo razlago OP-ju.

Začetniku veliko bolj koristi razlaga da se String zaradi immutabilitya obnaša kot da bi se podajal po vrednosti, pet-stranski esej o delovanju JVMja pa za nekoga ko nima podlage nima uporabne vrednosti.
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

Spura ::

A ti ves kaj pomeni beseda terminologija? Obesanje na terminologijo je razlaganje, da se ne rece mutex ampak semafor (torej razlicni termini, isti koncept). Jst govorim o razlicnih konceptih.
Kar se pa tice immutabilitya.
class MyClass {
    private int value;
    public MyClass(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
}
Naredil sm class ki je izjema v JVM in se ne podaja po referenci, bravo jst. Govoris o tem da ga zanimajo osnove. Ravno to je skodljivo, ker folk se osnov ne bo razumel pravilno. In cez deset let bo on sveto trdil da ima Java pass-by-reference, ker on to ze deset let to ve pa s tem operira. I get this all the time. Folk se narobe nauci osnove in se NIKOLI ne popravi, ker nimajo razloga, da bi podvomili v osnove.

Tista razlaga o JVM je bla pa zate, ker si spraseval kaj je razlika, ne pa za njega. Razlika (tudi zanj) je vidna v code snippetih ki sem jih napisal. Potem si se ti naredil neumnega in vprasal kaksna je razlika pri izvajanju. Ker sem razliko na nivoju delovanja programa ze pokazal (kar sem ti tudi napisal pa si ti veselo ignoriral), sem lahko razlozil le se na nizjem nivoju.
Drugic ce noces detajlov ne sprasuj po njih.

Vse kar on rabi vedet je da se metode dobijo kopije podanih parametrov, s tem da pri objektnih tipih gre za kopijo reference na objekt, ki ga lahko preko te reference dostopas in po moznosti spreminjas.

shadeX ::

Ker se naloga približno navezuje na objekt ter metodo bom kar tukaj vprašal..

Imam naslednjo metodo ki v parametrih zahteva CollegeCourse objekt. ( Ta objekt je custom, ki sem ga sam naredil in ga dopolnil s polji ter get/set metodami. ) Sedaj mene zanima, kadar kličeš ti to metodo iz reference Student objekta. Kaj točno moraš podat kot argument v metodo. Tega dela popolnoma ne razumem. Recimo vem da če bi bil parameter metode npr (String name, int age) bi lepo napisal referenca.setSomeMethod("Miha", 25).

Prosim razložite mi kaj je potrebno podati pri spodnji metodi. Že cel dan iščem kje v knjigi sem to spustil vendar tegan niti napisano ni.

Ta koda se nahaja v drugem razredu imenovanem Student:
public void setCollegeCourse(CollegeCourse course, int position) {
		
		
		cc[position] = course;

		
		
	}

alexa-lol ::

mislim, da vem kaj mislis :)

setCollegeCourse(new CollegeCourse(...konstruktor, kar kol že maš...), position);


To ne vem če obstaja poglavje o tem.... gre za logiko kako se koda interpretira.

shadeX ::

ja bo nekaj podobnega ja kakor pravi alexa. Vendar sedaj me zanima zakaj mi system out prikaže referenco.

public class Student {
	
	int id;
	CollegeCourse[] cc = new CollegeCourse[5];
	
	
	public void setId(int id) {
		
		this.id = id;
	}
	
	public int getId() {
		
		return id;
	}
	
	
	public void setCollegeCourse(CollegeCourse course, int position) {
		
		
		cc[position] = course;

		
	}
	
	
	public CollegeCourse getCourse(int index) {


		return cc[index];
		
	}
	
	
	public static void main(String[] args) {
		
		CollegeCourse ff = new CollegeCourse();
		ff.setCourseId("Math15");
		ff.setGrade('B');
		ff.setHours(15);
		
		
		Student x = new Student();
		x.setCollegeCourse(ff, 0);
		System.out.println(x.cc[0]);
		
	
	
	}
}


a kdo mogoče ve kako bi moral narediti da mi ne bi prikazalo reference, temveč dejanske podatke?

Mavrik ::

Ja kak pa naj JVM ve kaj točno hočeš da se izpiše o tem razredu? :)

Povedat mu moraš! V Student() razredu moraš overridati metodo "toString()":

@Override
public String toString()
{
   return "Student ID: " + this.id;
}
The truth is rarely pure and never simple.

shadeX ::

Sicer tisto gor ni popolna koda ki sem jo prilepil. Imam 2 razreda.

CollegeCourse razred:

public class CollegeCourse {
	
	String courseID;
	int creditHours;
	char grade;
	
	
	
	
	public void setCourseId(String id) {
		
		this.courseID = id;
		
	}
	
	public String getCourse() {
		
		return courseID;
	}
	
	
	public void setHours(int hours) {
		
		this.creditHours = hours;
	}
	
	public int getHours() {
		
		return creditHours;
		
	}
	
	public void setGrade(char grade) {
		
		this.grade = grade;
		
	}
	
	public char getGrade() {
		
		return grade;
		
	}
	
	
	

}



Student razred

public class Student {
	
	int id;
	CollegeCourse[] cc = new CollegeCourse[5];
	
	
	public void setId(int id) {
		
		this.id = id;
	}
	
	public int getId() {
		
		return id;
	}
	
	
	public void setCollegeCourse(CollegeCourse course, int position) {
		
		
		cc[position] = course;

		
	}
	
	
	public CollegeCourse getCourse(int index) {


		return cc[index];
		
	}
	
	
	public static void main(String[] args) {
		
		CollegeCourse ff = new CollegeCourse();
		ff.setCourseId("Math15");
		ff.setGrade('B');
		ff.setHours(15);
		
		
		Student x = new Student();
		x.setCollegeCourse(ff, 0);
		System.out.println(x.cc[0]);
		
	
	
	}
}


Dvomim da bi naloga od mene zahtevala @Override metode ker še nisem prišel do tam ;D Niti ne vem če me razumete kaj hočem doseči? :D

Bom še enkrat povedal. uglavnem v tej kodi spreminjam reference, ter nastavljam metode iz CollegeCourse razreda:

CollegeCourse ff = new CollegeCourse();
		ff.setCourseId("Math15");
		ff.setGrade('B');
		ff.setHours(15);


Nato referenco "ff" podam sem v nov Student objekt:


x.setCollegeCourse(ff,0)
 


Če prav razumem je sedaj bila klicana metoda .setCollegeCourse podana sta bila pa 2 argumenta in sicer ff referenca ter int 0 ( ki predstavlja prvo vrednost v arrayju ).

Vse kar hočem sedaj doseči je samo to da bi nekako poklical .getCourse metodo, kateri bom podal argument 0 ( ki predstavlja prvi index v arrayju, ki sem ga nastavil s .setColegeCourse metodo)

Kako pokličem sedaj getCourse metodo in prikazal podatke ki sem jih spremnijal z referenco?

Če si bo kdo sploh vzel čas da bo to prebral in me razumel kaj skušam povedati :D bom neskočno hvaležen. Sem samo navaden smrtnik z 3 meseci izkušnjami v progamiranju in mogoče tudi jaz kdaj čudno povem.. ;D

alexa-lol ::

ojoj :) poglej x.cc[0] ti vrne objekt tipa CollegeCourse, pač zato ker je cc polje tipa, ki vsebuje elemente tipa CollegeCourse. Zdej System.out.println ne ve kako si ti predstavljaš, da bi mogel opis tega objekta izgledati, zato izpiše podatek, ki računalniku nekaj pomeni, ljudem pa nič. to je 1 plat medalje.

2. plat. Vse razredi (popolnoma vsi) so potomci razreda Object. In v razredu Object imaš metodo toString.
Zdej če dedovanja pa tega še niste delal se zaenkrat zadovolji, da če boš razredu CollageCourse dodal metodo toString, da bo delalo to kar želiš...

(to zadevo prilimaj v class CollegeCourses)
public String toString()
{
   return "Course ID: " + this.courseID + "\n credit hours: " + creditHours + "\n grade: " + grade;
}


Zdej s to metodo si definiral kako si ti predstavljaš izpis tega objekta, kako bi ga ti ubesedil.

zdaj daš samo x.cc[0].toString() in boš dobil to kar želiš....

Eventuelno če ti toString ne diši definiraj svojo metodo ubeseditev
public String ubeseditev()
{
   return "Course ID: " + this.courseID + "\n credit hours: " + this.creditHours + "\n grade: " + this.grade;
}


in kliči x.cc[0].ubeseditev()

Poleg tega bi te upoozoril na eno konceptualno napako, ki jo delaš. Ne uporabljaš principa enkapsulacije.

načeloma naj bi bile vse spremenljivke v razredih private (private string courseID...) in potem maš definirane getter in setter metode.
public string getCourseID(){
    return this.courseID;
}
public void setCourseID(string courseID){
    this.courseID=courseID;
}


Ker če ne je zmešnjava...
Lep pozdrav

Zgodovina sprememb…

shadeX ::

Tnx man. To sm rabu..zdej razumem malo bolj. Hvala ker si si vzel čas ;D

alexa-lol ::

Ni problema.. drugače se pa veliko naučiš ko debugiraš. Probaj te osnovne podatkovne strukture implmentirati (linked list, array list) in se boš veliko naučil. Priporočam ti knjigo Programiranje in algoritmi (Kononenko, Bosnič) in pa Programiranje in algoritmi skozi primere (Divjak).. fajn knjigi. za bolj osnovno Javo pa Java skozi primere (Mahnič). To so knjige, ki jih moraš vedeti, da narediš 1. letnik FRI ali pa IŠRM programiranje. Notri so itak take evergreen zadeve.. fajn knjige.

shadeX ::

Sicer sem poizkusil veliko knjig o javi in ubistvu mi skoraj nobena ni "sedla". Nato pa pred kakšnim mesecem sem dobil knjigo o javi ki jo je napisala Joyce Farrel. Moram povedati da bolj zadovoljen ne morem biti. Knjiga ima okoli 1000 strani in notri je prav vse. Začne z osnovami in potem vse bolj težje. Na konc vsake teme ( ne poglavja ) npr imaš temo : searching arrays in na koncu te teme imaš par vprašanj iz te teme ( kaj si se naučil ). Nato na koncu poglavja imaš pa prav vprašanja, in nato pa prav vaje s katerimi utrjuješ znanje. Moram reči da sem zelo presenečen sam nad sabo. 3 mesece nazaj nisem vedel kaj je to "variable", sedaj sem pa sem že pri arrayjih in če sem pošten se mi je prvič tukaj zataknilo pri nalogi. Sicer da ne bo pomote, še vedno sem začetnik in me čaka še dolga dolga pot, vendar napredek je opazen.

alexa-lol ::

No sej edino na kar pazi je ta princip enkapculacije (private string courseID ...)
ker drugače lahko vrednost spremenljivke nastaviš tudi tako...
CollegeCourse ff = new CollegeCourse();
        ff.setCourseId("Math15");
        ff.setGrade('B');
        ff.setHours(15);
//ekvivalentno
ff.courseID="Math15"


Vbistvu kodo v collageCourses maš uredu samo private daj pred spremenljivke.

shadeX ::

ja neki sem že slišal da je potrebno dat private spremenljivke, ker itak maš getterje/setterje nastavljene med drugim. se bom držal nasveta. hvala ;D


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# povezava forma in classa

Oddelek: Programiranje
172143 (1606) Miko55
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101350 (1097) Spura
»

android črta

Oddelek: Programiranje
412272 (1543) g333kk
»

C# je mozna referenca do int izven funkcije (direkt v classu torej)

Oddelek: Programiranje
81546 (1360) TopCat
»

Vmesnik v Javi

Oddelek: Programiranje
142152 (1935) Camel

Več podobnih tem