5 svar
107 visningar
Solenskiner behöver inte mer hjälp
Solenskiner 87
Postad: 17 feb 2022 15:48

Skillnaden?

Vad är skillnaden mellan denna koden:

 

 

 

import java.util.Scanner;

class Main {

   public static void main(String[] args) {
   
    int x = 4;
     square(x);
    System.out.println(x);
       
   }
   static void square( int x) {
       x = x * x;
       
   }
}

 

 

Och denna koden:

 

public class MyClass {    public static void main(String[ ] args) {
        Person j;
        j = new Person("John");
        j.setAge(20);
        celebrateBirthday(j);
        System.out.println(j.getAge());
  }
   
    static void celebrateBirthday(Person p) {
        p.setAge(p.getAge() + 1);
    }
}

public class Person {
    private String name;
    private int age;
   
    Person (String n) {
        this.name = n;
    }
   
    public int getAge() {
        return age;
    }
   
    public void setAge(int a) {
        this.age = a;
    }
}

Jag fattar att den första koden jag skrev ger outputen 4 ( för att square metoden är en void SAMT att vi inte skrev följande:

 

x = square(x)

 

MEN,  med samma resonemang borde väll andra koden ge outputen 20? ( den ger outputen  21 ) 

Bubo 7418
Postad: 17 feb 2022 16:07

celebrateBirthday tar in ett argument p.

p har alla egenskaper som element i klassen Person har, bland annat en ålder.

getAge "plockar fram" en egenskap, en variabel, hos ett element av klassen Person. Vi får alltså veta vilket värde den egenskapen har, just hos det här elementet. Eftersom elementet är av klassen Person så finns den egenskapen (ålder) hos elementet.

 

setAge tittar i sitt element (dvs i this) och sätter ett värde på variabeln age. Elementet existerade innan vi anropade setAge, och det kommer att fortsätta existera när vi lämnar setAge - med ett modifierat värde på age.

Solenskiner 87
Postad: 17 feb 2022 16:13

Fast vartdera ändrar variabeln x inte sitt värde medan referens variabeln j ändrar sitt attribut ( ålder då ) till 21 ? 

Bubo 7418
Postad: 17 feb 2022 16:20

Funktionerna är väl call-by-value?

Vid anropen av både square och setAge skickar man värden.

I det första fallet skickar man in värdet 4, helt utan en tanke på varifrån fyran kommer. Inuti funktionen square skapar man en ny variabel som får heta x, och så räknar man fram ett nytt värde på denna lokala variabel x. Fortfarande har vi ingen aning om varifrån värdet kom.

I det andra fallet är det likadant. Du får in ett värde, som i vårt fall råkar vara tjugo. Men vi vet inte varifrån det kommer, det är en ren slump att det är personens ålder. Vi kunde lika gärna ha skickat in hans skostorlek. Det värde vi får in stoppar vi in klassvariabeln age, och klassvariabeln är inte lokal för funktionen. Klassvariabeln tillhör ett element av klassen Person.

 

Jag är inte programmerare, men jag känner mig hyfsat säker på det här. Någon annan får gärna bekräfta.

Programmeraren 3390
Postad: 17 feb 2022 16:33

Stämmer bra.

x är inget objekt så det som skickas till square()  är en kopia av x:s värde.
När man ropar på celebrateBirthday(j) skickas en referens till objektet j.
Därför är det fältet age i objektet j som ändras av setAge().


Solenskiner 87
Postad: 17 feb 2022 16:36

Tack!!

Svara
Close