java——final关键字
来源:互联网 发布:高洛峰php在线视频教程 编辑:程序博客网 时间:2024/06/10 12:40
在java中final关键字可用于修饰类,变量和方法。它用于表示它修饰的类,方法和变量不可改变。
一.简介
1.修饰变量
final修饰变量时,表示改变量一旦获得了初始值之后就不可以改变,final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。final修饰的变量不可被改变,一旦获得初始值后,该变量的值就不能被充值赋值。
(1)final修饰成员变量
成员变量是随类初始化或对象初始化而初始化的。当类初始化时,系统会为该类的类属型分配内存,并分配默认值;当创建对象时,系统会为该对象的实例属性分配内存,并分配默认值。因此,成员变量的初始值可以在定义该变量时指定默认值,可以在初始代码块活构造器中指定初始值,否则,成员变量的初始值将是由系统自动分配初始值。
与普通成员变量不同的是,final成员变量必须由程序员显示初始化,系统不会对final成员进行隐式初始化。
public class Test { /* * 1.定义该变量时指定默认值 2.初始化代码块(构造代码块或者静态代码块)或构造器中指定初始值 */ final int a = 6;// 定义该变量时指定默认值 final int b; final int c; final static int d; // final char str; 既没有指定默认值也没有在构造代码块或构造器中指定初始值,不合法 // 构造代码块,可对没有指定默认值的实例属性指定初始值 { b = 5;// 构造代码块中指定初始值 } // 静态代码块,可对没有指定默认值的类属性指定初始值 static { d = 10;// 静态代码块中指定初始值 } // 构造器,可对没有指定默认值,且没有在构造代码块中指定初始值的实例属性指定初始值。 public Test() { c = 9;// 构造器中指定初始值 // a=9;//a已经制订默认值,不能重新为a赋值,不合法 } public static void main(String[] args) { new Test(); }}
(2)final修饰局部变量
final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值,如果在定义时没有指定默认值,则可以在后面代码中队final变量赋初始值,但只能一次,不能重复赋值。
public class Test2 { public void Testmain(final int a) { // a=8;//非法,不能对final修饰的形参赋值 } public static void main(String[] args) { final int b = 10; // b=5;//非法,定义时已指定了默认值,b变量无法重新复制 final int c; c = 23;// 定义时没有制定默认值,则c变量可以被赋值一次 // c=35;//不合法,c变量已被赋值一次,不可被赋值 }}
2.修饰方法
下面这段话摘自《Java编程思想》第四版第143页:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
public class Test3 { public void Testmain() { } public static void main(String[] args) { }}class Test4 extends Test3 { public void Testmain() { }}Test4 定义Testmain()方法将会出现编译错误,不能重写final方法。
public class Test3 { private void Testmain() { } public static void main(String[] args) { }}class Test4 extends Test3 { private void Testmain() { }}
Testmain()方法是一个private方法,因为它仅在当前类中可见,子类无法访问该方法,所以子类无法重写该方法。所以子类中定义一个与父类private方法有相同的方法名,相同的形参列表,相同返回值类型的方法,是重新定义了一个新方法而不是重写。 注:类的private方法会隐式地被指定为final方法,final修饰的方法只是不能被重写,完全可以被重载
2.修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让它被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类
- Java关键字—final
- java——final关键字
- java关键字——final
- java——final关键字
- Java——关键字final
- JAVA——final关键字
- Java——Final关键字
- Java基础—关键字final
- 谈谈JAVA关键字—final
- Java基础知识——final关键字
- Java 关键字—— static 与 final
- java学习日记——final关键字
- Java基础——final关键字
- java基础知识——final关键字
- Java 关键字—— static 与 final
- java中的关键字——final
- JAVA基础6.57——final关键字
- Java面向对象——final关键字
- 简单的http服务器java
- Angular 几篇关于指令的好文章收录(一)
- Matlab中低级文件I/O操作函数
- RxJava2 浅析
- crul 的使用
- java——final关键字
- Linux常用命令大全
- WebView/JS/Java调用
- 根视图条转
- 新申请网易邮箱必须先开通SMTP服务才能使用SMTP服务发送邮件
- 64位linux不能运行32位程序,问题解决方案
- mac安装redis
- 数组总结
- ubuntu16.04的root默认密码设置