Java Data, считываемый из файла, хранит данные только в инструкции try. Везде где-нибудь возвращается & ldquo; null & rdquo; или & ldquo; 0. & rdquo; [Дубликат]

Я нашел чистое решение CSS, которое очень хорошо работало для меня во всех браузерах:

span {
    display: table-cell;
}
3
задан Richard Tingle 26 June 2013 в 12:36
поделиться

7 ответов

Хотя это возможно, возможно, на таких языках, как Scala или Ceylon (см. ниже), на Java вам необходимо явно назначить аргументы конструктора переменным экземпляра. Таким образом:

public class WineChiller {

    double wineTemp;
    double preferredTemp;
    double chillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        this.preferredTemp = preferredTemp;
        this.chillTemp = chillTemp;

        getChillingTime();
    }

Аргументы конструктора видны только в области конструктора. Тот факт, что конструктор вызывает ваш getChillingTime(), не имеет значения. Если вы хотите, чтобы они были видимыми в пределах экземпляра WineChiller, вам придется создавать члены этого класса. Все методы этого класса могут затем получить доступ к членам экземпляра.

В любом случае, я настоятельно рекомендую вам внимательно прочитать учебник по Java. Вот один из них:

http://docs.oracle.com/javase/tutorial

Конструкторы на других языках JVM

I подумайте, что вы в основном боретесь с многословием Java, где вам нужно явно копировать аргументы конструктора в поля экземпляра, чтобы реализовать инкапсуляцию . Другие языки решили это более элегантно, где конструкторы могут быть неявно определены вместе с самим классом. Тем не менее, они все равно перейдут на что-то эквивалентное приведенному выше Java-коду. Например:

Scala:

class Greeter(message: String) {
    def SayHi() = println(message)
}

val greeter = new Greeter("Hello world!")
greeter.SayHi()

Пример отсюда: http://joelabrahamsson.com/learning-scala-part-four-classes-and-constructors /

Ceylon

class Point(Float x, Float y) { ... }
object origin extends Point(0.0, 0.0) {}

Пример отсюда: http://ceylon-lang.org/documentation/1.0/spec/html_single/

5
ответ дан Lukas Eder 31 August 2018 в 19:25
поделиться

wineTemp, который вы принимаете в конструкторе, необходимо установить где-нибудь, чтобы он был доступен в рамках метода getChillingTime.

Предлагаемое исправление

    public class WineChiller {

        private double wineTemp;
        public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
            this.wineTemp = wineTemp;
            ...
        }

        ...
0
ответ дан Ajay George 31 August 2018 в 19:25
поделиться

В вашей основной функции это похоже на это

WineChiller wineChiller = new WineChiller();
wineChiller.getChillingTime(wineTemp, preferredTemp, chillTemp);

В вашем классе WineChiller есть способ получить эти входные данные

public void getChillingTime(double wineTemp, double preferredTemp, double chillTemp)
{
//do something
}
0
ответ дан John 31 August 2018 в 19:25
поделиться

Переменные, переданные в качестве аргументов методу, являются локальными только для этого метода. Если вы хотите использовать их в другом методе, вы должны либо сохранить их как переменную экземпляра, либо передать их снова как аргументы.

public class WineChiller {

    double mWineTemp;
    double mPreferredTemp;
    double mChillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {

        mWineTemp = wineTemp;
        mPreferredTemp = preferredTemp;
        mChillTemp = chillTemp;

        getChillingTime();

    }
0
ответ дан MaxAlexander 31 August 2018 в 19:25
поделиться

Почему не удается getChillingTime разрешить winTemp и т. д. переменным?

То, как работают локальные переменные. wineTemp ограничивается только внутри WineChiller constructor. вам необходимо передать его в качестве аргумента в метод getChillingTime() и использовать его или сделать его переменной экземпляра вашего класса.

 public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        getChillingTime(wineTemp);
    }
 public void getChillingTime(double wineTemp) {

ИЛИ:

public class WineChiller {
private double wineTemp;
    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        getChillingTime();
    }

I рекомендуем второй подход, который является стандартным способом.

0
ответ дан PermGenError 31 August 2018 в 19:25
поделиться

Либо передайте аргументы, потому что область параметров не выходит за пределы самого метода

public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
    getChillingTime(wineTemp, preferredTemp, chillTemp); // pass the arguments
}

public void getChillingTime(
            double wineTemp, double preferredTemp, double chillTemp) {
    // ...
}

Или сохраните их как поля экземпляра (рекомендуется ) , которые автоматически доступны из каждого метода экземпляра

public class WineChiller {

    // instance member fields
    private double wineTemp;
    private double preferredTemp;
    private double chillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        this.preferredTemp = preferredTemp;
        this.chillTemp = chillTemp;

        getChillingTime();
    }

    public void getChillingTime() {
        // ...
    }
}
0
ответ дан Ravi Thapliyal 31 August 2018 в 19:25
поделиться

Объем переменных, переданных методу, - это сам метод

. Другими словами, переменная, переданная методу, уничтожается (сбор мусора) после завершения выполнения метода .

Конструкторы - это особый тип методов , которые используются для создания экземпляров этого типа.

Поскольку вы не создали копию переданных переменных для конструктора в типе они потерялись, следовательно, ваша ошибка.

Чтобы заставить ваш код работать, объявите поля в своем классе

public class WineChiller {

    private double wineTemp;
    private double preferredTemp;
    private double chillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        this.preferredTemp = preferredTemp;
        this.chillTemp = chillTemp;
        getChillingTime();

    }

    public void getChillingTime() {

        while(wineTemp>preferredTemp)
        {
            elapsedTime += DELTA_MINUTES;
            double dT = (wineTemp - chillTemp) * DELTA_MINUTES  / TAO;
            wineTemp -= dT;
        }
        System.out.println(Math.round(elapsedTime));

    }

}
2
ответ дан sanbhat 31 August 2018 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: