2013-04-17 2 views
2

Я знаю, как работать с объектами .. но, в частности, у меня есть царапающая голова.
Статические методы.Как работают статические объекты?

Приведу пример.

Toolkit theKit = Toolkit.getDefaultToolkit(); 

Я думаю, что theKit объект теперь держит new Toolkit(); класс .. но им не уверен.

Кроме того, я могу сделать theKit.getScreenResolution(); сейчас с theKit ссылочной переменной.

Это потому, что Thetoolkit класс он сам содержит этот способ?

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

+0

вы отвечаете на собственный вопрос..Toolkit.getDefaultToolkit() эквивалентен новому Toolkit(); Это как singleton –

+1

@Arun не нужно (вы можете иметь 'foo(); ... bar(); возвращать новый Toolkit();') внутри этого метода черного ящика. –

+2

@ Аргун «эквивалент» не является правильным словом. В этом методе гораздо больше происходит, чем просто «вернуть новый Toolkit()». – Dukeling

ответ

1

Это дизайн-паттен. Теперь, учитывая случай, необходимо, чтобы Toolkit оставался одиночным. Итак, дизайнер библиотеки убедился, что он остается одиночным, предоставляя метод getDefaultToolkit.

getDefaultToolkit возвращает Toolkit, который может использовать пользователь библиотеки.

Теперь, чтобы обеспечить доступ к такому способу, учитывая один косяк инициализировать Toolkit по «новому Toolkit()`, библиотека предоставляет статический метод, который дает доступ к нему

+1

Я не думаю, что это как-то очищает что-либо для оп –

+1

Не обязательно синглтон. –

+0

Да. Но «Инструментарий» - одноэлементный. И, следовательно, метод используется для его возврата – Jatin

5

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

+0

Большое вам спасибо за ответ. Это помогло. –

1

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

public class MyClassExample(){ 

public static MyClassExample getDefaultInstance(){ 
return new MyClassExample(); 
} 

} 

Тогда вы можете создать экземпляр MyClassExample таким образом:

MyClassExample example = MyClassExample.getDefaultInstance(); 
1
Toolkit theKit = Toolkit.getDefaultToolkit(); 

выше линией является factory метода, чтобы получить экземпляр класса и getDefaultToolkit() является фабричным методом, и это, очевидно, статический метод (поэтому вы вызываете непосредственно имя класса), который возвращает экземпляр класса (в вашем случае это класс Toolkit). Мы также используем этот метод в случае singleton.

И в отношении вашего вопроса да, поскольку класс содержит метод getScreenResolution(), поэтому вы можете его назвать, и это очевидно.

1

Toolkit.getDefaultToolkit() является статическим вспомогательным методом фабрики, чтобы получить экземпляр класса ToolKit. «TheKit» является допустимым экземпляром, и вы можете использовать его так же, как вы используете при создании экземпляра объекта с новым.Имея такой вспомогательный метод является наилучшей практикой, как указано в эффективной Java книге «Рассмотрят статические фабричные методы вместо конструкторов»

1

метод getDefaultToolkit() является static, что означает, что вам не нужен инстанцированный объект Toolkit класса доступ Этот метод. Когда класс известен JVM, он существует, и статический метод может быть доступен в любое время. Это потому, что они никогда не изменятся! Они не изменят свое состояние, они никогда не сделают что-то еще, но возвратят объект Toolkit в этом случае.

И вот я это сказал. Внутренне я предполагаю, что метод Toolkit.getDefaultToolkit() делает что-то вроде этого:

public Toolkit getDefaultToolkit(){ 
    return new Toolkit(); 
} 

Ну это было бы слишком легко, но где-то в этом статический метод будет создан объект и возвращается.

Итак, ваша переменная theKid действительно содержит ссылку на реальный Object. Нестационарный экземпляр, который может меняться и что-то делать. Например, с помощью метода theKit.getScreenResolution() он может дать вам разрешение текущего экрана. Не только a разрешение .. но точное разрешение (которое меняется на каждом устройство с каждым экраном) - это означает, что этот метод не может быть статичным, но нуждается в объекте.

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