Final

作者: Poisson_Lee | 来源:发表于2020-02-06 13:24 被阅读0次
    1. 修饰类
      当用final去修饰一个类的时候,表示这个类不能被继承。简称为“断子绝孙类”。用final来修饰类的时,说明这个类从设计之初,就不打算用来被继承,换句话说,也不允许其他人来继承这个类,从而保证安全性。
      a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为final
      b. final类中的成员方法都会被隐式的指定为final方法。

    2.修饰方法
    被final修饰的方法不能被重写。当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被子类继承。
    一般用final修饰方法的目的是:锁住方法,防止继承它的类来修改(覆盖)它。
    a. 一个类的private方法会隐式的被指定为final方法。
    b. 如果父类中有final修饰的方法,那么子类不能去重写。

    1. 修饰成员变量
      a. 必须初始化值。
      b. 被final修饰的成员变量赋值,有两种方式:1、直接赋值 2、全部在构造方法中赋初值。
      c. 如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
      d. 如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的;比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
      e. 如果修饰类的成员变量,则必须当场赋值,否则编译会报错。
    final class Person {
        String name ="zs";
        //3. 此处不赋值会报错
        //final int age;
        final int age = 10;  
    }
    public class Demo01 {
        public static void main(String[] args) {
            //1. 基本数组类型为常量,无法修改
            final int i = 9;
            //i = 10;
           
            //2. 地址不能修改,但是对象本身的属性可以修改
            Person p = new Person();
            p.name = "lisi";
            final int[] arr = {1,2,3,45};
            arr[3] = 999;
            //arr = new int[]{1,4,56,78};
        }
    }
    

    4.修饰方法参数
    在我们编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,我们不会(实际上是不能)改变参数的值。当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。 注:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。 final不能用于修饰构造方法。

    public class Test4 { 
            public static void main(String[] args) { 
                    new Test4().f1(2); 
            } 
    
            public void f1(final int i) { 
                    //i++;    //i是final类型的,值不允许改变的. 
                    System.out.print(i); 
            } 
    }
    

    指向对象或数组的地址的引用不能修改。例子如下:

    //例3
    public class Demo{
        public static void main(String[]args){
            final Cat cat1=new Cat(1);
            Cat cat2=new Cat(2);
            cat1=cat2;
        }
    }
    
    class Cat{
        private int id=0;
        private int age=0;
        Cat(int id){this.id=id;}
        public void setAge(int age){
            this.age=age;
        }
    }
    
    image.png

    当用final来修饰对象时,不能改变对象的引用,但是可以修改对象的属性值。cat1只能指向id为1的猫,如果让它指向cat2所指的猫,编译器会报错(例3)。

    final 和 static的区别

    用final修饰,主要是为了表现“不可修改性”,提高安全性 。
    static重点在于共享,方便。在类里创建一个static修饰的函数,则可以直接通过类名访问,该类new出来的对象,也可以共享static函数,或者static修饰的共有属性。

    相关文章

      网友评论

          本文标题:Final

          本文链接:https://www.haomeiwen.com/subject/panyxhtx.html