Nano Hash - криптовалюты, майнинг, программирование

локальная область в Java

Почему фигурные скобки не определяют отдельную локальную область видимости в Java? Я ожидал, что это будет функция, общая для основных языков с фигурными скобками (C, C++, Java, C#).

class LocalScopeTester
{
    public static void main(String... args)
    {
        Dog mine = new Dog("fido");
        if (mine.getName().equals("ace"))
        {
            Dog mine = new Dog("spot"); // error: duplicate local
        }
        else
        {
            Dog mine = new Dog("barkley"); // error: duplicate local
            {
                Dog mine = new Dog("boy"); // error: duplicate local
            }
        }
    }
}
31.08.2011


Ответы:


1

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

Но вы можете определить новые переменные (с другими именами), и их область действия будет ограничена фигурными скобками.

31.08.2011

2

Затенение локальной переменной специально запрещено в Java (см. answer).
Идея состоит в том, что это помогает уменьшить количество ошибок.

31.08.2011

3

Скобки действительно охватывают переменную, но все, что находится внутри скобок, также может «видеть» дальше скобки. Во всех случаях, которые у вас есть, mine уже определен как фидо.

Если говорить более кратко. Дети также привязаны к своим родителям, но не наоборот.

31.08.2011

4

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

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

31.08.2011

5

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

31.08.2011
  • +1 за отсутствие доступа к скрытой переменной. В других видах затенения вы можете обойти это (например, this.foo). 31.08.2011

  • 6

    Он определяет локальную область... переменные, объявленные внутри фигурных скобок, имеют область действия фигурных скобок. Однако то, что вы пытаетесь сделать, это повторно объявить уже существующую переменную. На мой взгляд, в данном случае неправа не Java, а C++, который позволяет вам это делать (я предполагаю, что вы сравнивали его с этим). Тем не менее, даже если бы язык позволял это, зачем бы вы это делали? Плохая читаемость прямо здесь и возможная причина ошибок.

    31.08.2011

    7

    Запустите это, и вы получите сообщение об ошибке, что переменная уже объявлена ​​как int i=5 и ее нельзя переопределить. Итак, Родитель никогда не берет то, что есть у его ребенка. Итак, что, если Родитель пожертвует и удалит свое объявление int i=5?

    public class Ouch { 
        public static void main(String[] args) { 
    
            int i=5;
    
            for(int i=0;i<5;i++);
            for(int i=0;i<5;i++);
        } 
    } 
    

    Теперь родитель пожертвовал своим объявлением, и оба потомка получают удовольствие, и код работает успешно.

    public class Ouch { 
        public static void main(String[] args) { 
    
            //int i=5;
    
            for(int i=0;i<5;i++);
            for(int i=0;i<5;i++);
        } 
    }
    
    01.02.2015

    8

    Это забыто в Java, но я думаю, что Java неверна, потому что во ВСЕХ «блочных» языках разрешено делать это (не только в C++, но и в Pascal, ADA, C и т. д.) и иногда мы хотим скрыть переменную окружающего блока.

    24.06.2012
  • Затенение локальных переменных внутри метода приводит к ошибкам. 03.05.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..