java基础——final

来源:互联网 发布:梦幻诛仙手游软件礼包 编辑:程序博客网 时间:2024/05/22 15:25

关于继承的小技巧:

  • 将所有的字段都设置为private,将所有的方法都设置为public。
  • 我们采取的最好的做法是保持成员的private 状态——无论如何都应保留对基 础的实施细节进行修改的权利。在这一前提下,可通过protected 方法允许类的继承者进行受到控制的访问。

Final详解

最初的定义是“不可变”,为效率和设计。
- final修饰一个类的时候,这个类不能被继承,里面的所有方法都隐藏的指定为final类型
- final修饰一个方法的时候,这个方法不可以被继承的类调用

final修饰变量

当修饰的为基础类型的变量时,其数值一旦初始化后就不可以改变,当为引用类型时,则在其初始化后不能指向其它对象。

例1.

public class Test {    public static void main(String[] args)  {        String a = "hello2";         final String b = "hello";        String d = "hello";        String c = b + 2;         String e = d + 2;        System.out.println((a == c));        System.out.println((a == e));    }}

result:

truefalse

这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。

例2.
被final修饰的引用变量的数值可变

public class Test {    public static void main(String[] args)  {        final MyClass myClass = new MyClass();        System.out.println(++myClass.i);    }}class MyClass {    public int i = 0;}

Final VS static

public class Test {    public static void main(String[] args)  {        MyClass myClass1 = new MyClass();        MyClass myClass2 = new MyClass();        System.out.println(myClass1.i);        System.out.println(myClass1.j);        System.out.println(myClass2.i);        System.out.println(myClass2.j);    }}class MyClass {    public final double i = Math.random();    public static double j = Math.random();}

输出:j每次相同而i每次不想同。
原因分析:static保证一个变量只有一个副本,而final保证变量不可变。
- 局部内部类和匿名内部类只能访问局部final变量
 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
 会造成数据不一致性,这样就达不到原本的意图和要求。为了解决这个问题,java编译器就限定必须将变量a限制为final变量,不允许对变量a进行更改(对于引用类型的变量,是不允许指向新的对象),这样数据不一致性的问题就得以解决了。
 

原创粉丝点击