您的位置:首页 > 编程语言 > Java开发

学习笔记之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的
示例程序:
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() {
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: