область действия переменной для всего класса

#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. Я использовал отладчик. Спасибо, что указали тип данных… все, что требуется, — это немного неопытности, чтобы помочь сделать проблемы хуже, чем они есть на самом деле.