Java method local classes

Локальный внутренний класс в Java

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

Синтаксис

Ниже приведен синтаксис для написания вложенного класса. Здесь класс Outer_Demo является внешним классом, а класс Inner_Demo является вложенным классом.

Вложенные классы делятся на два типа.

  • Нестатические вложенные классы – это нестатические члены класса.
  • Статические вложенные классы – это статические члены класса.

Внутренние классы (нестатические вложенные классы)

Внутренние классы – это механизм безопасности в Java. Мы знаем, что класс не может быть связан с модификатором доступа private, но если у нас есть класс как член другого класса, то внутренний класс можно сделать приватным. И это также используется для доступа к закрытым членам класса.

Внутренние классы бывают трех типов в зависимости от того, как и где вы их определяете. Они –

  • Внутренний класс
  • Метод локального внутреннего класса в Java
  • Анонимный внутренний класс

Внутренний класс

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

Ниже приведена программа для создания внутреннего класса и доступа к нему. В данном примере мы делаем внутренний класс закрытым и обращаемся к нему через метод.

Пример

class Outer_Demo < int num; // inner class private class Inner_Demo < public void print() < System.out.println("This is an inner class"); >> // Accessing he inner class from the method within void display_Inner() < Inner_Demo inner = new Inner_Demo(); inner.print(); >> public class My_class < public static void main(String args[]) < // Instantiating the outer class Outer_Demo outer = new Outer_Demo(); // Accessing the display_Inner() method. outer.display_Inner(); >>

Здесь вы можете заметить, что Outer_Demo – это внешний класс, Inner_Demo – это внутренний класс, display_Inner() – это метод, внутри которого мы создаем экземпляр внутреннего класса, и этот метод вызывается из основного метода.

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат.

Итог

Доступ

Как упоминалось ранее, внутренние классы также используются для доступа к закрытым членам класса. Предположим, у класса есть частные члены для доступа к ним. Напишите в нем внутренний класс, верните закрытые члены из метода внутреннего класса, скажем, getValue(), и, наконец, из другого класса (из которого вы хотите получить доступ к закрытым членам), вызовите метод getValue() внутреннего учебный класс.

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

Outer_Demo outer = new Outer_Demo(); Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

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

Читайте также:  Find on page html code

Пример

class Outer_Demo < // private variable of the outer class private int num = 175; // inner class public class Inner_Demo < public int getNum() < System.out.println("This is the getnum method of the inner class"); return num; >> > public class My_class2 < public static void main(String args[]) < // Instantiating the outer class Outer_Demo outer = new Outer_Demo(); // Instantiating the inner class Outer_Demo.Inner_Demo inner = outer.new Inner_Demo(); System.out.println(inner.getNum()); >>

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат.

Итог

This is the getnum method of the inner class: 175

Метод локального внутреннего класса

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

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

Пример

public class Outerclass < // instance method of the outer class void my_Method() < int num = 23; // method-local inner class class MethodInner_Demo < public void print() < System.out.println("This is method inner class "+num); >> // end of inner class // Accessing the inner class MethodInner_Demo inner = new MethodInner_Demo(); inner.print(); > public static void main(String args[]) < Outerclass outer = new Outerclass(); outer.my_Method(); >>

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат.

Итог

This is method inner class 23

Анонимный внутренний класс

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

Синтаксис

AnonymousInner an_inner = new AnonymousInner() < public void my_method() < . . >>;

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

Пример

abstract class AnonymousInner < public abstract void mymethod(); >public class Outer_class < public static void main(String args[]) < AnonymousInner inner = new AnonymousInner() < public void mymethod() < System.out.println("This is an example of anonymous inner class"); >>; inner.mymethod(); > >

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат.

Итог

This is an example of anonymous inner class

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

Как аргумент

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

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

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

Читайте также:  Javascript get object value by key

Пример

// interface interface Message < String greet(); >public class My_class < // method which accepts the object of interface Message public void displayMessage(Message m) < System.out.println(m.greet() + ", This is an example of anonymous inner class as an argument"); >public static void main(String args[]) < // Instantiating the class My_class obj = new My_class(); // Passing an anonymous inner class as an argument obj.displayMessage(new Message() < public String greet() < return "Hello"; >>); > >

Если вы скомпилируете и запустите вышеуказанную программу, она даст вам следующий результат.

Итог

Hello, This is an example of anonymous inner class as an argument

Средняя оценка 4.3 / 5. Количество голосов: 12

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Видим, что вы не нашли ответ на свой вопрос.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Источник

Java method local classes

Локальные классы: 1. Объект локального класса не может создаваться за пределами метода или блока, в котором его объявили. 2. Возможность доступа к локальным переменным и параметрам метода: — в Java 7 локальный класс может получить доступ к локальной переменной или параметру метода, только если они объявлены в методе как final. — начиная с Java 8 локальный класс имеет доступ Effective-final т.е к переменной, значение которой не менялось после инициализации. 3. У локального класса есть доступ ко всем (даже приватным) полям и методам внешнего класса: и к статическим, и к нестатическим. 4. Локальные классы не могут определять или объявлять какие-либо статические члены. 5. Локальные классы созданные в статических методах внешнего класса могут ссылаться только на статические члены этого внешнего класса, так нельзя: а вот так можно: 6. Нельзя объявить интерфейс внутри блока — интерфейсы по своей природе статичны, но если интерфейс объявлен внутри внешнего класса, то локальный класс может его реализовать.

Главное что я понял, это то что у локального класса есть доступ к полям и методам внешнего класса — ценное наследие от внутреннего класса.

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

Чуть не уснул пока читал это спагетти. А зачем тут что как почему вот это взялось можно сделать ? Спасибо, отличная лекция. Кстати, эта лекция вот прям похожа на лекцию 🙃 Все понятно, очень интересно, но ничего не понятно)

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

«Локальные классы похожи на внутренние классы, потому что они не могут определять или объявлять какие-либо статические члены. Локальные классы в статических методах могут ссылаться только на статические члены включающего класса. Например, если ты не определил переменную (поле) включающего класса как статическую, компилятор Java генерирует ошибку: «Из статического контекста нельзя ссылаться на нестатическую переменную». Локальные классы не статичные, потому что у них есть доступ к членам экземпляра вмещающего блока. Следовательно, они не могут содержать большинство видов статических объявлений.» — Вот что это за бред, то написано что нельзя обьявлять статические члены поля во внутренних классах, то в следующем абзаце, если не определил переменную как статическая то генерирует ошибку, это как понимать??

Читайте также:  Код символа из строки python

Источник

Java: Local methods (or submethods, or inner methods, or nested methods)

Java does not support local methods. This will not compile:

class C < void m() < void n() < System.out.println("Hello World"); > n(); > >

Here are a few alternatives that do compile…

Using a lambda (Java 8+)

class C < void m() < Runnable r = () -> < System.out.println("Hello World"); >; r.run(); > > 

You may also access local variables, pass arguments and read return values:

import java.io.PrintStream; import java.util.function.Function; class C < void m() < PrintStream pw = System.out; FunctionString, Integer> print = str -> < pw.println(str); return str.length(); >; int charsPrinted = print.apply("Hello World"); > > 

Using anonymous subclasses

Slightly more verbose than the above, but works in Java 7 and below.

class C < void m() < Runnable r = new Runnable() < public void run() < System.out.println("Hello World"); >; >; r.run(); > > 

Using local classes

class C < void m() < class Local < void n() < System.out.println("Hello World"); > > new Local().n(); > > 

Note that local classes comes with some restrictions:

  • A local class is visible only within the block that defines it; it can never be used outside that block.
  • Local classes cannot be declared public, protected, private, or static. These modifiers are for members of classes; they are not allowed with local variable declarations or local class declarations.
  • Like member classes, and for the same reasons, local classes cannot contain static fields, methods, or classes. The only exception is for constants that are declared both static and final.
  • Interfaces cannot be defined locally.
  • A local class, like a member class, cannot have the same name as any of its enclosing classes.
  • As noted earlier, a local class can use the local variables, method parameters, and even exception parameters that are in its scope, but only if those variables or parameters are declared final. This is because the lifetime of an instance of a local class can be much longer than the execution of the method in which the class is defined. For this reason, a local class must have a private internal copy of all local variables it uses (these copies are automatically generated by the compiler). The only way to ensure that the local variable and the private copy are always the same is to insist that the local variable is final. Java in a Nutshell, Chapter 3.11.2

Local Scoping

If all you’re after is localized scoping, you can simply do:

class C < void m() < < int i = 7; System.out.println(i); > // System.out.println(i); Wouldn't compile. i is out of scope. > > 

Источник

Оцените статью