Как Java обрабатывает аргументы класса типа - PullRequest
1 голос
/ 18 сентября 2011

Я смотрю на пример из книги Вальтера Савича "Введение в Java"

// This method does not do what we want it to do.
public static void openFile(String fileName,
    PrintWriter stream) throws FileNotFoundException
{
    stream = new PrintWriter(fileName);
}

PrintWriter toFile = null;
try
{
    openFile("data.txt", toFile);
}

Автор дает объяснение, которое не имеет никакого смысла, почему toFile = null после try

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Вы должны прочитать этот раздел книги более глубоко. (Я уверен, что это действительно имеет смысл ... но вы просто еще не поняли.)

Понятно, что автор на самом деле пытается проиллюстрировать очень важный аспект Java ... как передаются параметры.

В частности, он пытается проиллюстрировать, что два идентификатора stream предназначены для различных переменных, и что присвоение внутри метода

stream = new PrintWriter(fileName);

НЕ влияет на переменную stream, объявленную непосредственно перед try. Значение, присвоенное переменной stream внутри метода, теряется.

Это показывает, что Java использует «передачу по значению» в качестве механизма передачи параметров. (Если вам нужно вернуть значение из вызова метода, простой способ сделать это - return.)

2 голосов
/ 18 сентября 2011

Автор пытается объяснить вам, что изменение того, на что ссылается переменная внутри метода, не видно вне метода.

toFile будет null после вызова openFile(), поскольку эталонное значение передается методу и присваивается локальной переменной stream. Изменение значения stream внутри метода невозможно увидеть вне метода, если вы явно не вернете его.

openFile() потребуется вернуть новый PrintWriter:

public static PrintWriter openFile(String fileName) throws FileNotFoundException
{
    PrintWriter stream = new PrintWriter(fileName);
    return stream;
}

и будет называться:

PrintWriter toFile = null;
try
{
    toFile = openFile("data.txt");
}
...