2016-04-01 2 views
1

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

package testcase; 

public class B 
{ 
    int b; 
} 

И это имеет подкласс:

package testcase.sub; 

import testcase.B; 


public class C 
    extends B 
{ 
    int c; 
} 

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

package testcase; 

import testcase.sub.C; 


public class A 
{ 

    void testcase(C c) 
    { 
     c.c = 0;    // HINT 
     ((B) c).b = 1;  // FIRST 
     c.b = 2;    // SECOND 
    } 

} 

EDIT: Я абсолютно понимаю, что A не может получить доступ к c.c и почему строка, помеченная HINT, не скомпилирована: C.c видна только для кода той же упаковки и пока C.c находится в упаковке testcase.subA находится в testcase.

Однако A и B.b оба в пакете testcase так почему первое задание компиляции, а второй нет?

+0

Есть ли A, B и C в одной упаковке? – Raedwald

+0

Что заставляет вас думать, что 'testcase' - это тот же пакет, что и' testcase.sub'? –

+0

@Raedwald Каждый класс имеет декларацию своего пакета. –

ответ

2

C не имеет доступа к B.b, B.b это разрешение уровня пакета и B находится в testcase пакете, но C находится в testcase.sub пакете. Это не та же упаковка, поэтому C не имеет поля b.

+1

Обязательная ссылка на JLS: https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.6.1 (см. Пример 6.6-4) – Thomas

+0

'Bb' является уровень пакета и 'A' находится в одном пакете ... –

+0

Да, но' C' не имеет доступа к 'Bb', поэтому' '' '' '' '' '' '. Даже если 'A' имеет видимость для' B', которая не имеет никакого отношения к видимости 'C' (или в этом случае отсутствующей) к' B.b'. –

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