java final关键字

2年前 (2022) 程序员胖胖胖虎阿
212 0 0

🍅 Java学习路线配套文章:搬砖工逆袭Java架构师

🍅 基础推荐:Java基础教程系列

🍅 实战推荐:Spring Boot基础教程

🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪

🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 

🍅 欢迎点赞 👍 收藏 ⭐留言 📝  

目录

一、 final

 1、修饰引用

 2、修饰方法

3、修饰类

二、Java中的对象析构与finalize方法

三、static

1、static变量

2、静态变量和非静态变量的区别

3、static方法

4、static代码块

(1)代码实例

(2)利用static代码块的方式优化代码


一、 final

 final关键字可以用来修饰引用、方法和类。

 1、修饰引用

  1.  如果引用为基本数据类型,则该引用为常量,该值无法修改;
  2.  如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  3.  如果引用时类的成员变量,则必须当场赋值,否则编译会报错。

 2、修饰方法

当使用final修饰方法时,这个方法无法被子类重写。但是,该方法仍然可以被继承。

3、修饰类

当用final修改类时,该类成为最终类,无法被继承。

二、Java中的对象析构与finalize方法

有些面向对象的程序设计语言,特别是C++,有显式的析构器方法,其中放置一些当对象不再使用时需要执行的清理代码。在析构器中,最常见的操作是回收分配给对象的存储空间。由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。

       当然,某些对象使用了内存之外的其它资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不再需要时,将其回收和再利用将显得十分重要。

       可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。

     注释:有个名为System.runFinalizersOnExit(true) 的方法能够确保finalize方法在Java关闭前被调用。不过这个方法并不安全,也不鼓励大家使用。有一种代替的方法是使用方法Runtime.addShutdownHook添加“关闭钩”(shutdown hook),详细内容请参看API文档。如果某个资源需要在使用完毕后立刻被关闭,那么就需要由人工来管理。可以应用一个类似dispose或close的方法完成相应的清理操作。特别需要说明,如果一个类使用了这样的方法,当对象不再被使用时一定要调用它。

三、static

static的作用就是方便在没有创建对象的情况下来进行调用(方法/变量)。

被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

1、static变量

public static String name = "哪吒";

静态域可以用方法.静态域的方式访问;

可以通过静态方法访问;

2、静态变量和非静态变量的区别

静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

3、static方法

static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

java final关键字

4、static代码块

可以通过static代码块的形式提高程序性能,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

(1)代码实例

未用static静态代码块的方式, startDate 和 endDate其实可以看做是一个常量,每次使用的时候,值都是一样的,没必要每次调用方法都初始化一遍。

package com.nezha.javase;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test1107 {
    private String name;
    private Date birthDate;

    public Test1107(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    /**
     * 定义一个通用的SimpleDateFormat
     * private 本类内使用
     * static 提高性能
     * final 不可修改
     */
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    boolean is90() throws ParseException {
        Date startDate = sdf.parse("1990-01-01");
        Date endDate = sdf.parse("2000-01-01");
        return this.birthDate.compareTo(startDate)>=0 && this.birthDate.compareTo(endDate) < 0;
    }

    public static void main(String[] args) throws ParseException {
        Date date = sdf.parse("1999-09-01");
        Test1107 test = new Test1107("哪吒",date);
        String msg = test.getName() + (test.is90()?"是90后":"不是90后");
        System.out.println(msg);
    }
}

(2)利用static代码块的方式优化代码

package com.nezha.javase;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StaticTest {
    private String name;
    private Date birthDate;

    public StaticTest(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    /**
     * 定义一个通用的SimpleDateFormat
     * private 本类内使用
     * static 提高性能
     * final 不可修改
     */
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 利用静态代码块的方式优化性能
     */
    private Date startDate;
    private Date endDate;
    static {
        try {
            Date startDate = sdf.parse("1990-01-01");
            Date endDate = sdf.parse("2000-01-01");
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    boolean is90() throws ParseException {
        return this.birthDate.compareTo(startDate)>=0 && this.birthDate.compareTo(endDate) < 0;
    }

    public static void main(String[] args) throws ParseException {
        Date date = sdf.parse("1999-09-01");
        Test1107 test = new Test1107("哪吒",date);
        String msg = test.getName() + (test.is90()?"是90后":"不是90后");
        System.out.println(msg);
    }
}

上一篇:Java零基础入门 9:Java Date类

下一篇:Java零基础入门 11:Java继承

java final关键字

添加微信,备注1024,赠送Java学习路线思维导图 

版权声明:程序员胖胖胖虎阿 发表于 2022年10月28日 上午5:32。
转载请注明:java final关键字 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...