唐僧喜欢小龙女

导航

java 关键字 final的总结

1、java 关键字 final的总结

final 修饰类 这个类不能被继承。例如 java.lang.String
final 修饰 类中的某个方法 意思是 如果该类被继承了那么 该方法不能被重写。
final 修饰 变量 变量的值被确定了就不能再改变了

final 修饰 形参 调用 方法时 传的参数 在方法里面不能 被修改

public int getAge(final int id){
//给形参一但设置了 值 就不能再给形参 设置另一个值。
//id++; 这里编译都过不去
return this.age;
}


final 修饰 实例对象时 同一个对象 只能new 一次 不能 new两次。

final Cat cat1 = new Cat(1);
//cat1 = new Cat(1); 这里编译过不了
Cat cat2=new Cat(2); //这里没有问题
cat1.setAge(1);
System.out.println(cat1.getAge());

2、final 修饰的成员变量必须手动初始化

final关键字我们并不陌生,但是final修饰的属性变量为什么必须在定义的时候或者构造函数或者代码块中被初始化呢?

首先要明白一点:

final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。

如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。
/**
 *
 *  这里特别的注意啊,Width 和 Left都是final修饰的
 *  我已经通过构造器显示的给这两个属性赋值了。
 *  疑问:为什么我重载的构造器只用了 name 属性Width 和Left编译报需要初始化呢
 *      原因:如果只用 带name 属性的构造器造对象,那么Width 和 Left就没有赋值
 *      了所以会报编译需要初始化
 *
 */
public class FinalTest {
    final int Width;
    final int Left;
    String name;


    public FinalTest(int width, int left, String name) {

        Width = width;
        Left = left;
        this.name = name;
    }

//    public FinalTest(String name){
//        this.name = name;
//    }
}

 

3、static final修饰的变量又为什么必须在定义的时候进行初始化呢?

如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。

如果不在定义的时候初始化,那么既无法在构造函数中初始化,系统也不会赋默认值。则该变量被定义出来是毫无意义的。

参考:https://blog.csdn.net/AlbenXie/article/details/100159183?utm_medium=distribute.pc_feed_404.none-task-blog-2~default~OPENSEARCH~default-1.control404&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-2~default~OPENSEARCH~default-1.control40

 

posted on 2019-11-08 12:03  与时具进&不忘初心  阅读(141)  评论(0编辑  收藏  举报