Zawsze mylę się między słowami kluczowymi statici finalsłowami kluczowymi w Javie .
Czym się różnią ?
Zawsze mylę się między słowami kluczowymi statici finalsłowami kluczowymi w Javie .
Czym się różnią ?
Odpowiedzi:
Przyjrzyjmy się najpierw zmiennym statycznym i metodom statycznym.
Class.variableClass.methodName() thislub supersłów kluczowych.Java ma również „statyczne klasy zagnieżdżone”. Statyczna klasa zagnieżdżona to po prostu taka, która nie ma niejawnie odwołania do wystąpienia klasy zewnętrznej.
Statyczne klasy zagnieżdżone mogą mieć metody instancji i metody statyczne.
W Javie nie ma czegoś takiego jak klasa statyczna najwyższego poziomu.
Główną metodą jest
staticto, że musi być dostępna, aby aplikacja działała przed jakąkolwiek instancją.
final słowo kluczowe jest używane w kilku różnych kontekstach do zdefiniowania jednostki, której nie można później zmienić.Nie finalmożna utworzyć podklasy. Odbywa się to ze względu na bezpieczeństwo i wydajność. W związku z tym wiele klas standardowych bibliotek Java to finalna przykład java.lang.Systemi java.lang.String. Wszystkie metody w finalklasie są niejawne final.
finalMetoda nie może być przesłonięta przez podklasy. Służy to zapobieganiu nieoczekiwanemu zachowaniu podklasy zmieniającej metodę, która może mieć kluczowe znaczenie dla funkcji lub spójności klasy.
finalZmienna może być inicjowane tylko jeden raz, za pośrednictwem instrukcji inicjowania lub przydziału. Nie trzeba jej inicjować w momencie deklaracji: nazywa się to blank finalzmienną. Pusta końcowa zmienna instancji klasy musi być ostatecznie przypisana na końcu każdego konstruktora klasy, w której jest zadeklarowana; podobnie, pusta końcowa zmienna statyczna musi być ostatecznie przypisana w statycznym inicjatorze klasy, w której jest zadeklarowana; w przeciwnym razie w obu przypadkach wystąpi błąd kompilacji.
Gdy anonimowa klasa wewnętrzna jest zdefiniowana w treści metody, wszystkie zmienne zadeklarowane finalw zakresie tej metody są dostępne z poziomu klasy wewnętrznej. Po przypisaniu wartość końcowej zmiennej nie może ulec zmianie.
Class.methodName()
statyczny oznacza, że należy do klasy, a nie do instancji, co oznacza, że istnieje tylko jedna kopia tej zmiennej / metody współdzielona przez wszystkie instancje określonej klasy .
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
final jest całkowicie niepowiązany, jest to sposób definiowania jednorazowej inicjalizacji. Możesz zainicjować podczas definiowania zmiennej lub w konstruktorze, nigdzie indziej.
note Uwaga na temat metod końcowych i klas końcowych, jest to sposób jawnego stwierdzenia, że metoda lub klasa nie mogą być odpowiednio przesłonięte / rozszerzone.
Dodatkowe czytanie Więc jeśli chodzi o statyczność, rozmawialiśmy o innych zastosowaniach, które może mieć, czasami jest ona używana w blokach statycznych. Podczas używania zmiennych statycznych czasami konieczne jest ustawienie tych zmiennych przed użyciem klasy, ale niestety nie dostajesz konstruktora. W tym miejscu pojawia się słowo kluczowe static.
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
Nie można tego mylić z blokami inicjalizatora instancji, które są wywoływane przed konstruktorem na instancję.
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
Te dwie naprawdę nie są podobne. staticpola to pola, które nie należą do żadnej określonej instancji klasy .
class C {
public static int n = 42;
}
Tutaj staticpole nnie jest skojarzone z żadnym konkretnym wystąpieniem, Cale ogólnie z całą klasą (dlatego C.nmożna go użyć, aby uzyskać do niego dostęp). Czy nadal możesz używać wystąpienia programu, Caby uzyskać dostęp n? Tak - ale nie jest to uważane za szczególnie dobrą praktykę.
final z drugiej strony wskazuje, że określona zmienna nie może się zmienić po zainicjowaniu.
class C {
public final int n = 42;
}
Tutaj nnie można go ponownie przypisać, ponieważ tak jest final. Inną różnicą jest to, że można zadeklarować dowolną zmienną final, a nie każdą zmienną można zadeklarować jako statyczną.
Można również zadeklarować klasy, finalco oznacza, że nie można ich rozszerzać:
final class C {}
class B extends C {} // error!
Podobnie, metody można zadeklarować jako ostateczne, aby wskazać, że nie mogą zostać zastąpione przez klasę rozszerzającą:
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
publicklasa, która definiuje plik) lub staticklasy wewnętrzne mogą definiować staticzmienne. Inne klasy wewnętrzne są instancjami klasy zewnętrznej i nie mogą mieć zmiennych statycznych.
ostateczne -
1) Kiedy zastosujemy słowo kluczowe „ final ” do zmiennej , wartość tej zmiennej pozostaje stała. (lub) Po zadeklarowaniu zmiennej jako ostatecznej. wartość tej zmiennej nie może zostać zmieniona.
2) Jest to przydatne, gdy wartość zmiennej nie zmienia się w czasie trwania programu
statyczne -
1) kiedy zastosujemy słowo kluczowe „ static ” do zmiennej , oznacza to, że należy ona do klasy.
2) Kiedy stosuje się „ statyczny ” słowo kluczowe do sposobu , oznacza to, że metoda może być dostępne bez tworzenia instancji klasy
static oznacza, że jest tylko jedna kopia zmiennej w pamięci współużytkowanej przez wszystkie instancje klasy.
Słowo finalkluczowe oznacza po prostu, że wartości nie można zmienić. Bez tego finalkażdy obiekt może zmienić wartość zmiennej.
Statyczne i końcowe mają kilka dużych różnic:
Zmienne lub klasy statyczne będą zawsze dostępne (prawie) z dowolnego miejsca. Final to tylko słowo kluczowe, które oznacza, że zmiennej nie można zmienić. Więc gdybyś miał:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
Program działałby do momentu próby zmiany „pierwszej” liczby całkowitej, co spowodowałoby błąd. Poza tą klasą miałbyś dostęp tylko do zmiennej „pierwszej”, gdybyś utworzył instancję klasy. Jest to przeciwieństwo „drugiego”, które jest dostępne cały czas.
Pomyśl o przedmiocie jak o Mówcy. Jeśli głośnik jest klasą, będzie miał różne zmienne, takie jak głośność, wysokie tony, basy, kolor itp. Wszystkie te pola definiuje się podczas definiowania klasy głośnika. Na przykład zadeklarowałeś pole koloru za pomocą statycznego modyfikatora, co oznacza, że mówisz kompilatorowi, że istnieje dokładnie jedna kopia tej zmiennej, niezależnie od tego, ile razy klasa została utworzona.
Deklarowanie
static final String color = "Black";
upewni się, że za każdym razem, gdy tworzona jest instancja tej klasy, wartość pola koloru będzie wynosić „Czarny”, chyba że nie zostanie zmieniona.
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
Uwaga: Teraz, gdy zmienisz kolor głośnika jako ostateczny, ten kod nie zostanie wykonany, ponieważ słowo kluczowe final zapewnia, że wartość pola nigdy się nie zmieni.
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
Możesz skopiować / wkleić ten kod bezpośrednio do emulatora i spróbować.
Łatwa różnica,
Final : oznacza, że wartością zmiennej jest Final i nigdzie się nie zmieni. Jeśli powiesz, że końcowe x = 5, oznacza to, że x nie można zmienić, jego wartość jest ostateczna dla wszystkich.
Statyczny: oznacza, że ma tylko jeden obiekt. załóżmy, że masz x = 5, w pamięci jest x = 5 i jest obecny wewnątrz klasy. jeśli tworzysz obiekt lub instancję klasy, co oznacza, że istnieje określone pole reprezentujące tę klasę oraz jej zmienne i metody. a jeśli utworzysz inny obiekt lub instancję tej klasy, oznacza to, że istnieją dwa pola tej samej klasy, które mają w pamięci różne x. a jeśli sprawdzisz oba x na różnych pozycjach i zmienisz ich wartość, to ich wartość będzie inna. pudełko 1 ma x, które ma x = 5, a pudełko 2 ma x = 6., ale jeśli uczynisz x statycznym, oznacza to, że nie można go ponownie utworzyć. możesz stworzyć obiekt klasy, ale ten obiekt nie będzie miał w sobie różnych x. jeśli x jest statyczne, to pudełko 1 i pudełko 2 będą miały to samo x, które będzie miało wartość 5. Tak, mogę zmienić wartość statyczną w dowolnym miejscu, ponieważ nie jest ostateczna. więc jeśli powiem, że pudełko 1 ma x i zmieniam jego wartość na x = 5, a następnie tworzę kolejne pudełko, które jest pudełkiem2 i zmieniam wartość pudełka2 x na x = 6. to ponieważ X jest statyczne, oba pola mają taki sam x. a oba pola podadzą wartość box jako 6, ponieważ box2 nadpisuje wartość od 5 do 6.
Zarówno ostateczne, jak i statyczne są zupełnie inne. Ostatecznego, który jest ostateczny, nie można zmienić. statyczny, który pozostanie jako jeden, ale można go zmienić.
"To jest przykład. Pamiętaj, że zmienne statyczne są zawsze wywoływane przez ich nazwę klasy. Ponieważ są one tylko jednym dla wszystkich obiektów tej klasy. Więc klasa A ma x = 5, mogę wywołać i zmienić to przez Ax = 6; "
Statyczny to coś, co może wywołać każdy obiekt w klasie, co z natury należy do typu obiektu.
Zmienna może być ostateczna dla całej klasy, a to po prostu oznacza, że nie można jej już zmienić. Można go ustawić tylko raz, a próba ustawienia go ponownie spowoduje zgłoszenie błędu. Jest to przydatne z wielu powodów, być może chcesz zadeklarować stałą, której nie można zmienić.
Przykładowy kod:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia zawiera pełną listę słów kluczowych Java .
Nie będę próbował udzielić tutaj pełnej odpowiedzi. Moją rekomendacją byłoby skupienie się na zrozumieniu tego, co robi każdy z nich, a następnie powinno być jasne, że ich efekty są zupełnie inne i dlaczego czasami są używane razem.
staticjest przeznaczony dla elementów klasy (atrybuty i metody) i należy go rozumieć w przeciwieństwie do elementów instancji (niestatycznych). Polecam przeczytanie „Zrozumienie instancji i składowych klas” w samouczkach Java. Mogę też być używany w staticblokach, ale na początek nie przejmowałbym się tym.
finalma różne znaczenia w zależności od tego, czy jest stosowany do zmiennych, metod, klas czy w innych przypadkach. Tutaj bardziej podobają mi się wyjaśnienia z Wikipedii .
Wartości zmiennych statycznych mogą ulec zmianie, mimo że jedna kopia zmiennej przechodzi przez aplikację, natomiast wartości zmiennych końcowych można zainicjować raz i nie można ich zmienić w całej aplikacji.