2015-08-12 4 views
1
package p1; 

public class demo1{ 

    public static void main(String []args){ 

    } 
    protected class demo12{ 

     protected int fun2(int a,int b){ 

      return a*b; 
    } 

} 

package p2; 
import p1.demo1; 
public class demo2{ 

    public static void main(String []args){ 
     //access fun2 method here. 
    }  

} 

Я создаю пакет p1 и создаю внутреннее имя класса demo12. И я хочу получить demo12fun2 метод в пакете p2. Как это сделать?Как получить доступ к защищенному внутреннему классу внешнего пакета?

Любое изменение в классе demo2. И прямо или косвенно я хочу получить доступ к этому методу из класса demo2 без кода изменения demo1.

ответ

4

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

Проверьте разницу между inner and nested classes.

Статические Вложенные Классы

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

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

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

Отредактировано:

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

Ваш внутренний класс demo12 также отмечен как защищенный, вы можете его расширить. Проверьте этот взлом:

package p2; 

import p1.demo1; 

public class demo2 extends demo1 { 

    protected int foo(int a, int b) { 
     return (new demo22()).fun2(a, b); 
    } 

    protected class demo22 extends demo12 { 
     protected int fun2(int a, int b) { 
      return super.fun2(a, b); 
     } 
    } 

    public static void main(String[] args) { 
     (new demo2()).foo(2, 3); 
    } 
} 
+0

Как это косвенно? Можешь сказать мне ? Я попытался, но я могу получить доступ только к защищенному классу, а не к методу. – Poojan

+0

У меня есть расширенный ответ. –

+0

Вы просто создаете тот же метод в demo22. Я понимаю ваш хак. Но может ли другой способ получить доступ к fun2 без создания такого же метода в классе demo22? Спасибо за этот .... @ Maciej Lach – Poojan

0

Вашего класс demo2 должны наследовать demo1:

class demo2 extends demo1 {...} 
+0

Сделайте что-нибудь с демо-классом класса class2, но скажите, как получить доступ к fun2? – Poojan

+0

см. @Maciej Lach ответить – ka4eli

Смежные вопросы