2013-09-18 6 views
0

Даны:статические члены Повсеместно статические методы

public class Base { 
    public static final String FOO = "foo"; 
    public static void main(String[] args) { 
     Base b = new Base(); 
     Sub s = new Sub(); 
     System.out.print(Base.FOO);  // <- foo 
     System.out.print(Sub.FOO);  // <- bar 
     System.out.print(b.FOO);   // <- foo 
     System.out.print(s.FOO);   // <- bar 
     System.out.print(((Base)s).FOO); // <- foo 
    } 
} 

class Sub extends Base { 
    public static final String FOO="bar"; 
    } 

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

+2

Почему бы вам просто не запустить пример? –

+1

'line 8'? да, извините, но мы не можем справиться с вашей домашней работой таким образом. отредактируйте свое сообщение –

+2

. Это противоположность: к экземплярам могут обращаться только экземпляры, когда к классам могут быть доступны оба способа: статический или экземпляр – Aerospace

ответ

5

Я собираюсь вариант D.

Статические члены разрешаются во время компиляции, используя тип объявил, не фактической типа.

Именно поэтому ((Base)s).FOO) относится к Base.FOO - хотя объект является Sub.

Это также будет иметь место, а лучше всего проиллюстрировано, в следующем:

Base b = new Sub(); // valid 
System.out.print(b.FOO); // foo 

Здесь b.FOO относится к Base.FOO из-за типа объявлена ​​, даже если экземпляр является Sub.

3

Возможно ли это?

Да, это возможно, хотя и не очень хорошая практика. В принципе, доступ к статическому члену в поле разрешается во время компиляции как доступ к объявленному типу поля.

Например, даже ниже случай будет работать нормально:

class Test { 
    public static String hello = "Hello"; 
} 

Test test = null; 
System.out.println(test.hello); 

Оператор печати не будет бросать NPE, как и следовало ожидать, это на первый взгляд. Поскольку доступ эффективно решается на:

Test.hello 

Поскольку объявленный тип test является Test, доступ разрешен таким образом.


Теперь, так как статический доступ поля решается с помощью описанного типа во время компиляции, поэтому вы не увидите полиморфное поведение для статических методов. Похоже, вы не можете переопределить статические методы.

+0

спасибо за разъяснение rohit jain – user2789395

+0

@ user2789395 Добро пожаловать :) –

1

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

ИМО - это плохая практика, потому что это вводит в заблуждение/неинтерактивно.

В самом деле, вы можете использовать null ссылку, например,

Base base = null; 
System.out.println(base.FOO); 
1

You может доступа статические переменные с помощью ссылок. Но нормально, вы должны получить предупреждение от своего компилятора ....

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