之前我们讲过继承的相关知识了,继承就是子类继承父类的属性和方法并且还可以覆盖父类的方法。但是这样有一个缺陷是什么呢,就是当我们一个类当中涉及一些封装的核心的东西或者对整个系统非常关键的方法或者类的时候,这个时候如果子类覆盖掉父类的方法将会对我们带来安全隐患。为了能够继承父类的方法,同时又能够保证我们类的安全性,这个时候我们就用到了final这个关键字。

final关键字之一:

  final从字面意思上来理解的话,就是最后的意思,也就是说这个方法一经定义之后,就是最后的,不能更改的。当我们用这个关键字修饰一个类的方法的时候,任何继承自这个类的子类,都不能够在自己的方法当中来覆盖他父类的这个方法。代码示例:

  

 class Animal
{ final void die()
{ System.out.print("Every animal will die"); } void eat()
{ System.out.print("Every animal must eat something"); } } class Dog extends Animal
{ void die()
{ System.out.print("Is dog going to die???"); } void eat()
{ System.out.print("Dog eat grass and meat!!"); } }

如果这个时候我们编译的时候,就会提示我们:

被final关键字修饰的方法在子类当中是不能够被覆盖的。

final用法二:

final除了可以修饰一个类当中的某个方法不能够被覆盖之外,还能够修饰一个类,使这个类不能够被继承:

代码示例:

 final class Animal
{ void die()
{ System.out.print("Every animal will die"); } void eat()
{ System.out.print("Every animal must eat something"); } } class Dog extends Animal
{ void die()
{ System.out.print("Is dog going to die???"); } void eat()
{ System.out.print("Dog eat grass and meat!!"); } }

这个地方就会报错:

final用法三:

final还可以修饰一个变量,被final修饰之后,这个变量一经定义就不能够被修改了。那么这么做有什么意义呢?这样做的意义就是,有可能我们用某一个数字代表着一类含义,但是我们单纯的定义这个数字,并不能提供很好的阅读性,为了能够保证代码的阅读性,我们这里提供一个变量来描述这个数字,同时呢也不能让这个变量被改变,因为这个常量改变了,这个意义也就改变了,所以必须要用final关键字来修饰。

 class Animal
{ final int a = 10;
void die()
{ System.out.print("Every animal will die"); } void eat()
{ System.out.print("Every animal must eat something"); } } class Dog extends Animal
{ void die()
{ System.out.print("Is dog going to die???"); } void eat()
{ System.out.print("Dog eat grass and meat!!"); } } class FinalDemo
{ public static void main(String[] args) { Dog d = new Dog();
d.a = 100;//会报错
System.out.print(d.a); } }

如果我们这样写之后,在后期为a赋值的话就会报错:

final关键字需要注意的细节:

1、final和private一起使用是没有意义的。

2、用final关键字修饰的成员变量,在初始化的时候,必须要赋值。

3、

final关键字的特点:

1、final是一个修饰符,能够修饰类,方法,变量。

2、final修饰的类不能够被其他类继承。

3、final修饰的变量,只能够被赋值一次。为什么要用final修饰变量?如果在一个程序当中,一个数据是固定的,直接用这个数据就可以了,但是这样阅读性较差。所以这里要给数据起个名称,并且加个final固定,使这个变量名称的值不能够改变。写法规范,用final修饰的常量最好用大写字母来标识,这样能更好的区分是常量还是变量,如果有多个单词,多个单词之间用下划线链接。

4、final修饰的成员方法不能够被覆盖。

5、内部类只能访问被final修饰的局部变量。

java学习面向对象之final关键字的更多相关文章

  1. 《JAVA学习笔记 (final关键字)》

    [14-9]面向对象-final关键字 /* 继承的弊端,打破封装性. 不让其他类继承该类,就不会有重写. 怎么能实现呢?通过Java中的一个关键子来实现,final(最终化). [final关键字] ...

  2. Java学习笔记之——final关键字

    最终的,最后的 可以修饰:变量.方法.类 (1) 修饰变量 不可改变,即常量,只能赋值一次,赋值之后不可改变 a. 修饰属性:private final int num; 要求属性要显式赋值 通常在属 ...

  3. [Java学习]面向对象-super关键字;final关键字

    super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...

  4. 《java入门第一季》之面向对象(final关键字)

    /* final可以修饰类,方法,变量 特点: final(可以修饰类),该(类)(不能被继承).一旦修饰了一个类,这个类就不能被继承了! final以修饰方法,该方法可以被继承但是不能被重写.(覆盖 ...

  5. Java学习个人备忘录之关键字final

    final关键字final可以修饰类,方法,变量.final修饰的类不可以被继承final修饰的方法不可以被覆盖final修饰的变量是一个常量.只能被赋值一次.内部类只能访问被final修饰的局部变量 ...

  6. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  7. java学习--面向对象

    对象及类的概念 对象是java程序的核心,在java程序中“万事万物皆对象” 对象可以看成是属性和方法的封装体 类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所应具有的属性和方法 J2SD ...

  8. 安卓开发(Java)中关于final关键字与线程安全性

    前言 学习新知识固然重要,但是时常往回看看,温故知新是很必要的.回顾一下线程安全性和final关键字. 正文 从Java 5开始,final keyword一个特殊用法是在并发库中一个非常重要且经常被 ...

  9. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

随机推荐

  1. Abstract Factory 抽象工厂模式

    提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...

  2. Jquery Ajax方法传递json到action

    ajax向后台传入json需要设置option,如下 contentType:'application/json' data:Json.Stringify(jsObj) 后台处理复杂json对象(不知 ...

  3. Unity3D中读取CSV文件

    直接上代码 Part1: using UnityEngine; using System.IO; using System.Collections.Generic; public class CSV ...

  4. 学习java随笔第十篇:java线程

    线程生命周期 线程的生命周期:新建状态.准备状态.运行状态.等待/阻塞状态.死亡状态 示意图: 定义.创建及运行线程 线程: package threadrun; //定义一个实现Runnable接口 ...

  5. window.clearInterval与window.setInterval的用法(

    window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) 解释:code:在定时时间到时要执行的J ...

  6. Oracle学习【索引及触发器】

    索引B_Tree结构 请参照 响应图例 索引是一种允许直接访问数据表中某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间中.索引记录中存有索引关键字和指向表中数 ...

  7. ES6-个人学习笔记一--let和const

    es6已经推出一段时间了,虽然在兼容和应用上还有不少的难题,但是其提供的未来前端代码编程的发展趋势和一些好用的功能还是很吸引人的,因此个人买了'阮一峰'先生的es6入门,希望对其有一个了解和学习,本系 ...

  8. Model Thinking1

    Why Model Reason # 1: Intelligent Citizen of the World Reason # 2: Clearer Thinker Reason # 3: Under ...

  9. 2016030204 - git和github结合

    1.下载和安装git客户端 参考:http://www.cnblogs.com/zhtzyh2012/p/5232291.html 2.github上创建项目 参考:http://www.cnblog ...

  10. main函数的参数

    一.main的参数 形式:int main(int argc,char *argv[]) 参数argc.argv可以被看做是main函数的形参,argc是整型变量,代表的是参数的个数:argv是指向字 ...