一:基本介绍
final可以修饰__类,属性,方法和局部变量
以下需求可以用到final:
- 当不希望类被继承时,可以用final修饰 ```java final class PersonS{
} class Student extends PersonS{ //会报错 }
2. **_当不希望父类的某个方法被子类覆盖/重写(override)时,可以用ffinal关键字修饰_**```javaclass PersonS{public final void say(){}}class Student extends PersonS{@Overridepublic void say() { //会报错super.say();}}
当不希望类的的某个属性的值被修改,可以用final修饰. ```java class PersonS{
public final int age =18;
} class Student extends PersonS{ public Student() { super.age = 20; } }
4. **_当不希望某个局部变量被修改,可以便用final修饰_**```javaclass 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方法,则该方法虽然不能重写,但是可以被继承。_**```javapublic 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:细节题```javapublic class Test{public int addone(fina int x){++x; //final x的值不能修改return x+1; //没有改变x的值}}
