В каких 3 разных контекстах может быть объявлен класс? - PullRequest
4 голосов
/ 16 октября 2019

Мне сказали, что есть три различных контекста , в которых класс может быть объявлен в Java.
Это связано с расположением в программе, но я могуне думаю о том, что они есть.

Очевидно, что класс может быть объявлен вверху страницы, единственный другой пример, который я могу придумать, это как вложенный класс?
Я чувствую, что могу ошибаться.

Ответы [ 3 ]

6 голосов
/ 16 октября 2019

В пакете

package com.example.mypackage;

public class TheClass {
}

В классе

package com.example.mypackage;

public class OuterClass {
    class InnerClass {
    }
}

Анонимно

public class MainClass {
    public static void main(String[] args) {
        AbstractClass myObject = new AbstractClass() {
            // overrides and other fields of the
            // anonymous class goes in this block
        };
    }
}

РЕДАКТИРОВАТЬ: Как указано @daniu вкомментарий, класс также может быть создан в методе:

public class MainClass {
    public static void main(String[] args) {
        class MethodClass {
        }
        MethodClass myObject = new MethodClass();
    }
}
2 голосов
/ 16 октября 2019

На самом деле существует 4 различных синтаксических контекста:

  1. В контексте "единицы компиляции";т.е. объявление класса верхнего уровня.

      package foo;
      public class Bar{}
    
  2. В качестве объявления вложенного класса в объявлении класса.

      package moo;
      public class Cow {
          public class Inner {}
      }
    
  3. Какобъявление вложенного класса в объявлении метода.

      package too;
      public class Far {
          public void test() {
              class MethodInner{}
          }
      }
    
  4. как объявление анонимного класса в выражении new. Выражение может появиться в разных контекстах. Например:

      package goo;
      public class Tar {
          public void test() {
              Runnable r = new Runnable() {
                  public run() { }
              };
          }
      }
    
1 голос
/ 16 октября 2019

Это может быть то, что вы ищете:

public class TopLevel {

    public static void main(String[] args) {
        TopLevel topLevel = new TopLevel();
        Nested nested = new TopLevel.Nested();
        Inner inner = topLevel.new Inner();
    }

    public static class Nested {
    }

    public class Inner {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...