2010-11-13 4 views
3

Можете ли вы рассказать мне 1) почему можно назначить конструктор публичным для класса с видимым пакетом? Например:Java-головоломка: модификаторы

class TestModifiers { 
    public TestModifiers() { 

    } 
} 

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

2) скажем, во внутреннем классе я создал две переменные 10. Почему я могу видеть их из внешнего класса? Разве это не странно? Например:

class A { 
    A(){} 

    class B { 
    private int b1; 
    private int b2; 
    } 

    public static void main(String[] args) { 
    new B().b1 = 1; 
    new B().b2 = 2; 
    } 
} 
+1

Для вашего второго вопроса - это странно, и это так, как есть :) .. его обсуждали здесь раньше - http://stackoverflow.com/questions/4075262/access-modifiers-inside-a-private-static- nested-class-in-java –

+0

Спасибо !!! Не видел этого. – Dmitry

ответ

5

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

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

package mypackage; 

class MyRunnable implements Runnable { 
    private final String message; 

    MyRunnable(String message) { 
     this.message = message; 
    } 

    @Override 
    public void run() { 
     System.out.println(this.message); 
    } 
} 

public class Surprises { 
    public static Runnable getSurprise() { 
     return new MyRunnable("boo!"); 
    } 
} 

код вне mypackage может затем получить MyRunnable экземпляр (как Runnable) и вызвать публичный метод:

Runnable r = Surprises.getSurprise(); 
r.run(); 

Я проигнорирую ваш второй вопрос, так как он ответил в другом месте в комментариях.

+0

Вот что мне нужно! Большое спасибо! – Dmitry

-1

1) почему можно назначить конструктор общедоступной для пакета невидимого класса?

Это гораздо удобнее, чем могло бы быть.

Только представьте, что у вас есть открытый класс, а затем вы понимаете, что можете сделать его закрытым, а после этого компилятор сообщает вам, что существует 45 ошибок (для каждого из ваших общедоступных методов).


Невозможно ответить на ваш второй вопрос. Я также думаю, что это странно.

+0

@ Downvoter: не забывайте оставлять комментарии. – Roman

+2

-1 Я прочитал этот ответ 4 раза, и это все еще не имеет смысла для меня. – Asaph

+2

Я тоже. Пожалуйста, дайте более подробный ответ – Dmitry

1

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

abstract class MyBaseClass { 
    public abstract void method(); 
} 

public class MySubClass extends MyBaseClass { 
    @Override public void method() { ... } 
} 

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

+5

Но вы всегда можете дать переопределенному методу большую видимость, чем соответствующий метод в суперклассе. В приведенном выше примере вы могли бы оставить ключевое слово 'public' вне' MyBaseClass.method() ', и все будет прекрасно компилироваться. – Asaph

+0

Это сообщение снова поднимает вопрос! – Dmitry

1
  1. Это может быть полезно для наследования.
  2. class B, B.b1,b2 принадлежит к классу А, они находятся внутри А.
+1

Не могли бы вы быть более подробными? – Dmitry

+0

класс B внутри класса A. Почему частные члены B не должны быть видны для класса A? – khachik

+0

1.) доступ к пакетам также будет выполняться для наследования - если класс имеет доступ к пакету, вы должны быть в одном пакете для его расширения. –

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