栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Java编程学习-final关键字

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java编程学习-final关键字

基本介绍

需要用到final的需求如下:

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

final class A {}

//class B extends A {} 错误,因为A类使用final修饰,B类无法继承A类

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

class A {

    public final void hi(){}
}



class B extends A {

    //public void hi(){}  错误,父类使用final修饰hi()方法,子类无法重写
}

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

public class Test {

    public static void main(String[] args){
        
        A a = new A();
        //a.TAX_RATE = 2;  错误,属性使用final修饰,无法再次对属性进行赋值

    }

}


class A {

    public final int TAX_RATE = 1;

}

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

class A {

    public void hi(){
        final double NUM = 0.01;
        //NUM = 0.09;  错误,局部变量被final修饰,无法进行再次赋值
    }

}
注意事项和使用细节

1)final修饰的属性又叫常量,一般采用XX_XX_XX来命名;

2)final修饰的属性在定义时,必须赋初始值,并且以后不能再修改,赋值可以在以下位置之一:

        ①定义时:如 public final double TAX_RATE = 0.01;

        ②在构造器中。

        ③在代码块中。

class A {
    
    
    public final double TAX_RATE = 0.01;
    
    public final double TAX_RATE2;//虽然初始化没有赋值,但是构造器中赋值了,可以通过

    public final double TAX_RATE3;//虽然初始化没有赋值,但是代码块中赋值了,可以通过

    public A(){
        TAX_RATE2 = 0.02;
    }

    {
        TAX_RATE3 = 0.03;
    }

}

      3)如果final修饰的属性是静态的,则初始化的位置只能是①定义时 ②在静态代码块中,不能在构造器中赋值;

class A {
    
    
    public static final double TAX_RATE = 11.11;
    
    public static final double TAX_RATE2;//初始化没有赋值,在静态代码块中赋值,可以通过

    //public static final double TAX_RATE3; 构造器中无法对被final修饰的静态常量进行赋值

    static {
        TAX_RATE2 = 22.22;
    }
    
    //public A(){  错误,构造器中无法对被final修饰的静态常量进行赋值
    //    TAX_RATE2 = 33.33;
    //}

}

4)final修饰的类不能被继承,但是可以实现实例化对象;

public class Test {

    public static void main(String[] args){
        
        A a = new A();

    }

}


final class A { }

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

public class Test {

    public static void main(String[] args){
        
       new B().hi();

    }

}


class A {

    public final void hi(){
        System.out.println("A类的hi()方法被调用");
    }
}


class B extends A { }

6)一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法(已经不能被继承,就不可能被重写)

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

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

package com.pero.final_;

public class FinalDetail {
    public static void main(String[] args) {
        System.out.println(Demo.i);//使用final修饰时,输出Demo.i不会执行static代码块;
        // 如果不使用final修饰,输出Demo.i时会执行static代码块
    }
}
class Demo{
    public final static int i = 16;
    static {
        System.out.println("Java课程学习");
    }
}

9)包装类(Integer、Double、Float、Boolean等都是final修饰的类),String也是final修饰的类。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026443.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号