一:基本介绍
final可以修饰__类,属性,方法和局部变量
以下需求可以用到final:
- 当不希望类被继承时,可以用final修饰 ```java final class PersonS{
} class Student extends PersonS{ //会报错 }
2. **_当不希望父类的某个方法被子类覆盖/重写(override)时,可以用ffinal关键字修饰_**
```java
class PersonS{
public final void say(){
}
}
class Student extends PersonS{
@Override
public void say() { //会报错
super.say();
}
}
当不希望类的的某个属性的值被修改,可以用final修饰. ```java class PersonS{
public final int age =18;
} class Student extends PersonS{ public Student() { super.age = 20; } }
4. **_当不希望某个局部变量被修改,可以便用final修饰_**
```java
class PersonS{
public void speak(){
final int num = 19;
num = 20;
}
}
二:final注意事项和细节讨论
final修饰的属性又叫常量,一般用XX_XX_XX来命名
class Person{
public final int NUM = 100;
}
final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一【选择一个位置赋初值即可】:
- ①定义时 : 如public final double TAX_RATE=0.08;
- ②在构造器中
③在代码块中
class PersonS{
public final int NUM ;
//构造器中赋值
public PersonS() {
NUM = 10;
}
//代码块中
{
NUM = 10;
}
}
如果final修饰的属性是静态的,则初始化的位置只能是
- ①定义时
- ②在静态代码块不能在构造器中赋值。
- 静态在类记载的时候就执行,而构造器是在创建对象的时才执行的。
类加载完之后才有可能去执行构造器,如过没有创建对象的话都不执行
class PersonS{
public static final int NUM ;
static {
NUM = 10;
}
}
final类不能继承,但是可以实例化对象。 ```java public class Finaltest { public static void main(String[] args) {
PersonS personS = new PersonS();
} } final class PersonS{
}
- **_如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。_**
```java
public static void main(String[] args) {
Student student = new Student();
student.speak();
}
class PersonS{
public final void speak(){
System.out.println("speak()");
}
}
class Student extends PersonS{
}
一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法。
//使用Final类无非就是不想被继承,都继承表了方法自然也无法重写
final class PersonS{
public void speak(){
System.out.println("speak()");
}
}
final不能修饰构造方法(即构造器)
final和 static往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理。
public class Finaltest {
public static void main(String[] args) {
System.out.println(PersonS.NUM);
}
}
class PersonS{
//不加final,主方法中使用会导致累的加载,从而执行static语句
public final static int NUM = 100;
//加了之后不会导致累的加载,从而之访问final属性
static {
System.out.println("Person中的静态代码块");
}
}
包装类(Integer,Double,Float,Boolean等都是final),String也是final类。
三:final应用举例
1:计算面积
```java public class Finaltest { public static void main(String[] args) {
Circle circle = new Circle(5);
Circle circle1 = new Circle(1);
System.out.println(circle1.Squera());
} } class Circle{
private double r;
private final double PI;
public Circle(double r) {
this.r = r;
} {
PI = 3.14;
} public double Squera() {
return PI * r * r;
} public double getR() {
return r;
} public void setR(double r) {
this.r = r;
} }
<a name="whb0l"></a>
#### 2:细节题
```java
public class Test{
public int addone(fina int x){
++x; //final x的值不能修改
return x+1; //没有改变x的值
}
}