Enclosing class что это java

Ошибка «Is not an enclosing class» в Java

В программировании на Java иногда возникает ошибка «Is not an enclosing class». Эта ошибка обычно возникает, когда программист пытается создать объект внутреннего класса извне его внешнего класса.

Чтобы понять проблему, рассмотрим в качестве примера следующий код:

public class OuterClass < class InnerClass < >> public class Test < public static void main(String[] args) < InnerClass ic = new OuterClass.InnerClass(); >>

В этом примере попытка создать объект InnerClass из класса Test вызовет ошибку компиляции «Is not an enclosing class».

Это происходит потому, что внутренний класс InnerClass не является статическим и, следовательно, не может быть инстанциирован без объекта внешнего класса OuterClass .

Существует два основных способа решения этой проблемы:

  1. Изменить внутренний класс, чтобы сделать его статическим. Статический внутренний класс не требует объекта внешнего класса для его создания.
public class OuterClass < static class InnerClass < >> public class Test < public static void main(String[] args) < InnerClass ic = new OuterClass.InnerClass(); >>
public class OuterClass < class InnerClass < >> public class Test < public static void main(String[] args) < OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); >>

В обоих примерах ошибки компиляции больше нет.

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

Источник

What’s that «MainActivity.this is not enclosing class» error actually?

I’m having problem in executing the following code. Actually I wanted to use an image as a link to another page or activity. How it’s done and what’s that «MainActivity.this is not enclosing class» problem actually? Here is a code I have 2 classes, 1st is MainActivity and 2nd is MainActivity2 both are in Single MainAcitvity.java file MainActivity:

import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageButton; import android.widget.Toast; import android.content.Intent; import android.util.Log; public class MainActivity extends AppCompatActivity < ImageButton androidImageButton; @Override protected void onCreate (Bundle savedInstanceState)< super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View view) < Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); >>); androidImageButton = (ImageButton) findViewById(R.id.imageButton_android); androidImageButton.setOnClickListener (new View.OnClickListener() < @Override public void onClick(View v) < Toast.makeText(MainActivity.this, "It works", Toast.LENGTH_LONG).show(); >>); > public boolean onCreateOptionsMenu (Menu menu) < // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; >public boolean onOptionsItemSelected (MenuItem item) < // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int //noinspection SimplifiableIfStatement if (id == R.id.action_settings) < return true; >return super.onOptionsItemSelected(item); > > 
class MainActivity2 extends MainActivity implements OnClickListener, View.OnClickListener < ImageButton Btn; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton Btn = (ImageButton) findViewById(R.id.imageButton_android); Btn.setOnClickListener(this); >@Override public boolean onCreateOptionsMenu(Menu menu) < // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; >@Override public void onClick(View v) < Log.i("clicks","You Clicked B1"); Intent i; i = new Intent( MainActivity.this, MainActivity2.class); *//The problem is here wih MainActivity.this// startActivity(i); >> 

Источник

Вложенные классы в Java

Это руководство представляет собой краткое и точное введение во вложенные классы на языке Java.

Проще говоря, Java позволяет нам определять классы внутри других классов. Nested classes enable us to logically group classes that are only used in one place, write more readable and maintainable code and increase encapsulation.с

Прежде чем мы начнем, давайте взглянем на несколько типов вложенных классов, доступных в языке:

  • Статические вложенные классы
  • Нестатические вложенные классы
  • Местные занятия
  • Анонимные занятия

В следующих разделах мы подробно обсудим каждый из них.

2. Статические вложенные классы

Вот несколько моментов, которые следует помнить о статических вложенных классах:

  • Как и в случае статических членов, они принадлежат их классу, а не экземпляру класса.
  • Они могут иметь все типы модификаторов доступа в своем объявлении
  • Они имеют доступ только к статическим членам в классе включения
  • Они могут определять как статические, так и нестатические элементы.

Давайте посмотрим, как мы можем объявить статический вложенный класс:

public class Enclosing < private static int x = 1; public static class StaticNested < private void run() < // method implementation >> @Test public void test() < Enclosing.StaticNested nested = new Enclosing.StaticNested(); nested.run(); >>

3. Нестатические вложенные классы

Далее, несколько простых моментов, которые следует помнить о нестатических вложенных классах:

  • Их также называют внутренними классами
  • Они могут иметь все типы модификаторов доступа в своем объявлении
  • Как и переменные экземпляра и методы, внутренние классы связаны с экземпляром включающего класса.
  • Они имеют доступ ко всем членам включающего класса, независимо от того, являются ли они статическими или нестатическими
  • Они могут определять только нестатические элементы

Вот как мы можем объявить внутренний класс:

Если мы объявляем вложенный класс с модификаторомstatic, то это статический член. В противном случае это внутренний класс. Хотя синтаксически разница заключается всего в одном ключевом слове (например,static), семантически существует огромная разница между этими типами вложенных классов. Экземпляры внутреннего класса связаны с классами включения и поэтому имеют доступ к своим членам. Мы должны знать об этой проблеме, выбирая, делать ли вложенный класс внутренним.

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

Посмотрим, как мы можем это сделать:

Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();

В следующих подразделах мы собираемся показать некоторые особые типы внутренних классов.

3.1. Местные классы

Локальные классы — это особый тип внутренних классов, в которомthe class is defined inside a method или блок области видимости.

Давайте посмотрим, что нужно помнить об этом типе занятий:

  • Они не могут иметь модификаторы доступа в своем объявлении
  • Они имеют доступ как к статическим, так и к нестатическим элементам в окружающем контексте.
  • Они могут определять только элементы экземпляра.
public class NewEnclosing < void run() < class Local < void run() < // method implementation >> Local local = new Local(); local.run(); > @Test public void test() < NewEnclosing newEnclosing = new NewEnclosing(); newEnclosing.run(); >>

3.2. Анонимные классы

Анонимные классы могут использоваться для определения реализации интерфейса или абстрактного класса без необходимости создания реализации многократного использования.

Давайте перечислим несколько моментов, которые следует помнить об анонимных занятиях:

  • Они не могут иметь модификаторы доступа в своем объявлении
  • Они имеют доступ как к статическим, так и к нестатическим элементам в окружающем контексте.
  • Они могут определять только элементы экземпляра.
  • Это единственный тип вложенных классов, который не может определять конструкторы или расширять / реализовывать другие классы или интерфейсы.

Чтобы определить анонимный класс, давайте сначала определим простой абстрактный класс:

abstract class SimpleAbstractClass

Теперь давайте посмотрим, как мы можем определить анонимный класс:

public class AnonymousInnerTest < @Test public void whenRunAnonymousClass_thenCorrect() < SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() < void run() < // method implementation >>; simpleAbstractClass.run(); > >

Для получения дополнительных сведений мы можем найти полезным наш учебник поAnonymous Classes in Java.

4. Слежка

The declaration of the members of an inner class shadow those of the enclosing class, если у них одинаковое имя.

В этом случае ключевое словоthis относится к экземплярам вложенного класса, а на члены внешнего класса можно ссылаться, используя имя внешнего класса.

Давайте посмотрим на быстрый пример:

5. Сериализация

Чтобы избежатьjava.io.NotSerializableException при попытке сериализации вложенного класса, мы должны:

  • Объявите вложенный класс какstatic
  • Сделайте как вложенный класс, так и включающий класс реализациейSerializable

6. Заключение

В этой статье мы увидели, что такое вложенные классы и их типы. Мы также рассмотрели разницу между видимостью полей и модификаторами доступа для разных типов.

Как всегда, полную реализацию этого руководства можно найти вover on GitHub.

Источник

Читайте также:  Создание html главной страницы
Оцените статью