学习笔记之JavaSE(16)--面向对象编程7
2016-11-04 10:28
169 查看
今天学习的内容是final关键字
继承有一个弊端,就是会破坏封装,那么如何解决呢?这就要用到final关键字。final关键字可以修饰变量、方法和类,final表示“这是无法被改变的”。
知识点:
final成员变量必须进行初始化,且无法被改变(无法指向别的对象)
局部变量也可以使用final修饰,意义相同
final实例变量和final静态变量的区别:final静态变量于类首次加载时在在方法区中占据一块恒定不变的存储空间且被初始化,而final实例变量在每次创建对象时都会被重新初始化。如果将随机数赋给它们,final实例变量在每次创建对象时都可能会被赋予不同的值,而final静态变量由于是在类首次加载被初始化的,所以值永远不会被改变。
final实例变量必须进行指定初始化、构造代码块初始化或者构造函数初始化;如果没有进行指定初始化或者构造代码块初始化,那么就必须保证在所有构造函数中都对final实例变量进行初始化
final静态变量必须进行指定初始化或者静态代码块初始化
final方法无法被覆盖
类中所有private方法都被隐式地指定为final方法,由于子类无法访问private方法,所以也就无法覆盖它。如果子类使用覆盖方法的格式想要覆盖父类的private方法,仅是创建了一个新方法。
final类无法被继承,并且final类中的所有方法都被隐式地指定为final的
示例程序:
继承有一个弊端,就是会破坏封装,那么如何解决呢?这就要用到final关键字。final关键字可以修饰变量、方法和类,final表示“这是无法被改变的”。
知识点:
final成员变量必须进行初始化,且无法被改变(无法指向别的对象)
局部变量也可以使用final修饰,意义相同
final实例变量和final静态变量的区别:final静态变量于类首次加载时在在方法区中占据一块恒定不变的存储空间且被初始化,而final实例变量在每次创建对象时都会被重新初始化。如果将随机数赋给它们,final实例变量在每次创建对象时都可能会被赋予不同的值,而final静态变量由于是在类首次加载被初始化的,所以值永远不会被改变。
final实例变量必须进行指定初始化、构造代码块初始化或者构造函数初始化;如果没有进行指定初始化或者构造代码块初始化,那么就必须保证在所有构造函数中都对final实例变量进行初始化
final静态变量必须进行指定初始化或者静态代码块初始化
final方法无法被覆盖
类中所有private方法都被隐式地指定为final方法,由于子类无法访问private方法,所以也就无法覆盖它。如果子类使用覆盖方法的格式想要覆盖父类的private方法,仅是创建了一个新方法。
final类无法被继承,并且final类中的所有方法都被隐式地指定为final的
示例程序:
public class Zi extends Fu { /* final实例变量和final静态变量的区别 */ private static Random rand = new Random(); private final int A = rand.nextInt(10);//每次创建对象时都会被重新从初始化 private static final int B = rand.nextInt(10);//在方法区中占据一块恒定不变的存储空间,只在类第一次加载时初始化 /* final实例变量必须初始化,如果不进行指定初始化或者构造代码块初始化的话 必须在所有构造函数里面都对其进行初始化 */ private final int count; public Zi() { count = 1; } public Zi(String s) { count = 1; } /* final静态变量也必须初始化,必须进行指定初始化或者静态代码块初始化 */ private static final int X; static { X = 1; } publi 9455 c static void main(String[] args) { Zi z = new Zi(); //! z.num = 1; final变量不能被改变 //!z.fu = new Fu(); final引用不能指向别的对象 Zi z1 = new Zi(); System.out.println("第一次创建对象时,a=" + z.A); System.out.println("第一次创建对象时,B=" + B); System.out.println("第一次创建对象时,a=" + z1.A); System.out.println("第一次创建对象时,B=" + B); } //子类方法无法覆盖父类的private方法,这里相当于定义了一个新方法 public void aa() { } //!public void bb(){} 子类无法覆盖父类的final方法 public void cc(final Fu fu) { //!fu=new Fu(); final引用不能指向别的对象 } } //final类无法被继承,且类中所有方法都被隐式地指定为final方法 final class CannotBeOverride { } class Fu { //类中所有的private方法都隐式地指定为final的 private void aa() { } //final方法无法被覆盖 public final void bb() { } }
相关文章推荐
- [置顶] JavaSE学习笔记_16:Java-Calendar类
- ASP学习笔记(16)--Add and update对象以及date和time
- Symbian学习笔记(16) - 解析XML文件(下)
- GCC-3.4.6源代码学习笔记(16)
- 汇编学习笔记16
- C++Primer学习笔记第十六章(16/18)类 模型与泛型编程
- Java 对象的 toString() 方法 -Java 学习笔记 (16)
- Java学习笔记---16.面向对象编程11-Java多态性,instanceof及Object类
- 学习笔记16—交通灯管理系统
- OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标
- APUE 学习笔记 - Chapter 16 . Network IPC: Sockets
- C#面向对象设计模式纵横谈 学习笔记16 Interpreter 解释器模式(行为型模式)
- JUnit学习笔记16---用JSP和taglib进行单元测试3
- Java学习笔记16
- 【个人学习笔记16之--浅谈UDF(用户自定义函数)】
- Asp.Net Ajax 学习笔记16 Profile Service扩展方式
- 传智博客学习笔记16--JAVA SCRIPT HTML语言基础
- 传智播客Hibernate视频教程学习笔记16
- 《Javascript高级程序设计》(第2版)学习笔记16--处理XML
- Delphi 2010学习笔记(16)---流程控制的注意事项---2011-01-21