2013-02-19 6 views
0

Java Документация говорит, что NumberFormat является абстрактным классом. Но следующая строка кода меня путает.Использование абстрактного класса в Java

NumberFormat nf = NumberFormat.getInstance(); 

Как мы можем использовать это NumberFormat.getInstance() когда NumberFormat является абстрактным классом? Может ли кто-нибудь помочь мне в понимании этого, пожалуйста?

+0

'NumberFormat.getInstance' - статический метод. Абстрактные классы могут иметь статический метод. По-видимому, этот возвращает подкласс 'NumberFormat' (' NumberFormatImpl', возможно?) –

ответ

2

Метод getInstance() возвращает подкласс NumberFormat - значение по умолчанию для вашей локали.

6

NumberFormat.getInstance() является static factory method, который может вернуть экземпляр конкретного подкласса абстрактного NumberFormat класса:

Это что-то вроде этого:

abstract class Instrument { 
    public static Instrument getInstance() { 
     return new Guitar(); 
    } 
} 

class Guitar extends Instrument { } 

Так что, когда вы звоните:

Instrument.getInstance(); 

Вы получите экземпляр Guitar, который является конкретным подклассом.

0

NumberFormat.getInstance() возвращает не абстрактные DecimalFormat реализация по умолчанию.

2

позвонитьNumberFormat.getInstance(), потому что это статический метод. Вам не нужен экземпляр класса для вызова статического метода в этом классе.

NumberFormat.getInstance() может объявить тип возвращаемого NumberFormat, потому что он будет фактически возвращает экземпляр конкретного подкласса - но это совместимо с NumberFormat таким же образом, что это работает:

String x = "test"; 
Object y = x; 

Если распечатать NumberFormat.getInstance().getClass() вы увидите, какой действительный используется конкретный подкласс - но вы не должны зависеть от него, возвращающего какой-либо конкретный класс; Дело в том, что вы просто должны использовать методы, указанные на NumberFormat.

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