1. final变量
2. final方法
3. final类
1. final 变量
final关键字时常用于修饰变量,比如 final int age = 21
,起到一种类似于是C语言中的宏定义的作用,这里变量一旦声明,就不能再进行更改。final修饰的变量必须要在定义的时候就赋予初始值,或者可以先定义然后再构造方法中赋初值。而若是static 和 final一同修饰的变量,那么需要在定义的时候赋值,且通常为大写字母用下划线连接。
也可以在有参的方法中将参数类型用final修饰,被final修饰的参数也是不可以改变的,只能进行值的调用。
另外,final除了修饰几种基本类型数据,还可以修饰对象引用。
举个例子
public class FinalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
final Quote quote = new Quote();
quote.i ++;
System.out.println(quote.i);
}
}
class Quote{
public int i = 0;
}
上面的final Quote quote = new Quote();
就是一个对象引用。
运行结果
可以看出来final修饰的对象引用所指向的空间的值由0变成了1,也就是这里的值是可以发生改变的。
那么final修饰的“不可变”在对象引用时提先在哪里?看下面的例子
public class FinalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
final String s1 = "我是";
String s2 = "我是";
String s3 = "A";
String Fs = s1 + "A";
String Us = s2 + "A";
String s = "我是A";
System.out.println((Fs == s));
System.out.println((Us == s));
}
}
运行结果
首先java 中String 是个对象,是引用类型,因此这里用string类型来进行引用对象的验证,==
符号当比较对象时,比较规则是:两个对象基于内存引用,若两个对象的引用完全相同,也就是指向的空间和内容都相同,则==
返回的结果为true。
根据上面的运行结果,final修饰的引用类型所指向的空间没有发生变化,因此,当final修饰对象的时候,指向的空间没有发生变化。这也是此时final的“不可变“的体现。
2. final方法
用final修饰的父类方法,是不可以被子类覆盖(重写)的,另外,了解继承的应该都知道,在父类中用private修饰的方法是不能在子类中重写的,因此也可以理解为private修饰的方法被隐式的指定为用final修饰。因此一个被定义为private的方法也就不需要再用final再进行修饰
class Parent{
private final void Method1() {
System.out.println("父类一");
}
public final void Method2() {
System.out.println("父类二");
}
public void Method3() {
System.out.println("父类三");
}
}
class ChildClass extends Parent{
}
尝试对上面方法重写
可以看到只有没有被final和private修饰的Method3()
方法可以重写,其余都不可以。
3. final类
被final修饰的类不能被继承。并且不能做任何的修改。
.
.
.
欢迎交流和指正