Java的final关键字通常是指不可改变的,不想改变一般有两种理由:设计或者效率。以下讨论到了使用final的三种情况:数据、方法和类。

final数据:

final数据其实就是用final修饰的变量,包括final修饰的参数。这里有几个点要注意:

1. 这个final变量是永远不变的常量;

2. 编译器可以将这个final变量作为常量代入任何计算式中;

3. 编译器要确切知道final变量值才能进行代入计算,就比如用 final String s = getString(),这样的方法就不能代入计算。而final String s = "Breakyizhan"这样的方法就能代入计算

具体的例子:

public class Breakyizhan {
public static void main(String[] args) {
String a = "Breakyizhan99";
final String b = "Breakyizhan";
String d = "Breakyizhan";
String c = b + 99;
String e = d + 99;
//因为final定义的确切值,可以作为常量使用,所以第一个结果为true
System.out.println(a == c);
//第二为false
System.out.println(a == e);

//不是确切定义的,不能作为常量使用,结果为false
final String f = getBreakyizhan();
System.out.println(a == (f+99));

}

public static String getBreakyizhan() {
return "Breakyizhan";
}
}
//输出结果是:
true
false
false

对于final和static两个修饰符,有些人可能比较容易混淆,而对于static修饰的变量,只是存在一份结果而已,看下面这个例子就知道了。

public class Breakyizhan {
public static void main(String[] args) {
MyMath myMath1 = new MyMath();
MyMath myMath2 = new MyMath();
System.out.println(myMath1.i);
System.out.println(myMath1.j);
System.out.println(myMath2.i);
System.out.println(myMath2.j);
}
}

class MyMath {
public final double i = Math.random();
public static double j = Math.random();
}

//s输出结果分析:i输出的是两个不同的结果,而j是不行的,只有一个结果。

final的方法

我们已经知道final的变量了,现在我们来了解一下final的方法,final的方法有下面两个特性,我们要牢牢记得:

1. final的方法不能被重写

2. final的方法和private的方法,所有private的方法都会被默认为是final的方法,不能被重写。

但是final的方法可以被另一个类调用(取决于final方法类的封装),而private方法不能,只能在自己类的内部进行调用,可以在private前面加final关键字,不过这样子也只是多余的。下面的方法试图重写final方法,就会报错:

public class father{
public final String getAttribute(){
return "people";
}
private final String getprivate(){
return "This is my private";
}
}

class son extends father{
@Override
public final String getAttribute(){
return "better people";
//这里会报错,因为final的方法不能重写,final方法表面是最后的方法
}
}

class mother{
father f = new father();
f.getAttribute(); //这里不会报错,因为father类是public的,可以调用getAttribute的方法

f.getprivate();//这里会报错,因为getprivate的方法是private的
}

final的类

被final修饰的类是不支持继承的,有一点是"最后的类",最后的种族的意思,我们只要记得这一点就可以,其它的地方和其它类的用法是一样的。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面写个有趣的例子来给大家看看,加深大家对final类的理解:

public final class siBaDa{
public String getName(){
return "我是斯巴达种族啊!!!!!";
}
private String getSkill(){
return "超强的战斗力";
}
}

class soldier extends siBaDa{ //这里会报错,因为final的类不能被继承,final的类是最后的类
@Override
public final String getSkill{
return "变成斯巴达!!!!";

}
}

class superleader{
siBaDa s = new siBaDa();
s.getSkill() //这里不会报错,因为finald的类可以和其他的类一样使用;

}

本文内容来自:Java的final关键字 – Break易站


—Author: Arvin Chen —Web Address: www.breakyizhan.com (Break易站)

 
转载请保留页面地址:https://www.breakyizhan.com/javamind/999.html
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!