Я нашел чистое решение CSS, которое очень хорошо работало для меня во всех браузерах:
span {
display: table-cell;
}
Хотя это возможно, возможно, на таких языках, как 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
I подумайте, что вы в основном боретесь с многословием Java, где вам нужно явно копировать аргументы конструктора в поля экземпляра, чтобы реализовать инкапсуляцию . Другие языки решили это более элегантно, где конструкторы могут быть неявно определены вместе с самим классом. Тем не менее, они все равно перейдут на что-то эквивалентное приведенному выше Java-коду. Например:
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 /
class Point(Float x, Float y) { ... }
object origin extends Point(0.0, 0.0) {}
Пример отсюда: http://ceylon-lang.org/documentation/1.0/spec/html_single/
wineTemp
, который вы принимаете в конструкторе, необходимо установить где-нибудь, чтобы он был доступен в рамках метода getChillingTime
.
Предлагаемое исправление
public class WineChiller {
private double wineTemp;
public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
this.wineTemp = wineTemp;
...
}
...
В вашей основной функции это похоже на это
WineChiller wineChiller = new WineChiller();
wineChiller.getChillingTime(wineTemp, preferredTemp, chillTemp);
В вашем классе WineChiller есть способ получить эти входные данные
public void getChillingTime(double wineTemp, double preferredTemp, double chillTemp)
{
//do something
}
Переменные, переданные в качестве аргументов методу, являются локальными только для этого метода. Если вы хотите использовать их в другом методе, вы должны либо сохранить их как переменную экземпляра, либо передать их снова как аргументы.
public class WineChiller {
double mWineTemp;
double mPreferredTemp;
double mChillTemp;
public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
mWineTemp = wineTemp;
mPreferredTemp = preferredTemp;
mChillTemp = chillTemp;
getChillingTime();
}
Почему не удается getChillingTime разрешить winTemp и т. д. переменным?
blockquote>То, как работают локальные переменные.
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 рекомендуем второй подход, который является стандартным способом.
Либо передайте аргументы, потому что область параметров не выходит за пределы самого метода
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() {
// ...
}
}
Объем переменных, переданных методу, - это сам метод
blockquote>. Другими словами, переменная, переданная методу, уничтожается (сбор мусора) после завершения выполнения метода .
Конструкторы - это особый тип методов , которые используются для создания экземпляров этого типа.
Поскольку вы не создали копию переданных переменных для конструктора в типе они потерялись, следовательно, ваша ошибка.
Чтобы заставить ваш код работать, объявите поля в своем классе
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)); } }