как использовать внутренний класс вне пакета - PullRequest
1 голос
/ 25 февраля 2011

У меня есть внутренний класс, который присутствует внутри метода, и у этого класса есть метод.

Я хочу использовать метод, который присутствует в моем методе внутреннего класса вне моего текущего пакета. Можете ли вы предложить мне, как его использовать?

package com.a3.local;
public class OuterClass
{
    public void outerMethod()
    {
        class InnerClazz
        {
            public void wakeUp()
            {
                System.out.println("Good Morning");
            }
        }
    }
}

Ответы [ 6 ]

2 голосов
/ 23 июня 2015

Мы можем получить доступ к методу внутреннего класса вне пакета.Нам нужно создать экземпляр Outerclass, а затем создать экземпляр внутреннего класса, используя внешний класс.После этого мы можем назвать это.

код из учебника: http://www.oursland.net/tutorials/java/innerclasses/



    public class InnerClassTest {
        public void foo() {
            System.out.println("Outer class");
        }

        public class ReallyInner {
            public void foo() {
                System.out.println("Inner class");
            }

            public void test() {
                this.foo();
                InnerClassTest.this.foo();
            }
        }

        public static void main(String[] args) {
            InnerClassTest o = new InnerClassTest();
            InnerClassTest.ReallyInner i = o.new ReallyInner();
            i.test();

2 голосов
/ 25 февраля 2011

Как объяснили другие, вы можете получить доступ к локально определенному внутреннему классу вашего метода (используя интерфейс => см. Другие ответы).

В любом случае, я не думаю, что это цель определения локального метода-метода.

1 голос
/ 25 февраля 2011

Насколько я понял, код выглядит так:

class Outer
{
  public void someMethod()
  {
    class Inner{
      public void methodThatShouldBeVisibleOutside() {}
    }
  }
}

Единственный способ - класс Inner реализует общедоступный интерфейс InnerInterface, возвращать экземпляр класса Inner и вызывать methodThatShouldBeVisibleOutside:

public InnerInterface someMethod()
{
  class Inner implements InnerInterface()
  {
    @Override
    public void methodThatShouldBeVisibleOutside() {}
  }
  return new Inner();
}

Тогда

new Outer().someMethod().methodThatShouldBeVisibleOutside();
1 голос
/ 25 февраля 2011

Если внутренний класс определен в методе, то для вызова его методов (без отражения) требуется:

  • Класс реализует интерфейс, доступный для вызывающей стороны.
  • Экземпляр класса доступен для вызывающей стороны.

Есть пример на http://java.sun.com/new2java/divelog/part5/page5.jsp.

0 голосов
/ 25 февраля 2011

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

Тогда есть две возможности:

  1. Вы хотите вызвать статический метод вашего внутреннегоclass
  2. Вы хотите вызвать метод для экземпляра вашего внутреннего класса

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

OuterClass.InnerClass.myStaticMethod()

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

Это такжеМожно вызвать метод в нестатическом внутреннем классе, но это намного сложнее.Здесь действительно поможет фрагмент кода;)

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2011

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

Если у вас есть класс mypackage.Outer, который определяет внутренний class Inner, вы можете обратиться к классу, используя имя mypackage.Outer.Inner, и импортировать его как обычно, чтобы сократить имя.

Если он статический, вы можете создать его, используя new mypackage.Outer.Inner(...).

Если это не статично, вы должны использовать другой синтаксис для их создания: myOuterInstance.new mypackage.Outer.Inner(...).

...