final

package Final.javase.test003;

/**
 * 关于java话言当中final关键字
 *         1、final是一个关键字,表示最终的,不可变的。
 *
 *         2、final修饰的类无法被继承
 *
 *         3、final修饰的方法无法被覆盖
 *
 *         4、final修饰的变量一旦赋值之后,不可重新赋值【不可二次赋值】
 *
 *         5、final修饰的实例变量,必须手动赋值,不能采用系统默认值
 *
 *         6、final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,
 *            那么被指向的对象无法被垃圾回收器回收。
 *             final修饰的引用虽然指向某个对象之后不能指向其它对象,
 *            但是所指向的对象内部的内存是可以被修改的
 *
 *         7、final修饰的实例变量是不可变的,
 *            这种变量一般和static联合使用,被称为“常量"。
 * 
 * 关于myeclipse怎么链接源码?
 *         打开某个.class字节码文件,当没有看到源码的时候:
 *             点击"Attached Source":
 *                 - Workspace..【源码在当前的工作区当中】
 *                 - External File..【源码在某个压缩包当中】
 *                 - External Folder..【源码在某个目录当中】
 * 
 * 以后尽量所有的程序都链换源码,没有源码从网上找,养成看源代码的好习惯。
 * 
 * 对于以后学习的类库,一般都是包括三个部分的:
 *         - 源码【可以看源码来理解程序】
 *         - 字节码【程序开发的过程中使用的就是这部分】
 *         - 帮助文档【对源码的解释说明被提取出来,更方便程序的开发】
 *         注意使用的时候版本统一。
 */
public class FinalTest01 {

    public static void main(String[] args) {
        int i = 10; //10
        System.out.println(i);
        i = 20; //20
        System.out.println(i);
        
        final int k = 100;
        //编译错误,无法为最终变量k分配值
        //k = 200;
        
        final int m;
        m = 200;
        //编译错误,无法为最终变量m分配值
        //m = 100;
    }
}

package Final.javase.test003;

public class FinalTest02 {

    //成员变量之实例变量
    //实例变量有默认值 + final修饰的变量一旦赋值不能重新赋值

    //综合考虑,java语言最终规定实例变量使用final修饰之后,
    //必须手动赋值,不能采用系统默认值
    //final int age; //编译错误
    
    //第一种解决方案
    final int age = 10;
    
    //第二种解决方案
    final int num;
    public FinalTest02(){
        this.num = 100;
    }
    //以上的两种解决方案:其实本质上就是一种方式,
    //都是在构造方法执行过程当中给实例变量赋值。
    
    public static void main(String[] args){
        final int a;
        a = 100;
    }
}


package Final.javase.test003;

public class User {
    
    int id;

    public User(int id) {
        super();
        this.id = id;
    }
}


package
Final.javase.test003; public class FinalTest03 { public static void main(String[] args) { //创建用户对象 User u = new User(100); //User u = 0x1234 //又创建一个新的User对象 //程序执行到此处表示以上对象已变成垃圾数据, //等待垃圾回收器的回收。 u = new User(200); //u = 0x2586 //创建用户对象 final User user = new User(30); //user = new User(50); //final修饰的引用,一旦指向某个对象之后,不能再指向其它对象, //那么被指向的对象无法被垃圾回收器回收。 System.out.println(user.id); user.id = 50; //final修饰的引用虽然指向某个对象之后不能指向其它对象, //但是所指向的对象内部的内存是可以被修改的。 System.out.println(user.id); } }
package Final.javase.test003;

public class FinalTest04 {

    public static void main(String[] args){
        System.out.println(Chinese.GUO_JI); //中国
        System.out.println("圆周率:" + Math.PI); //圆周率:3.1415926
    }
}

class Math{
    
    public static final double PI = 3.1415926;
    
}

//中国人
class Chinese{
    
    //国籍
    //需求:每一个中国人的国籍都是中国,而且国籍不会发生改变,
    //为了防止国籍被修改,建议加final修饰。
    //final修饰的实例变量是不可变的,
    //这种变量一般和static联合使用,被称为“常量"
    //常量的定义语法格式:
    //public static final 类型 常量名 = 值;
    //java规范要求所有常量名字全部大写,每个单词之间使用下划线连接
    public static final String GUO_JI = "中国";
}

 

 

package cfinaltest01;

//final修饰的类无法被继承

/*
final class A{}

class B extends A{}

//不允许
*/

//final修饰的方法无法被覆盖

/*
class A{
    public final void m1(){}
}

class B extends A{
    public void m1(){}
}
*/

//final修饰的局部变量,一旦赋值,不可再改变

/*
class A{
    public void m1(){
        
        //声明
        final int i;
                
        //第一次赋值
        i = 100;
                
        //不可重新赋值
        i = 200;
    }
}
*/

//final修饰的成员变量必须“显示的”初始化
class A{
    //final修饰的成员变量必须手动初始化
    //但是final修饰的成员变量的值是固定,没必要每次都添加一份,所以一般和static联用
    final int i = 100;
    
    //或者在构造方法结束前赋值
    //成员
    final int k;
    
    //构造函数
    A(){
        k = 200;
    }    
}

//final修饰的成员变量一般和static联用
class MyMath{
    
    //static final的叫作常量,java规范中要求所有的常量“大写”
    public static final double PI = 3.14;
}

 

posted @ 2020-08-13 19:52  Lerresino  阅读(148)  评论(0)    收藏  举报