深入java面向对象二:final关键字
文章内容源于对《疯狂java讲义》及《疯狂Java:突破程序员基本功的16课》学习和总结。
一、 final成员变量
final 修饰变量时,表示该变量一旦获取了值就不可以改变了。
但是我们知道,当一个类被加载,或者是实例化对象时,系统会为类成员赋初始值,所以,final关键字修饰的成员变量,必须有程序员指定初始值,一旦指定了初始值,就不可以再改变。
其初始化可以在两个地方:
类Field:必须在声明该变量时或静态初始化快中指定初始值。
实例Field: 必须在非静态初始化块、声明该Field或构造器中指定初始值。
示例:
public class FinalVariableTest
{
//定义成员变量时指定默认值,合法。
final int a = 6;
//下面变量将在构造器或初始化块中分配初始值
final String str;
final int c;
final static double d;
//既没有指定默认值,又没有在初始化块、构造器中指定初始值,
//下面定义char Field是不合法的。
//final char ch;
//初始化块,可对没有指定默认值的实例Field指定初始值
{
//在初始化块中为实例Field指定初始值,合法
str = "Hello";
//定义a Field时已经指定了默认值,
//不能为a重新赋值下面赋值语句非法
//a = 9;
}
//静态初始化块,可对没有指定默认值的类Field指定初始值
static
{
//在静态初始化块中为类Field指定初始值,合法
d = 5.6;
}
//构造器,可对既没有指定默认值、有没有在初始化块中
//指定初始值的实例Field指定初始值
public FinalVariableTest()
{
//如果初始化块中对str指定了初始化值,
//构造器中不能对final变量重新赋值,下面赋值语句非法
//str = "java";
c = 5;
}
public void changeFinal()
{
//普通方法不能为final修饰的成员变量赋值
//d = 1.2;
//不能在普通方法中为final成员变量指定初始值
//ch = 'a';
}
public static void main(String[] args)
{
FinalVariableTest ft = new FinalVariableTest();
System.out.println(ft.a);
System.out.println(ft.c);
System.out.println(ft.d);
}
}
编译运行结果:
6
5
5.6
二、 final局部变量
对于使用final修饰局部变量,即可以在定义时指定默认值,也可以不指定默认值;
如果一旦赋了初始值,则之后都不可以再修改变量值。
public class FinalLocalTest
{
public static void main(String[] args)
{
//定义一个普通局部变量
final int a = 5;
System.out.println(a);
}
}
三、 内部类中的局部变量
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用:
public class INClass {
void innerClass(final String str) {
class IClass {
IClass() {
System.out.println(str);
}
}
IClass ic = new IClass();
}
public static void main(String[] args) {
INClass inc = new INClass();
inc.innerClass("Hello");
}
}
四、 final宏替换
final有一个很重要的概念,就是宏替换;宏替换的应当满足的条件:
· 使用final修饰符修饰变量
· 在定义该final变量时只定了初始值
· 该初始值可以在编译时就被确定下来。
public class FinalLocalTest {
public static void main(String[] args) {
// 定义一个普通局部变量
final int a = 5;
System.out.println(a);
}
}
总结:
1. final修饰基本类型和引用类型有所不同,final修饰基本类型变量时,只要基本类型被赋初始值,则不可改变; 但final修饰引用类型时,引用的地址不可改变,但是引用的值是可以改变的。
2. final执行宏替换时,在程序运行过程中,有替换的值直接参与程序的执行,而并非变量。
3. final修饰的方法不可重写,修饰的类不可继承。
深入java面向对象二:final关键字的更多相关文章
- 面向对象编程(十二)——final关键字
final关键字 Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和 ...
- 浅析Java中的final关键字(转载)
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 转载:浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- 浅析Java中的final关键字(转)
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...
- Java基础(三)-final关键字分析
今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...
- 简单聊聊java中的final关键字
简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
随机推荐
- OpenLayers添加和删除控件
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- fc_net.py cs231n
n如果有错误,欢迎指出,不胜感激 import numpy as np from cs231n.layers import * from cs231n.layer_utils import * cla ...
- 【难为听】weex-ui
eslint 不喜欢,但是确实规范了代码,同古代统一货币一样,有无穷的意义.故喜欢 weex-ui在项目中的使用方法 npm install -g weex-toolkit@latest weex c ...
- Liferay 7 module项目的依赖问题
build.gradle中的dependencies和bnd.bnd的Private-Package的关系是,build.gradle解决编译时候所需的所有依赖问题,但是这些依赖并不会被打包到buil ...
- Linux C socket 基于 UDP
/************************************************************************* > File Name: serve ...
- 自定义View系列教程01--常用工具介绍
站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...
- Directx11教程(32) 纹理映射(2)
原文:Directx11教程(32) 纹理映射(2) 在写代码之前,我们先制作一个dds文件.从网上找到了一张照片,处理成为512*512,保存为jpg格式. 启动微软的directx ...
- asp.net ajax客户端框架如何调用Page Method
asp.net ajax客户端框架如何调用Page Method 1:欲调用的页面方法必须声明为公有(Public)2:该方法必须为静态方法(static)3:该方法必须添加[System.Web.S ...
- Notepad++ ssh NppFTP链接linux
Notepad++是一套非常有特色的自由软件的纯文字编辑器,有完整的中文化接口及支持多国语言编写的功能.现在用Notepad++来远程编辑Linux系统文本文件. Notepad++ 1.Linux操 ...
- 【To Read】LeetCode | Jump Game II(转载)
题目: Given an array of non-negative integers, you are initially positioned at the first index of the ...