В Java окончательное ключевое слово используется, чтобы заявить, что объект имеет неизменное. Объекты здесь включают переменные, методы и классы, которые похожи на ключевое слово Const в C ++.
Необываемое означает, что после создания объекта состояние не может быть изменено. Вы можете рассмотреть возможность использования окончательного ключевого слова с трех точек зрения:
окончательная переменная
Определите конечный объект A, затем A может быть инициализирован только один раз. После инициализации данные не могут быть изменены. Если a - это тип ссылки, другие объекты не могут быть отменены.
Окончательная переменная, которая не инициализирована, называется пустой финальной. Если это переменная -член, она должна быть инициализирована или назначена в конструкторе.
пример:
Class Circle {Static Final Double Pi = 3.1415926; окончательный int radius = 5; окончательный int xpos; окончательный int ypos; public Circle (int x, int y) {xpos = x; ypos = y; }} Окончательный метод
Если вы определите конечный метод, метод не может быть перегружен. Дизайнер метода не хочет, чтобы другие связанные функции происходили из -за перегрузки метода.
пример:
Класс BaseClass {public final void method () {}} класс defivedclass extends baseclass {public final void method () {} // Ошибка компиляции}}Следует отметить, что определение окончательного метода не обязательно может привести к эффекту встроенного линии, поскольку, независимо от того, является ли метод, зависит от стратегии JVM, а не от конечного ключевого слова, неточно повысить эффективность метода с помощью окончательного дизайна.
окончательный класс
Окончательный класс X, определенный окончательным классом X, не может быть унаследован.
В Java класс строки разработан как окончательный, и его определение следующим образом
Кода -копия выглядит следующим образом:
Окончательная строка открытого класса Extends Объект объекта реализует сериализуемые, сопоставимые <string>, char -sequence
Внутренний класс и финал
При определении анонимного внутреннего класса в методе внутренний класс может получить доступ только к переменным окончательного типа в методе, так что компилятор Java может заранее запечатлеть значение переменной и сохранить копию во внутреннем классе. Когда метод уничтожен, пространство памяти внутреннего класса все еще завершено.
пример:
public class wrapper {public static void main (string [] args) {// Object obj = null; // Скомпилируйте ошибку окончательный объект obj = null; Новый поток (new Runnable () {public void run () {obj = "hello";}}). start (); }} PS: Пробейте, что внутренний анонимный класс не может получить доступ к внешним нефинальным переменным
Об этом звучит немного сложно, но на самом деле я хочу больше поговорить о некоторых особенностях внутренних классов Java.
Причина, по которой я думаю об этом вопросе, заключается в том, что когда я недавно читал код о HTTP Keepalive в исходном коде JDK, один из исходных файлов, sun.net.www.protocol.http.httpurlconnection.java, случайно видел следующий код.
Окончательный логический результат [] = {false}; java.security.accesscontroller.doprivileged (new java.security.privilegedaction () {public run () {try {inetaddress a1 = inetaddress.getbyname (h1); inetaddress a2 = inetaddress.getbyname (h1); a1.equals (a2);Анонимные внутренние классы Java не могут получить доступ к нефинальным переменным соответствующей функции. Чтобы получить доступ к внешней локальной переменной, эта переменная должна быть определена как Fianl в первую очередь. Однако, как только он определяется как окончательный, значение этой переменной не может быть изменено в анонимном внутреннем классе, поэтому не так легко вернуть некоторые полезные значения в анонимном внутреннем классе. Этот код использует очень умный метод, используя здесь массивы, чтобы обойти это ограничение. Хотя мы не можем изменить ссылку на результат переменной, мы можем изменить содержание массива, указанное результатом.
Я просто хочу записать небольшой трюк, чтобы изменить внешние переменные с помощью внутренних анонимных классов. Но так как вы прибыли сюда, вы также можете продолжать видеть, какие функции или ограничения имеют внутренние классы.
Прежде чем продолжить эту статью, я чувствую, что очень необходимо прояснить некоторые термины Java, связанные с этой статьей. Эти термины нелегко перевести на китайский, поэтому мы все равно будем описать их на английском языке.
// Это класс ClassPublic Class javaterm {// Поле или члена переменная Private Int Field; // Constructor public javaterm () {} // method public void method () {// локальная переменная int localVariable = 0; // локальный класс класс localclass {public localclass () {}} // анонимный класс new Runnable () {public void run () {}}; }}Сегодня мы сосредоточимся больше на местном классе и анонимном классе, оба из которых принадлежат внутреннему классу.
Java позволяет нам определить другой класс в классе, называемый вложенным классом, а вложенный класс можно разделить на две категории, одна-статический вложенный класс, а другой-нестатический класс, также известный как внутренний класс. Внутренний класс также может быть разделен на местный класс и анонимный класс.
Некоторые ограничения анонимного класса