黑马程序员技术交流社区

标题: 关于final关键字的重点理解 [打印本页]

作者: changshuai0512    时间: 2016-1-17 12:38
标题: 关于final关键字的重点理解
前言:
继承的弊端:打破了封装性。(如果父类的功能都可以被子类重写,就打破了父类的封装性。)
只要不让其他类继承该类,就不会有重写。
怎么能实现呢?通过Java中的一个关键字来实现,final(最终化)。

final关键字
是一个修饰符,可以修饰类,方法,变量(成员变量,局部变量,静态变量)。
对比:static 只能修饰成员。

特点
1,final修饰的类是一个最终类,不能在派生子类。

注意:final类如果被继承,错误提示如下:

注意:字符串类,就是一个final类,永远不可能被继承,不可能有子类。



如果类中从出现部分可以重写,部分不可以重写,只要让指定的方法final最终化就可以了。

2,final修饰的方法是最终方法,不可以给重写。
如果重写final方法,会出现如下错误提示:

3,final修饰的变量是一个常量,只能被赋值一次。
比如:final int count=20;
如果为final修饰的变量赋值,则会报错:


其实在java文件编译成class文件以后,System.out.println(count);实际上已经变成了System.out.println(21);final修饰的变量就是一个常量。

什么时候会在程序中定义final常量呢?
当程序中一个数据使用时是固定不变的,这时为了增加阅读性,可以给该数据起个名字。
这就是变量,为了保证这个变量的值不被修改,加上final修饰,这就一个阅读性很强的常量(这样不用去关注final变量的值,而只关注final变量的名字就可以了)。
书写规范,被final修饰的常量名所有的字母都是大写的。如果由多个单词组成单词间通过 _ 连接。

比如:final double PI=3.14;
为了访问方便(通过类名.成员直接调用),通常要加static
如下:static final double PI=3.14;

下面例子:
如果在某个类中定义: static final int number;则会报错:

因为number被定义为final,相当于final把number最终化,但是number是没有值的(显示初始化值),只有一个内存中的一个默认初始化值,所以会报错。
因而最终化的,都是针对显示初始化值而言的:比如:static final int number=4;
作者: Android666    时间: 2016-1-17 14:13
在Java中声明类、属性和方法时,可使用关键字final来修饰。1、 final标记的类不能被继承。2、 final标记的方法不能被子类复写。3、 final标记的变量(成员变量或局部变量)即为常量,只能赋值一次。范例:TestFinalDemo1.java01 class TestFinalDemo102 {03  public static void main(String[] args)04  {05   final int i = 10 ;06   // 修改用final修饰的变量i07   i++ ;08  }09 }编译结果:TestFinalDemo1.java:6: cannot assign a value to final variable i                i++ ;                ^1 error范例:TestFinalDemo2.java01 final class Person02 {03 }04 class Student extends Person05 {06 }编译结果:TestFinalDemo2.java:4: cannot inherit from final Personclass Student extends Person                      ^1 error范例:TestFinalDemo3.java01 class Person02 {03  // 此方法声明为final不能被子类复写04  final public String talk()05  {06   return "Person:talk()" ;07  }08 }0910 class Student extends Person11 {12  public String talk()13  {14   return "Student:talk()" ;15  }16 }编译结果:TestFinalDemo3.java:12: talk() in Student cannot override talk() in Person;overridden method is final        public String talk()                      ^1 error




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2