2012-10-21 12 views
7

Czy ktoś może wyjaśnić, , dlaczego to działa.Metody z parametrami w Javie

Mam 2 klasy w Eclipse. klasy o nazwie „Car” zawiera następujący kod ..

public class Car { 
    public void printOut(String variable1){ 
     System.out.println("Hello " +variable1); 
    } 
} 

i inna klasa, czyli tam, gdzie moje „głównego” jest, nazywa się „Dom”, kod wewnątrz jest

import java.util.Scanner; 

class House { 
    public static void main(String args[]){ 
     Scanner input = new Scanner(System.in); 
     Car carObject = new Car(); 

     System.out.println("Enter name here: "); 
     String variable2 = input.nextLine(); 

     carObject.printOut(variable2); 
    } 
} 

Po uruchomieniu kodu, działa, zapisuje "Podaj tutaj nazwę", a po jego wpisaniu przechodzi do nazwy "Cześć" wprowadzonej ""

Moje pytanie brzmi: czy zmienne1 i zmienna2 "mają jakikolwiek stosunek do siebie nawzajem, poza tym, że obaj są klasy String.

ponieważ jestem zdezorientowany, dlaczego kod kompiluje się prawidłowo.

Dla mnie wygląda na to, że zmienna 1 nie ma żadnej korelacji ze zmienną2, mimo że obie są klasą String, nie wygląda na to, że kiedykolwiek wchodzą ze sobą w interakcje, a zmienna1 nie jest używana w " House "w ogóle, ale wciąż wie, aby skompilować wszystko, co weszłam. To tak, jakby "zmienna1" została zamieniona na "zmienna2", a każda zmienna2 zawiera zostanie wydrukowana.

Odpowiedz

3

Definicja metody w klasie Car jest swego rodzaju prototypem, gdy jej używasz.Czy kiedykolwiek uczyłeś się matematyki w "czarnej skrzynce"? Wpisujesz numer i otrzymujesz wynik. Zatem wpisujesz 3, jeśli funkcją jest f (x) = Xx2, wyjście będzie 6. Zanim wywołasz metodę, var2 jest całkowicie odmienne od var1. Jednak w metodzie var2 jest przekazywana i zastępuje wszystkie zmienne, których używasz w metodzie. Nie martw się, nie dostałem tego, gdy uruchomiłem Java

+0

Dziękuję bardzo, to ma sens, po prostu nie byłem pewien co do tego "dlaczego". Wiedziałem, jak to działało, po prostu nie wiedziałem, dlaczego. Dzięki twojej i wszystkim innym odpowiedzi, rozumiem. Wy, chłopaki. –

+1

Bez obaw, po prostu pamiętaj, aby zaakceptować najlepszą odpowiedź (podpowiedź, podpowiedź) :) – imulsion

0

wartość variable2 zostanie przeniesiony do variable1 podczas wywoływania metody

1

Odniesienie w variable2 po prostu nazwać skopiowane do variable2. Zmienna2 jest przekazywana jako argument metody. Poza tym nie ma związku. Zmienna2 jest lokalna tylko dla głównej, zmienna1 jest lokalna tylko dla printOut. myślę o zmiennej1 jako parametrze funkcji oczekiwanie wartości z metody wywołującej. Oznacza to, że możesz przekazać dowolny ciąg do printOut.

Na przykład carObject.printOut("Toyota") Jak widać nie jestem przechodzącą zmienną do wydruku, ale zakodowanego ciąg

+0

Dzięki Lews, to pomaga. –

0

są one dokładnie takie same jak przekazać variable2 do wydruku() metoda. variable1 to tylko nazwa parametru metody.

+0

Wielkie dzięki za odpowiedź. –

0

Nazwy zmiennych od dzwoniącego lub odbierającego nie mają żadnego efektu. Mógłbyś mieć zmienny parametr o nazwie orange, a drugi helicopter zrobiłby to samo. Ważną rzeczą jest to, że muszą mieć ten sam typ (tutaj: String).

Zawartość zmiennej wywołującej jest przekazywana do metody, bez względu na nazwę obu zmiennych.

+0

Wielkie dzięki. To mi bardzo pomaga. –

0

variable1 nie jest w rzeczywistości zmienną, jest nazwą zmiennej, która zostanie przekazana do metody. Będziesz potrzebować tej nazwy, ponieważ używasz jej w swojej metodzie dla niektórych operacji. Tak więc po przejściu variable2, która jest obecnie zmienną, widzisz ją w metodzie pod nazwą variable1. Mam nadzieję że to pomoże.

+0

Dziękuję, ma sens. –

+0

@FacelessVoid, nie ma za co! – Egor

0

W języku Java parametry są zawsze przekazywane wartością. Jeśli jednak przekażemy obiekt, to wskaże on pierwotny odnośnik do obiektu i będzie można zmodyfikować oryginalny obiekt.

+0

Dzięki za pomoc. –

3

Są one powiązane tylko dlatego, że przekazujesz variable2 w swojej metodzie Car.printOut. Wyobraźmy sobie tę analogię przez chwilę: Wiesz, jak wykonywać zadania domowe z matematyki na polecenie. Jesteś obiektem o nazwie FacelessVoid i masz metodę o nazwie doHomework. doHomework przyjmuje pojedynczy parametr typu Work. W prawdziwym świecie miałbym skrzynkę pracy, a ja zrzucałbym skrzynkę pracy na twoje biurko. Cokolwiek piszę na pudełku, nie ma dla ciebie znaczenia, ale zawartość pudełka zostanie zrzucona na twoje biurko, gdzie możesz nazwać to, co chcesz.

To jest dokładnie to, co dzieje się w twoim kodzie: Masz ciąg o nazwie variable2, a jego zawartość zostaje "porzucona" w variable1 wewnątrz printOut. Należy jednak zauważyć, że ciąg nie otrzymuje w swojej metodzie dumped, odwołanie zostaje skopiowane. Jest to ten sam obiekt, po prostu nazywany jest czymś innym.

+0

Dzięki, dobre wyjaśnienie. –

+0

Dlaczego nieakceptowany? –

0

nie ma relacji v1 i v2. Po wywołaniu metody car.printOut() z klasy Hous, przesuwa wartość v2 do stosu. Metoda car.printOut() przesyła tę wartość do zmiennej v1 ze stosu. Dlatego możesz użyć dowolnej nazwy.

Dodatkowo, po zmianie wartości v1 w printOut(), v2 nie zmieni się.

0

Inne dały dobre odpowiedzi, ale tylko po to żeby swoje słownictwo prawo variable1 nazywa się "formal parameter" natomiast variable2 jest rzeczywisty parametr, zwany również jako „argument” przekazany do metody printOut. Łatwiej byłoby zrozumieć, że grasz z imionami, jeśli chodzi o przekazywanie argumentów. Na poziomie jelitowym chodzi tylko o lokalizacje danych, a nie odnoszenie rzeczy po imieniu.

1

zmienna2 to odniesienie na ciąg gdzieś w pamięci. Wartość w zmiennej2 jest używana przez Javę, aby ustalić, gdzie znajduje się łańcuch. Na przykład:

variable2     memory location 1100 
[1100]  ------>   "hello" 

Zmienna1 jest także odniesieniem do ciągu gdzieś w pamięci. Kiedy wywołujesz funkcję, wartość w zmiennej2 (w tym przypadku 1100) jest umieszczona w zmiennej1.

variable1     memory location 1100 
[1100]  ------>   "hello" 

Dzięki temu funkcja może znaleźć ciąg, do którego przypisane są zmienne2 za pomocą zmiennej1, ponieważ lokalizacja ciągu znaków jest zawarta w obu. Lub umieścić w inny sposób, oba odnoszą się do tego samego ciągu.

Powiązane problemy