Java-da açar söz bar -
final
. Sapaklara, usullara, üýtgeýänlere (usul argumentlerini goşmak bilen) ulanylyp bilner. Bir synp üçin bu synpyň kiçi klaslara eýe bolup bilmejekdigini aňladýar. Miras almak gadagandyr. Bu (üýtgewsiz) obýektler döredilende peýdaly immutable
, mysal üçin String
yglan edilen synp final
.
public final class String{
}
class SubString extends String{ //Compilation error
}
abstract
Üýtgedijiniň abstrakt synplara (açar söz bilen ) ulanylyp bilinmejekdigini hem bellemelidiris , final
sebäbi bular biri-birine bagly düşünjelerdir. Usul üçin final
, bu kiçi klaslarda ýok edilip bilinmejekdigini aňladýar. Asyl ýerine ýetirilişiniň artykmaç bolmazlygyny islänimizde bu peýdalydyr.
public class SuperClass{
public final void printReport(){
System.out.println("Report");
}
}
class SubClass extends SuperClass{
public void printReport(){ //Compilation error
System.out.println("MyReport");
}
}
Ilkinji görnüşli üýtgeýjiler üçin bu, bir gezek bellenensoň, bahanyň üýtgedilip bilinmejekdigini aňladýar. Salgy üýtgeýjileri üçin bu, bir obýekt bellenenden soň, şol obýekte salgylanmanyň üýtgedilip bilinmejekdigini aňladýar. Bu möhümdir! Baglanyşygy üýtgedip bolmaýar, ýöne obýektiň ýagdaýyny üýtgedip bolýar. Java 8 bilen düşünje peýda boldy - effectively final
. Diňe üýtgeýänlere (usul argumentlerini goşmak bilen) degişlidir. Esasy zat, açar sözüň aç-açan ýoklugyna garamazdan final
, üýtgeýjiniň bahasy başlangyçdan soň üýtgemeýär. final
Başga sözler bilen aýdylanda, şeýle üýtgeýjä söz düzmekde ýalňyşlyk bolmazdan söz çalşyp bilersiňiz . Üýtgeýjileri ýerli synplaryň ( ), anonim synplaryň ( ), akymlaryň (Stream API) effectively final
içinde ulanyp bolýar .Local Inner Classes
Anonymous Inner Classes
public void someMethod(){
// In the example below, both a and b are effectively final, since the values are set once:
int a = 1;
int b;
if (a == 2) b = 3;
else b = 4;
// c is NOT effectively final because value changes
int c = 10;
c++;
Stream.of(1, 2).forEach(s-> System.out.println(s + a)); //Ок
Stream.of(1, 2).forEach(s-> System.out.println(s + c)); //Compilation error
}
Indi azajyk söhbetdeşlik edeliň. Galyberse-de, JavaRush kursyny geçmegiň maksady Java dörediji bolmak we gyzykly we gowy aýlyk almak. Geliň, başlalyň.
-
Bir massiw yglan edilende näme aýdyp bilersiňiz
final
? -
String
Synpyňimmutable
, synpyň yglan edilendigi , setiriň bahasy açar söz bilen bellenilenfinal
massiwde saklanýandygy mälimdir .char
final
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
Obýektiň bahasyny çalyşmak mümkinmi String
(obýekte salgylanmany üýtgetmän)? Bular hakyky söhbetdeşlik soraglary. Amalyň görkezişi ýaly, köpler olara nädogry jogap berýärler. Açar sözüň, esasanam salgylanma üýtgeýjileriniň ulanylyşyna düşünmek final
gaty möhümdir. Oýlanýarkaňyz, JavaRush toparyna çalt öwrenişiň. Mazmuny gizlemäge mümkinçilik berýän tekst redaktoryna bir blok goşmagyňyzy haýyş edýäris we basanyňyzda bu mazmuny görkeziň. Jogaplar:
-
Sebäbi massiw obýektdir, bu
final
bir obýekte salgylanma bellänsoň, indi üýtgedilip bilinmejekdigini, ýöne obýektiň ýagdaýynyň üýtgedilip bilinjekdigini aňladýar.final int[] array = {1,2,3,4,5}; array[0] = 9; //ok, because change the contents of the array - {9,2,3,4,5} array = new int[5]; //compile error
-
Hawa, edip bilersiň. Esasy zat, çylşyrymly sözüň obýektler bilen ulanylyşyna düşünmekdir
final
. Bahany çalyşmak üçin ReflectionAPI ulanýar.
import java.lang.reflect.Field;
class B {
public static void main(String[] args) throws Exception {
String value = "Old value";
System.out.println(value);
//Get the value field in the String class
Field field = value.getClass().getDeclaredField("value");
//Let's change it
field.setAccessible(true);
//Set new value
field.set(value, "JavaRush".toCharArray());
System.out.println(value);
/* Вывод:
* Old value
* JavaRush
*/
}
}
Ilkinji görnüşiň soňky üýtgeýjisini şu görnüşde üýtgetjek bolsak, hiç zat bolmaz. Muňa özüňizi ynandyrmagyňyzy maslahat berýärin: mysal üçin final int
bir meýdan bilen Java synpyny dörediň we Reflection API arkaly bahasyny üýtgetmäge synanyşyň. Hemmäňize üstünlik!
GO TO FULL VERSION