2015-01-24 3 views
1

У меня относительно простой вопрос относительно функции final в Java. Когда я компилирую этот код:final int in Java

import java.util.*; 
import java.lang.*; 
import java.io.*; 


class Arrays 
{ 
public static void main (String[] args) throws java.lang.Exception 
{ 
final int[] myArray = { 1,2 }; 
myArray[1] = 3; 
System.out.println (myArray[1]); 
} 
} 

число "3" печатается. Однако у меня создалось впечатление, что final означает, что значения, хранящиеся в этом массиве (myArray), больше не могут меняться и постоянны.

Существует также еще один фрагмент кода здесь:

final int [] a1 = {1, 2}; 
int [] b1 = {3, 4}; 
a1 = b1; System.out.println (a1[1]); 

Я считаю, что система должна печатать «2», так как a1 дорабатывается и значение в массиве является постоянным. Однако мой друг считает, что это должно быть «4». Пожалуйста, помогите мне разобраться в моем понимании final.

+0

возможно дубликат [конечного массива в Java] (http://stackoverflow.com/questions/10339930/final-array-in-java) – Joe

ответ

2

int[] - тип объекта (не примитивный, а не int). Окончательная ссылка означает, что вы не можете переназначить ссылку при обращении к экземпляру Object.

final int [] a1 = {1, 2}; 
a1 = {3,4}; // <-- illegal, a1 is final. 

В самом деле, Ява делает значениеfinal в обоих случаях (значение из Object является его ссылка).

+0

Вы хотите сказать, что массив примитивов является 'Object' ? – mrres1

+1

@ mrres1 Каждый массив является «объектом». –

+0

«объект» - это область хранения. http://stackoverflow.com/a/8781060/1684768 – mrres1

0

Окончание означает, что значение не может быть изменено. Но когда объявлено int[] myArray;, myArray сохраняет ссылку массива, а не значения. Итак, утверждение, myArray [1] = 3; изменяет содержимое в этой позиции, потому что оно не объявлено окончательным. и заявление myArray = (any value); является незаконным, так как мы меняем ссылку, которая объявляется окончательной.

0

Когда вы определяете переменную как final, вы не можете переназначить ее на другое значение.

final int a = 2; 
a = 5; \\ error 

подобным образом, когда вы используете конечный массив:

final int[] arrA = {1,2,3}; 
arrA = new int[]{4, 5, 6}; \\ error 

Но вы всегда можете изменить значения внутри массива, так как они не являются final. Поэтому кажется, что ваш второй пример не будет компилироваться. Если вы не хотите изменять значения внутри массива, вам лучше с enum.

0

А final модификатор объявляет, что переменная не может быть изменена. Тем не менее, переменные object/array на самом деле просто обращаются к неназванным объектам/массивам. Поскольку значение переменной объекта является дескриптором, оно гарантирует, что маркер не может измениться. Массив на другом конце этого дескриптора не имеет ничего общего с final.

final int myInt = 5; //myInt cannot change (5 is the value of myInt) 
final int[] myArr = {1,2}; 
myArr[0] = 3; //legal. myArr is a handle to a int[] and we're not modifying the handle