java面试final关键字

准备知识点:

  • final可以修饰字段、方法、类。
  • 当修饰字段的时候该字段值不能被改变
  • 当修饰方法的时候该方法不能被覆盖
  • 当修饰类的时候表示该类是终态类,该类不能够被继承换言之它没有子类。

笔试题目如下:

public class FinalTest {

    public final int a;
    
    public String name;
    
    public FinalTest() {
        a = 10;
    }
    
    public FinalTest(String name) {
        name = "zhangsan";
    }
}

问:该程序能否编译通过?

答:该程序无法编译通过。因为final修饰的成员变量有两种初始化方式一种是在声明final成员变量的时候直接赋值,第二种在构造方法中完成赋值,如果一个类有多个构造方法就要保证在每个构造方法中都要完成对该final类型成员变量的初始化工作。

如果是如下代码呢?

public class FinalTest {

    public static final int a;
    
    public String name;
    
    public FinalTest() {
        a = 10;
    }
    
    public FinalTest(String name) {
        a = 11;
        name = "zhangsan";
    }
    
    public static void main(String[] args) {
    }
}

问:编译能否通过?

答:编译同不过。因为static final修饰的常量(需要在类初始化阶段完成赋值)一种是在声明的时候直接显式的初始化,另一种是在static块中完成初始化。不能在构造器中完成初始化(类的实例化阶段)。

那如果代码如下能编译通过吗?


public class FinalTest {

    public static final int a = 12;
    
    public String name;
    
    public FinalTest() {
        a = 10;
    }
    
    public FinalTest(String name) {
        a = 11;
        name = "zhangsan";
    }
    
    public static void main(String[] args) {
    }
}

答:不能。因为常量a已经完成了初始化工作,它已经不能够被改变,构造器中的做法明显是试图去改它的值,故编译通不过。

代码如下能编译通过吗?

public class FinalTest {

    static final StringBuffer sb = new StringBuffer();

    public static void main(String[] args) {
        sb.append("abc");    //能编译通过
        //sb = new StringBuffer();   //不能够编译通过
    }
}

答案:能编译通过,这题是考察当final修饰引用类型变量时,那么是该变量的引用不能改变还是引用的对象的内容不能改变,答案是引用不能改变,引用对象的内容可以改变。

总结:

  • 对于final 修饰的成员变量既可以在声明的时候初始化也可以在所有的构造器中对其完成初始化(注:所有的构造器方法里都必须有对其初始化的语句)
  • 对于static final修饰的常量只能在声明的时候完成初始化或者在static块中对其完成初始化。
  • 对于final修饰的引用类型变量指的是引用不能够改变而不是引用的对象的内容不能够改变。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 1、.java源文件: 一个以”.java“为后缀的源文件:只能有一个与文件名相同的类,可以包含其他类。 2、类方...
    Hughman阅读 1,566评论 1 9
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,370评论 1 44
  • Java关键字final 在设计程序时,出于效率或者设计的原因,有时候希望某些数据是不可改变的。这时候可以使用fi...
    狮_子歌歌阅读 798评论 1 4
  • ​去年5月20日,因为小考拉俱乐部微信公众号,和姐姐认识了。然后,开始了一场旷日持久的思念。她盼我回家,因为我家在...
    小考拉俱乐部阅读 177评论 6 4