#java
#java
Вопрос:
У меня изжога от понимания области действия переменной Java. Особенно с переменными, которые ограничены для всего класса и используются в методах внутри этого класса, но не могут сохранить свои значения после выхода из метода. Я не понимаю смысла.
Если я использую переменную внутри метода, я ожидаю, что она не будет доступна вне метода. Но область действия в классе, используемая в методе в этом классе, и все же значение переменной * недоступно вне метода? После 6 часов попыток разобраться с менее чем 40 строками кода, это должно быть что-то очевидное, но я явно недостаточно умен… Какую концепцию я не понимаю в области видимости в Java?
package myExperimentTests;
import myExperiment.DataUtilities;
public class MyExperimentTests {
public static String num = "2223334444";
public static String ocn = "4134";
public static String company = "This and That, Inc.";
public static long iterations = 1000000;
public static long startTime, stopTime;
public static long accumalatedTime;
public static void main(String[] args) {
DataUtilities utils = new DataUtilities();
for (int i=0; i<iterations; i ){
startTime = System.currentTimeMillis();
utils.IsPhoneNumberChar(num.toCharArray(), 10, 10);
stopTime = System.currentTimeMillis();
accumalatedTime = stopTime - startTime;
}
System.out.println("Evaluating " num " as array of char 1Mil times: " accumalatedTime/iterations);
for (int i=0; i<iterations; i ){
startTime = System.currentTimeMillis();
utils.IsPhoneNumberString(num, 10, 10);
stopTime = System.currentTimeMillis();
accumalatedTime = stopTime - startTime;
}
System.out.println("Evaluating " num " as string 1Mil times: " accumalatedTime/iterations);
}
}
Я не уверен, почему меня просят объяснить, почему новичок должен знать, что предлагаемый ответ будет таким же, как ответ на это. Моя неопытность привела меня к мысли, что это проблема переменной области, а не проблема типа данных / разделения.
Комментарии:
1. Находятся ли эти переменные внутри
DataUtilities
класса? Если да, пожалуйста, включите этот код. Я предполагаю, что вы неправильно объявляете переменные для того, что пытаетесь сделать.2. У вас есть только один метод, можете ли вы включить код метода, в котором переменная «недоступна вне метода»?
3.Область действия в Java очень проста, переменная доступна в любом месте внутри
{
}
они определены непосредственно внутри и в любом месте, где вы можете получить ссылку на них.4. Учитывая этот код, в чем реальная проблема?
5. Во втором цикле вы устанавливаете значение accumalatedTime (кстати, правильное написание — накопленный fwiw) равным нулю на каждой итерации цикла. Вы уверены, что это то, что вы намеревались?
Ответ №1:
Проблема связана с типами данных. Длинный / плавающий / деление и т.д.
System.out.println("Evaluating " num " as array of char 1Mil times: " (float)accumalatedTime/(float)iterations);
Кроме того, небольшой совет по отладке:
выведите значение каждого параметра (и / или используйте отладчик), а не только вычисление, например
System.out.println("accumulatedTime " accumalatedTime);
System.out.println("iters " iterations);
System.out.println("Evaluating " num " as array of char 1Mil times: " (float)accumalatedTime/(float)iterations);
Комментарии:
1. Я использовал отладчик. Спасибо, что указали тип данных… все, что требуется, — это немного неопытности, чтобы помочь сделать проблемы хуже, чем они есть на самом деле.