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

    接上篇. 改造一下MapsActivity: public class MapsActivity extends Activity implements LocationListener, InfoW ...

  2. CentOS 6.7平台Hadoop 1.2.1环境搭建

    本教程使用Vultr的VPS搭建,主要实现HDFS和MapReduce两个功能. master.hadoop - 45.32.90.100 slave1.hadoop - 45.32.92.47 sl ...

  3. Linq保留字含义

    using System; using System.Query; using System.Collections.Generic; class app { static void Main() { ...

  4. ado.net 学习小结

    连接数据源 Connection对象.Connection对象处于最顶层,是所有数据访问请求的关口.我们通过其暴露的属性进行配置.下面是一段连接字符串的示例. if (string.IsNullOrE ...

  5. SQL 建立临时表进行查询

    SELECT min (maxrank) as minofmaxrank FROM (SELECT max(rank) as maxrank FROM tbl_core_staff WHERE st_ ...

  6. Stream To String , String To Stream

    public static string StreamToString(Stream stream) { stream.Position = 0; using (StreamReader stremR ...

  7. 读懂IL代码(四)

    这一篇是IL系列的最后一篇的,主要是要说一下IL中的流程控制.我相信,经过前面三篇的介绍,看IL代码应该不是什么大问题了吧.好吧,闲话不多说了,就来简单的说一下吧. 还是跟前几篇一样,以例子来解释说明 ...

  8. 345. Reverse Vowels of a String(C++)

    345. Reverse Vowels of a String Write a function that takes a string as input and reverse only the v ...

  9. C++线程类的封装

    简单的C++线程操作的封装,使用了智能指针管理对象的释放. 可运行对象基类 class SimpleRunable:public RefCountedBase { public: SimpleRuna ...

  10. 桂电在线-转变成bootstrap版2(记录学习bootstrap)

    下载bootstrap框架https://github.com/twbs/bootstrap 或者 http://getbootstrap.com/ 拷贝模板 修改基本模板 语言zh-cn,标题,描述 ...