• Tags , , , ,         
  • 2017-12-21  20:50:29        
  • 57 °C    

    Java的final关键字通常是指不可改变的,不想改变一般有两种理由:设计或者效率。以下讨论到了使用final的三种情况:数据、方法和类。

    final数据:

    final数据其实就是用final修饰的变量,包括final修饰的参数。这里有几个点要注意:

    1. 这个final变量是永远不变的常量;

    2. 编译器可以将这个final变量作为常量代入任何计算式中;

    3. 编译器要确切知道final变量值才能进行代入计算,就比如用 final String s = getString(),这样的方法就不能代入计算。而final String s = "Breakyizhan"这样的方法就能代入计算

    具体的例子:

    public class Breakyizhan {
    public static void main(String[] args) {
    String a = "Breakyizhan99";
    final String b = "Breakyizhan";
    String d = "Breakyizhan";
    String c = b + 99;
    String e = d + 99;
    //因为final定义的确切值,可以作为常量使用,所以第一个结果为true
    System.out.println(a == c);
    //第二为false
    System.out.println(a == e);
    
    //不是确切定义的,不能作为常量使用,结果为false
    final String f = getBreakyizhan();
    System.out.println(a == (f+99));
    
    }
    
    public static String getBreakyizhan() {
    return "Breakyizhan";
    }
    }
    //输出结果是:
    true
    false
    false

    对于final和static两个修饰符,有些人可能比较容易混淆,而对于static修饰的变量,只是存在一份结果而已,看下面这个例子就知道了。

    public class Breakyizhan {
    public static void main(String[] args) {
    MyMath myMath1 = new MyMath();
    MyMath myMath2 = new MyMath();
    System.out.println(myMath1.i);
    System.out.println(myMath1.j);
    System.out.println(myMath2.i);
    System.out.println(myMath2.j);
    }
    }
    
    class MyMath {
    public final double i = Math.random();
    public static double j = Math.random();
    }
    
    //s输出结果分析:i输出的是两个不同的结果,而j是不行的,只有一个结果。

    final的方法

    我们已经知道final的变量了,现在我们来了解一下final的方法,final的方法有下面两个特性,我们要牢牢记得:

    1. final的方法不能被重写

    2. final的方法和private的方法,所有private的方法都会被默认为是final的方法,不能被重写。

    但是final的方法可以被另一个类调用(取决于final方法类的封装),而private方法不能,只能在自己类的内部进行调用,可以在private前面加final关键字,不过这样子也只是多余的。下面的方法试图重写final方法,就会报错:

    public class father{
    public final String getAttribute(){
    return "people";
    }
    private final String getprivate(){
    return "This is my private";
    }
    }
    
    class son extends father{
    @Override
    public final String getAttribute(){
    return "better people";
    //这里会报错,因为final的方法不能重写,final方法表面是最后的方法
    }
    }
    
    class mother{
    father f = new father();
    f.getAttribute(); //这里不会报错,因为father类是public的,可以调用getAttribute的方法
    
    f.getprivate();//这里会报错,因为getprivate的方法是private的
    }

    final的类

    被final修饰的类是不支持继承的,有一点是"最后的类",最后的种族的意思,我们只要记得这一点就可以,其它的地方和其它类的用法是一样的。Java中有许多类是final的,譬如String, Interger以及其他包装类。下面写个有趣的例子来给大家看看,加深大家对final类的理解:

    public final class siBaDa{
    public String getName(){
    return "我是斯巴达种族啊!!!!!";
    }
    private String getSkill(){
    return "超强的战斗力";
    }
    }
    
    class soldier extends siBaDa{ //这里会报错,因为final的类不能被继承,final的类是最后的类
    @Override
    public final String getSkill{
    return "变成斯巴达!!!!";
    
    }
    }
    
    class superleader{
    siBaDa s = new siBaDa();
    s.getSkill() //这里不会报错,因为finald的类可以和其他的类一样使用;
    
    }

    本文内容来自:Java的final关键字 – Break易站


    —Author: Arvin Chen —Web Address: www.breakyizhan.com (Break易站)

     
    转载请保留页面地址:https://www.breakyizhan.com/javamind/999.html