java学习笔记47--final修饰符

Source

1)修饰类
        用final修饰的类不能被继承,没有子类。
        例如:我们是无法写一个类去继承String类,然后对String类型扩展的,因为API中已经被String类定义为final的了.
        我们也可以定义final修饰的类:
            public final class Action{
            
            }
            
            //编译报错
            public class Go extends Action{
            
            }

2)修饰方法
        用final修饰的方法能被继承,但是不能被子类的重写。
        例如:每个类都是Object类的子类,继承了Object中的众多方法,在子类中可以重写toString方法、equals方法等,但是不能重写getClass方法 wait方法等,因为这些方法都是使用fianl修饰的。
        
        我们也可以定义final修饰的方法:
            public class Person{
                public final void print(){}
            }
            
            //编译报错
            public class Student extends Person{
                public void print(){
                
                }
            }


3)修饰变量
        用final修饰的变量表示常量,只能被赋一次值.其实使用final修饰的变量也就成了常量了,因为值不会再变了。

        修饰局部变量:
        例如:
            public class Person{
                public void print(final int a){
                    //编译报错,不能再次赋值,传参的时候已经赋过了
                    a = 1;
                }
            }
            
            public class Person{
                public void print(){
                    final int a;
                    a = 1;
                    //编译报错,不能再次赋值
                    a = 2;
                }
            }
        
        修饰成员变量:
            非静态成员变量:
                public class Person{
                    private final int a;
                }
                只有一次机会,可以给此变量a赋值的位置:
                    声明的同时赋值
                    匿名代码块中赋值
                    构造器中赋值(类中出现的所有构造器都要写)
                
            静态成员变量:
                public class Person{
                    private static final int a;
                }
                只有一次机会,可以给此变量a赋值的位置:
                    声明的同时赋值
                    静态代码块中赋值
            

4)修饰引用变量
        main:
            final Student s = new Student();
            //编译通过
            s.setName("tom");
            s.setName("zs");
            
            //编译报错,不能修改引用s指向的内存地址
            s = new Student();