Mayroong isang keyword sa java -
final
. Maaari itong ilapat sa mga klase, pamamaraan, variable (kabilang ang mga argumento ng pamamaraan). Para sa isang klase, nangangahulugan ito na ang klase ay hindi maaaring magkaroon ng mga subclass, i.e. Ipinagbabawal ang mana. Ito ay kapaki-pakinabang kapag lumilikha ng immutable
(hindi mababago) na mga bagay, halimbawa isang klase String
na idineklara bilang final
.
public final class String{
}
class SubString extends String{ //Compilation error
}
Dapat ding tandaan na ang modifier ay hindi mailalapat sa mga abstract na klase (na may keyword abstract
), final
dahil ang mga ito ay kapwa eksklusibong mga konsepto. Para sa isang pamamaraan final
ay nangangahulugan na hindi ito maaaring ma-override sa mga subclass. Ito ay kapaki-pakinabang kapag gusto naming hindi ma-override ang orihinal na pagpapatupad.
public class SuperClass{
public final void printReport(){
System.out.println("Report");
}
}
class SubClass extends SuperClass{
public void printReport(){ //Compilation error
System.out.println("MyReport");
}
}
Para sa mga primitive na uri ng variable, nangangahulugan ito na kapag naitalaga na, hindi na mababago ang value. Para sa mga reference na variable, nangangahulugan ito na kapag naitalaga na ang isang object, hindi na mababago ang reference sa object na iyon. Ito ay mahalaga! Ang link ay hindi mababago, ngunit ang estado ng bagay ay maaaring mabago. Sa java 8 lumitaw ang konsepto - effectively final
. Nalalapat lamang ito sa mga variable (kabilang ang mga argumento ng pamamaraan). Ang punto ay sa kabila ng halatang kawalan ng keyword final
, hindi nagbabago ang halaga ng variable pagkatapos ng pagsisimula. Sa madaling salita, maaari mong palitan ang isang salita para sa naturang variable final
nang walang error sa compilation. effectively final
Maaaring gamitin ang mga variable sa loob ng mga lokal na klase ( Local Inner Classes
), anonymous na mga klase ( Anonymous Inner Classes
), stream (Stream API).
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
}
Ngayon magkaroon tayo ng kaunting panayam. Pagkatapos ng lahat, ang layunin ng pagkuha ng kursong JavaRush ay maging isang developer ng Java at makakuha ng isang kawili-wili at mahusay na bayad na trabaho. Kaya, magsimula tayo.
-
Ano ang masasabi mo tungkol sa isang array kapag ito ay ipinahayag
final
? -
Ito ay kilala na ang klase
String
ayimmutable
, ang klase ay ipinahayagfinal
, ang halaga ng string ay naka - imbak sa isang arraychar
, na kung saan ay minarkahan ng keywordfinal
.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
Posible bang palitan ang halaga ng isang bagay String
(nang hindi binabago ang sanggunian sa bagay)? Ito ay mga totoong tanong sa panayam. And as practice shows, marami ang sumasagot sa kanila ng mali. Ang pag-unawa sa paggamit ng keyword final
, lalo na para sa mga reference na variable, ay napakahalaga. Habang nag-iisip ka, isang mabilis na paglihis sa koponan ng JavaRush. Mangyaring magdagdag ng isang bloke sa iyong text editor na nagbibigay-daan sa iyong itago ang nilalaman, at kapag nag-click ka dito, ipakita ang nilalamang ito. Mga sagot:
-
kasi ang array ay isang object, na
final
nangangahulugan na pagkatapos magtalaga ng reference sa isang object, hindi na ito mababago, ngunit ang estado ng object ay maaaring baguhin.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
-
Oo kaya mo. Ang susi ay upang maunawaan ang paggamit ng barbed na salita
final
na may mga bagay. Gumagamit ng ReflectionAPI upang palitan ang halaga.
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
*/
}
}
Pakitandaan na kung sinubukan naming baguhin ang panghuling variable ng isang primitive na uri sa ganitong paraan, walang gagana. Iminumungkahi kong kumbinsihin mo ang iyong sarili tungkol dito: lumikha ng isang Java class, halimbawa, na may final int
isang field at subukang baguhin ang halaga nito sa pamamagitan ng Reflection API. Sana swertihin ang lahat!
GO TO FULL VERSION