网站建设资讯

NEWS

网站建设资讯

Java学习之final关键字-创新互联

目录

创新互联专注于企业网络营销推广、网站重做改版、文水网站定制设计、自适应品牌网站建设、H5高端网站建设商城网站定制开发、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为文水等各大城市提供网站开发制作服务。

一、基本介绍 

二、使用final的四种情况

第一种

第二种 

第三种 

第四种 

三、细节

第一点

第二点

第三点

第四点

第五点

第六点

第七点

第八点

第九点

四、练习

第一题

第二题

分析



一、基本介绍 

final:最终的,最后的

final 可以修饰类、属性、方法和局部变量

二、使用final的四种情况

在某些情况下,程序员可能有以下需求,就会使用到final:

第一种

1)当不希望类被继承时,可以用final修饰

package com.hspedu.final_;

public class Final01 {

}
final class A {}
class B extends A{}

第二种 

2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。

package com.hspedu.final_;

public class Final01 {

}

//当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰。
class C {
    public final void hi(){

    }
}
class D extends C{
    @Override
    public void hi() {//错误,不能重写
        super.hi();
    }
}

原因:'hi()' cannot override 'hi()' in 'com.hspedu.final_.C'; overridden method is final

第三种 

3)当不希望类的的某个属性的值被修改,可以用final修饰。

package com.hspedu.final_;

public class Final01 {
    public static void main(String[] args) {
        E e = new E();
        e.TAX_RATE = 1.0;//错误
        System.out.println(e.TAX_RATE);
    }
}

class E {
    //当不希望类的的某个属性的值被修改,可以用final修饰。
    public final double TAX_RATE = 0.08;

}

报错:Cannot assign a value to final variable 'TAX_RATE'

第四种 

4) 当不希望某个局部变量被修改, 可以使用 final 修饰

加上final之后,就无法再修改NUM的值

三、细节 第一点

1)final修饰的属性又叫常量,一般 用XX_XX_XX 来命名(大写加下划线)

比如上述中的TAXI_RATE

class E {
    //当不希望类的的某个属性的值被修改,可以用final修饰。
    public final double TAX_RATE = 0.08;

}
第二点

2) final修饰的属性在定义时,必须赋初值,并且以后不能再修改,也就是只能赋值一次,所以系统不会提供默认值,赋值可以在如下位置之一[选择一个位置赋初值即可] :

1.定义时: 如 public final double TAX RATE=0.08;

2.在构造器中

3.在代码块中

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {

    }
}
class AA {
    public final double TAXI_RATE1 = 0.08;//定义的时候赋值
    public final double TAXI_RATE2;
    public final double TAXI_RATE3;

    public AA() {
        //构造器中赋初值
        TAXI_RATE2 = 0.6;
    }
    {
        //在代码块中赋值
        TAXI_RATE3 = 0.9;
    }
}
第三点

3)如果final修饰的属性是静态的,则初始化的位置只能是

1.定义时 2. 在静态代码块, 不能在构造器中赋值

class BB{
    //静态属性赋初值:1.定义时 2. 在静态代码块, 不能在构造器中赋值
    public static final double TAXI_RATE1 = 0.9;
    public static final double TAXI_RATE2;
    //public static final double TAXI_RATE3;
    static {
        TAXI_RATE2 = 0.4;
    }

    public BB() {
        //静态属性在类加载的时候就会完成初始化,final修饰的变量没有默认值
        // 所以在类加载的时候就必须要给TAXI_RATE3赋值
        //但是构造器在创建对象实例的时候才会被调用,所以不能在构造器中赋值

        //TAXI_RATE3 = 0.7;
    }
}
第四点

final类不能继承,但是可以实例化对象。

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {
        CC cc = new CC();
    }
}

final class CC {
    //final类不能继承,但是可以实例化对象
}
第五点

5)如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。

package com.hspedu.final_;

public class FinalDetail01 {
    public static void main(String[] args) {
     
        new EE().hi();//遵循继承的访问查找原则,输出:hi()方法
    }
}


//如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。
//仍然遵守继承机制
class DD {
    public final void hi(){
        System.out.println("hi()方法");
    }
}
class EE extends DD{}
第六点

6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法

package com.hspedu.final_;

public class FinalDetail02 {
    public static void main(String[] args) {

    }
}
//一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法
//这个类是final类,那么就不能被继承,类中的方法自然也不能被重写
final class AAA{

    public final void m1(){}
}
第七点

7)final不能修饰构造方法(即构造器)

第八点

8)final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理。

package com.hspedu.final_;

public class FinalDetail02 {
    public static void main(String[] args) {
        System.out.println(BBB.i);
    }
}

//final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
class BBB{
    public static int i = 16;
    static {
        System.out.println("静态代码块被加载");
    }

}

调用静态属性的时候,会触发类的加载 ,完成静态属性初始化、执行静态代码块

//final 和 static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
class BBB{
    public static final int i = 16;
    static {
        System.out.println("静态代码块被加载");
    }

}

final和static的前后顺序没有要求

第九点

9)包装类(Integer,Double,Float,Boolean等都是final),String也是final类,不能被继承

四、练习 第一题

package com.hspedu.final_;

public class FinalExercise01 {
    public static void main(String[] args) {
        Circle circle = new Circle(4);
        System.out.println("圆的面积=" + circle.circleArea());
    }
}
class Circle{
    public double radius;//半径
    public final double PI; //= 3.14;//定义时赋初值

    public Circle(double radius) {
        this.radius = radius;
        //构造器赋初值
        //PI = 3.14;
    }
    {
        System.out.println("代码块被执行");
        //代码块赋值
        PI = 3.14;
    }

    public double circleArea(){
        return PI * radius * radius;
    }
}
第二题

分析

1)用final关键字修饰形参int x,所以x的值在赋初值之后就不能再修改

2)++x:改变x的值,是错误的

3)return x + 1:虽然是x+1,但是x本身的值并没有改变,所以OK

IDEA提示

Cannot assign a value to final variable 'x':不能给最终变量x赋值

package com.hspedu.final_;

public class FinalExercise02 {
    public static void main(String[] args) {
        System.out.println(A05.addOne(5));
    }
}
class A05{
    public static int addOne(final int x) { //下面的代码是否有误, 为什么? 1min
        //++x; //错误,原因是不能修改 final x 的值
        return x + 1; //这里是可以.
    }

}

输出:6

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:Java学习之final关键字-创新互联
本文来源:http://njwzjz.com/article/ccsiss.html