В чем разница между квалифицированным именем и выражением доступа к полю?

Из подробностей JLS о защищенном доступе:

Пусть C будет классом, в котором объявлен защищенный член. Доступ разрешен только в теле подкласса S класса C.

Кроме того, если Id обозначает поле экземпляра или метод экземпляра, то:

Если доступ осуществляется по квалифицированному имени Q.Id, где Q - ExpressionName, то доступ разрешен тогда и только тогда, когда тип выражения Q - S или подкласс S.

Если доступ осуществляется с помощью выражения доступа к полю E.Id, где E является первичным выражением, или с помощью выражения E.Id вызова метода (...), Где E является первичным выражением, то доступ разрешен тогда и только если тип E - S или подкласс S.

В чем разница между полным именем и выражением доступа к полю?


person Geek    schedule 12.03.2013    source источник


Ответы (2)


Если имя выражения имеет форму Q.Id, то Q уже был классифицирован как имя пакета, имя типа или имя выражения.

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

нашел вышеуказанный текст на веб-сайте Oracle.

так что простыми словами:

  1. Полное имя означает, что в объявлении содержится информация о родителе. например, для Pack1.Pack2.Pack3.Class1 и Pack1.Pack2.Pack4.Class2

в Pack4 мы можем получить доступ к Class1 одним из следующих способов: Pack3.Class1 или Pack2.Pack3.Class1 или Pack1.Pack2.Pack3.Class1, где последним будет полностью определенное имя.

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

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

ССЫЛКА: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11 http://docs.oracle.com/javase/specs/jls/se7/html./jls-6.html#jls-6.5.6.2

person Ankit    schedule 12.03.2013

qualified name имеет смысл с точки зрения имени класса (подумайте об этом с точки зрения статики). где as выражение доступа к полю похоже на указание Fully Qualified Name в терминах ссылки для конкретного объекта класса, включая имена методов.

Пример :

public class A
{
    public static void method1()
    {//does something
    }
}

public class B 
{
     public int dummy;
     public void hello()
     {
          System.out.println("Hello!");
     }
}

public class Main 
{
     public static void main(String[] args) 
     {
          B b = new B();
          b.dummy=1;
          b.hello();
     }
}

здесь, в вышеупомянутых классах, если мы скажем

A.method1() 

это скорее квалифицированное имя, где как

b.hello(); 
b.dummy

больше похоже на выражение доступа к полю.

person codeMan    schedule 12.03.2013