final关键字总结

类的继承:
好处:增强代码的复用性,带来了多态的特性。
弊端:打破了类的封装性,使得子类可以覆写父类中已经封装好的功能。

final关键字的引用就是为了解决类的继承所带来的弊端。
final关键字可以修饰类、函数、变量,其为“最终”的意思
1、final 修饰类,可以使得类成为最终类,最终类不能被继承,即其没有子类。这样就保证了
类中的所有方法都不能被覆写。
2、final 修饰函数,可以使函数成为最终函数,最终函数不能被覆写(覆盖),这样就可以更灵活的使得一个类中
的某些特殊功能不可以被覆盖(覆写),其他的功能仍可以被子类所覆盖(覆写)。
3、final 修饰变量,可以使得变量成为最终变量,最终变量是一个常量,其只可以被赋值一次,之后就不能再被赋值
,其值也不可以再发生变化。使得一个变量成为了一个常量。相对于常量而言,其相当于给常量起了一个名字。final
既可以修饰成员变量,也可以修饰局部变量。
4、被final修饰的变量,相当于其内存空间上了一把锁,使得再该变量在内存的整个过程中,都不允许有新的值被赋
进来。最终变量既然是常量,其名称要全被为大写字母,当有多个单词组成时,则用下划线_来连接单词。
5、当内部类被定义在函数的局部时,内部类只能访问其局部的final修饰的变量。
6、public static final 相当于定义了一个全局的静态常量。public修饰的是权限,只其可以被任何位置的代码所访问
static意味着其归属于类,可以用类名引用,不必创建对象引用,final意味着其为常量。final修饰的变量相当于
C语言中的宏定义。public相当于全局与否,确定了使用范围。static确定了其开辟的位置(方法区中的静态区),和
可以使用的时间(随着类的加载而加载,可以直接使用,不用先创建对象。即存在的时间和类在内存中的事件一致)。
7、final 修饰的变量必须要进行初始化:
1*,当final修饰成员变量时,其开辟的位置是堆内存,该变量已分配空间,就会有么默认值(即被进行默认初始化),
但是,该变量被final修饰了,默认初始化并不能算作final要求的初始化(即第一次赋值),所以必须进行显示初始
化才可以达到目的(包括直接(手动)初始化和构造函数(构造代码块)初始化,),而非构造函数内的初始化(赋值)是错误的,
编译会报错。
2*,当final修饰局部变量时,其开辟的位置是栈内存,栈内存中的变量没有默认初始化过程,所以在栈内存中创建的
变量在使用前必须初始化(赋值),否则编译器报错。对于被final修饰的栈内存中变量(局部变量),要求和
一般的局部变量一样,在使用前赋值即可,若没有赋值而直接引用就会出错。被final修饰的局部变量初始化过后,
不可以再被赋值。
3*,当final修饰静态成员变量时,其空间开辟的位置是类的方法区的静态区,在方法区里创建的变量(静态变量),
也会有默认初始化的值(即也会进行默认的初始化过程)。但因为被final修饰,所以这种默认初始化也没用,必须
进行直接(手动)初始化或静态代码块来初始化,构造函数(构造代码块)内的初始化也不行(构造函数是不应该初始化静态成员变量的,因为静态成员变量
是类变量,应该由静态代码块来初始化。静态成员优先于类对象而存在,是所有类对象共享的变量),会报错。
只有一种初始化方式,就是直接(手动)初始化。
8、综上所述,final修饰的局部变量就相当于局部宏定义,只能在局部使用。使用final修饰变量后,最保险的做法是:
使用直接(手动)初始化对变量进行唯一的一次赋值。
*/

final class Final
{
    static int num ;
    static final int age= 10;
    final static String name= "li";

    String nn;
    Final()
    {
        this("zhang");
        final String n ;
        System.out.println("name:"+name);
        System.out.println("num:"+num);
        System.out.println("age:"+age);
    }
    Final(String n)
    {
    //	age = 5;
    //	name ="zhang";
    //	this.name = n;
    }
    Final(String n,int x)
    {
        this(n);
    }
    public void show()
    {
    //	this.age = 3;
    //	System.out.println("age:"+age);
    }
}


class FinalDemo 
{
    public static void main(String[] args) 
    {
        System.out.println(Final.name);
        Final f = new Final();
        f.show();
    }
}    

  

posted @ 2015-03-20 16:37  蓝色T-shirt  阅读(286)  评论(0编辑  收藏  举报