2014-07-22 16 views
7

Słowo kluczowe "abstrakcyjne" oznacza, że ​​nie można utworzyć wystąpienia klasy (obiektu).Dlaczego Java.Lang.Math nie jest abstrakcyjna?

Java.Lang.Math poprzedza następujących słów kluczowych

public final class Math { 
... 
} 

ale nie "abstrakcyjnego" słowo kluczowe. Klasa dostarcza po prostu kolekcję powiązanych ze sobą zmiennych i metod , takich jak PI i sin().

Statyczny oznacza, że ​​te zmienne/metody nie mogą być unikalne między różnymi instancjami obiektu (istnieje tylko jedna kopia tych zmiennych/metod związanych z samą klasą). Dlaczego więc zezwolić programistowi na stworzenie instancji klasy? Dlaczego nie poprzedzić "abstrakcją"?

+10

Powinieneś zauważ, że ma prywatnego konstruktora, więc nikt nie może go stworzyć. – FDinoff

+0

'abstract' oznacza, że ​​nie możesz utworzyć instancji, ale możesz przesłonić i WTEDY stworzyć instancje. Tworzysz instancje 'List', kiedy deklarujesz' new LinkedList() 'nawet jeśli' List' jest abstrakcyjna. "final" oznacza, że ​​nie można go przesłonić. – ryvantage

Odpowiedz

10

java.lang.Math jest klasą Utility (zawiera tylko statyczne metody użytkowych).

poprawny sposób definiować klasę użytkową jest stworzenie końcowy tak, że żadna inna klasa może go przedłużyć i mieć prywatnej nie-args konstruktora tak, że nikt nie może utworzyć instancję klasy.

W ten sposób nie będzie możliwe tworzenie instancji klasy. Jednak jeśli podchodzisz do podejścia abstrakcyjnego, nie możesz użyć final i nie ma możliwości, aby zapobiec jego przedłużeniu. Stąd wcześniejsze podejście jest lepsze.

+0

Wybrałem to jako rozwiązanie, ponieważ zwięźle łączy odpowiedzi Braj i KarolS, i podoba mi się, że nazwałeś to klasą "Użyteczności", która eksponuje intencję, że klasa nie powinna być ani Utworzony lub rozszerzony, ale używany tak jak jest. –

+0

@NikoBellic Dodałem trochę więcej punktów o niezmiennym obiekcie. czytaj dalej ... – Braj

14

final i abstract słowa kluczowe nie mogą być stosowane łącznie, ponieważ final klasa nie może być przesłonięta i abstract zajęcia są przeznaczone do ręcznego.

Klasa, która jest zadeklarowana final nie może być subclassed, który jest używany do tworzenia klasy immutable takich jak String

Lepiej wyjaśniono w JSL section - 8.1.1. Class Modifiers

  1. abstract klasą jest klasa to jest niekompletne lub uważane za niekompletne.

  2. Klasa może być zadeklarowana jako final, jeśli jej definicja jest pełna i nie są pożądane żadne podklasy.

oba powyższe stwierdzenia są sprzecznekażdy-inne.


Jeśli chcesz dowiedzieć się więcej o czym rzucić okiem na Java Tutroial na A Strategy for Defining Immutable Objects

  1. nie zapewniają „setter” metod - metody, które modyfikują pola lub przedmioty wymienione przez pola .
  2. Uczyń wszystkie pola ostatecznymi i prywatnymi.
  3. Nie zezwalaj podklasom na zastępowanie metod. Najprostszym sposobem, aby to zrobić, jest zadeklarowanie the class as final. Bardziej wyrafinowane podejście polega na tworzeniu the constructor private i konstruowaniu instancji w factory methods.
  4. Jeśli pola instancji zawierają odniesienia do obiektów zmiennych, nie zezwalaj na ich zmianę:
    • Nie podawaj metod, które modyfikują zmienne obiekty.
    • Nie udostępniaj referencji do obiektów zmiennych.
+0

Gotchya. Zakładam, że masz na myśli "rozszerzony" przez "przesłonięty" (choć przypuszczam, że są one wymienne). Na początku nie ma dla mnie sensu, aby ostateczne i abstrakcyjne wzajemnie się wykluczały, bo co by było, gdybyś chciał klasę, która nie mogłaby być ani rozszerzona, ani utworzona. Myślałem, że ta sytuacja wymagałaby obu słów kluczowych, ale odpowiedź @KarolS uświadomiła mi, że możesz osiągnąć ten efekt, używając ostatecznego słowa kluczowego, a następnie uczynić swój konstruktor prywatnym! –

+3

"* ... ponieważ klasa" final "nie może być nadpisana *" prawdopodobnie chodziło o * rozszerzony * (nadpisywanie dotyczy metod, nie klas). – Pshemo

+0

Nie sądzę, że potrzebujesz obu słów kluczowych, w których cel obu słów jest wprost przeciwny. 'final' wypełnij pełne wymaganie, jeśli wszystkie metody są kompletne i nie ma szansy na zastąpienie go w przyszłości. – Braj

2

final oznacza, że ​​nie może przedłużyć go, powód nie można utworzyć wystąpienie jest fakt, że konstruktor jest prywatny. W ten sposób (w java) definiujesz klasy statyczne lub klasy fabryczne.

9

Gdyby było abstrakcyjne, ktoś mógłby zrobić

public class NewMath extends Math { 

który szczerze mówiąc nie ma sensu.

Jednak nie można utworzyć nową instancję Math każdym razie, ponieważ jej tylko konstruktor jest prywatny:

private Math() {} 
0

Słowo kluczowe streszczenie oznacza, że ​​klasa nie może być natychmiastowa, ale można ją rozszerzyć. W przypadku klas użytkowych, takich jak zajęcia matematyczne, rozszerzanie nie ma sensu. Deklarowanie nie-argumentów Konstruktor sprawia, że ​​nie można go zainicjować, a ostateczny czyni go niemożliwym do rozszerzenia ... Idealnie pasuje ... A jeśli używasz abstrakcji, to nie możesz użyć ostatecznego ...

+0

Powtarzasz słowa innych odpowiedzi. W jaki sposób ten post jest pomocny? – Tom

Powiązane problemy