Роль использования окончательного для изменения параметров в Java
Добавление окончательного ключевого слова перед параметрами метода должно предотвратить изменение данных в массе метода.
Есть две основные ситуации: во -первых, используйте окончательный, чтобы изменить основной тип данных; Во -вторых, используйте окончательный, чтобы изменить тип эталонных данных.
В первом случае измените основной тип данных, в котором значение параметра не может быть изменено в организме метода, то есть его нельзя перенаправить. В противном случае компиляция не будет передана.
Второй случай - изменить тип ссылки. В настоящее время объект, на который ссылается переменная параметра, не может быть изменен. Однако для эталонных типов данных вполне нормально изменять их свойства.
Поэтому, если вы хотите использовать Final Keyword, используйте основной тип данных, который очень полезен.
Окончательная переменная:
Используйте окончательный для основных типов: это постоянное, значение постоянное, а значение остается неизменным.
Используйте окончательный для ссылок на объекты: сделайте эталонную постоянную, и после того, как ссылка инициализирована, чтобы указывать на объект, его нельзя изменить, чтобы указать на другой объект. Тем не менее, сам объект может быть изменен, и Java не дает способа сделать какой -либо объект постоянным. Это ограничение также использует массивы, которые являются объектами.
пример:
Значение класса {int i; Общественное значение (int i) {this.i = i; }} public class finaldata {private static random random = new Random (47); Приватный идентификатор строки; public finaldata (String Id) {this.id = id; } private final int valueOne = 9; Частный статический окончательный значение int value_two = 99; Public Static Final int Value_three = 39; частный окончательный финал int i4 = random.nextint (20); статический конечный int int_5 = random.nextint (20); частное значение v1 = новое значение (11); частное окончательное значение v2 = новое значение (22); частное статическое конечное значение val_3 = новое значение (33); Приватный окончательный int [] a = {1, 2, 3, 4, 5, 6}; public String toString () {return id + ":" + "i4 =" + i4 + ", int_5 =" + int_5; } public static void main (string [] args) {finalData fd1 = new FinalData ("fd1"); //! fd1.valueone ++; // Поскольку valueOne является константой базового типа, его значение является постоянным fd1.v2.i ++; // Содержание объекта, измененное окончательным, может быть изменено fd1.v1 = новое значение (9); для (int i = 0; i <fd1.a.length; i ++) fd1.a [i] ++; //! fd1.v2 = новое значение (0); // Поскольку V2 является ссылочным типом, измененным по окончательному, его ссылка не может быть изменена, чтобы указывать на другой объект //! fd1.val_3 = новое значение (1); // он занимает пространство памяти, которое не может быть изменено //! fd1.a = new int [3]; // окончательный измененный массив System.out.println (FD1); System.out.println («Создание нового FinalData»); FinalData fd2 = new FinalData ("fd2"); System.out.println (fd1); System.out.println (FD2); }}/*Выход: FD1: i4 = 15, int_5 = 18 CREATING NEW FINALDATAFD1: I4 = 15, Int_5 = 18FD2: i4 = 13, int_5 = 18*//проанализировать:
Для FD1 FD2 Два объекта, i4 уникален, то есть каждый объект имеет i4, но int_5 объявляется статичным, то есть он делится классом, FD1 и FD2 Share Int_5, который инициализируется во время загрузки, а не инициализации каждый раз, когда создается новый объект (например, i4); Но он установлен в конечном счете в одно и то же время, поэтому его ссылка неизменна, то есть его нельзя изменить, чтобы указывать на другой объект.
Пустой финал:
объявляется окончательным, но не имеет первоначального значения. Окончательный должен быть назначен с использованием выражений в определении домена или в каждом конструкторе, поэтому конечный домен всегда инициализируется перед использованием.
Окончательные параметры:
Это означает, что вы не можете изменить ссылку на параметр в методе, чтобы указать на другой параметр, но вы можете изменить то, что указывает конечный объект на
пример:
класс Gizmo {int i = 0; public void spin () {}} public class finalarguments {void с (final gizmo g) {//! g = new Gizmo (); // Ссылка, измененная Final, не модифицирована, чтобы указывать на другой объект G.I ++; // но содержание, на которое указано конечным объектом, может быть изменен} void без (gizmo g) {g = new gizmo (); g.spin (); } // int g (final int i) {// //! i ++; // Потому что параметр i является постоянным значением //} int g (окончательный int i) {return i + 1; } public static void main (string [] args) {finalArguments bf = new FinalArguments (); bf. с (null); bf. с (null); }}проанализировать:
Параметр объявлен как окончательный. Если это основной параметр, он является постоянным и не может быть изменен; Если это эталонная переменная, ее нельзя изменить, чтобы указывать на другой объект, но содержание объекта, упомянутого ссылкой, может быть изменено.
Fianl Метод:
Причина использования:
Все частные методы в классе неявно указаны как окончательные, и, поскольку частный метод не может быть использован, его нельзя перезаписано. Последний модификатор может быть добавлен к частному методу, но это не дает никакого дополнительного значения методу.
пример:
Класс WithFinals {private final void f () {System.out.println ("withfinals.f ()"); } private void g () {System.out.println ("overdridingPrivate.f ()"); }} class oversidiveprivate extends withfinals {private final void f () {system.out.println ("overdistingprivate.f ()"); }} class oversidiveprivate2 extends overdridingprivate { /** При использовании аннотации переопределения, чтобы заставить метод f () перезаписать метод f () родительского класса, будет сообщена ошибка*, поскольку он не знает, есть ли родительский класс метод. Для метода g () он просто генерирует новый метод и * не перезаписывает метод G () в родительском классе. *///@переопределить публичный окончательный void f () {System.out.println ("overdirtyPrivate2.f ()"); } public void g () {System.out.println ("overdridingPrivate2.g ()"); / Op2.f (); Op2.g (); // Вы можете преобразовать вверх переопределительную адаптацию OP = OP2; //! op.f (); // Последний метод в родительском классе невидим для подкласса //! op.g (); Сфинал wf = op2; // wf.f (); // wf.g (); }}/*output: overdridingprivate2.f () overdisterprivate2.g ()*/проанализировать:
Когда происходит покрытие:
1. Методы, которые появляются на подклассах, которые точно такие же, как и у родителей классов
2. Подкласс может быть преобразован в родительский класс вверх и вызовать метод в родительском классе
Если метод в родительском классе объявляется окончательным или частным, то этот метод невидим для подкласса. Даже если метод точно такой же, как и родительский класс, создается в подклассе, это новый метод, а не метод, переопределенный из родительского класса.
Окончательный класс:
То есть этот класс не может быть унаследован, будь то вы или другие, то есть этот класс не требует каких -либо изменений, и не требует каких -либо подклассов, таких как класс строки.
пример:
класс Smallbrain {} окончательный класс Dinosaur {int i = 7; int j = 1; Smallbrain x = new Smallbrain (); void f () {}} // Ошибка: Тип далее не может подкласс. Окончательный класс динозавр // класс динозавров не может иметь подклассы // Класс дополнительно расширяет динозавр {} открытый класс Jurassic {public static void main (string [] args) {dinosaur n = new Dinosaur (); nf (); ni = 40; N.J ++; }}Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.