final

引用类型变量

  (1)把类名当作是一种类型来声明变量,这种变量叫引用类型变量。如:People people;

  (2)引用类型变量保存对象的“引用”,即对象的地址。

  (3)对象的创建  new 类名()  如:new People();

  (4)new创建对象后返回对象的引用,对象没有名字,只能使用对象的引用间接使用对象,引用类型变量就是专门用来保存对象引用的。

    如:People people = new People();

  (5)成员变量的默认值:数据型成员变量默认值为0,boolean型成员变量默认值为false,引用类型成员变量默认值为null。

  (6)对象内存分配,对象是被保存在堆中的,对象没有名字。

final

一.final关键字的基本用法

1.修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。
final类中的 成员变量 可以根据需要设为final, 但是要注意final类中的所有 成员方法 都会被隐式地指定为final方法。

在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

2.修饰方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。

因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。

注:类的private方法会隐式地被指定为final方法。

3.修饰变量

如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

        String a = "hello2"; 
        final String b = "hello";
        String d = "hello";
        String c = b + 2; 
        String e = d + 2;
        System.out.println((a == c));//true
        System.out.println((a == e));//false
        由于String是在常量池中创建,不可有相同的内容指向不同的String类型,相同内容c只能出现一个地址存储,而e内容是2和指向d的地址组成的新地址;

final变量b:在使用的时候是直接被替换成它的值;
String类型d:在使用时候是链接对象地址使用;
栈   基本类型的变量和对象的引用变量 
堆   由new等指令创建的对象和数组
Case cc; //在栈内存里面开辟了空间给引用变量cc,这时cc=null
cc=new Case();

1. new Case()在堆内存里面开辟了空间给Case类的对象,这个对象没有名字
2. Case()随即调用了Case类的构造函数
3. 把对象的地址在堆内存的地址给引用变量cc

二.深入理解final关键字

1、初始化问题:

—-final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。

如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。

—-如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。

final class stu{

    private final int a;
     public stu(int b) {
         this.a = b;
     }
    public int getA() {
        return a;
    }

}

public static void main(String[] args) {
        stu s = new stu(12);
        System.out.println(s.getA());

        stu ss = new stu(11);
        System.out.println(ss.getA());
    }
要想改变a值,只能在构造函数中改变;

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类。

2、继承问题

Final类 :当关键字fina用来修饰类时,其含义是该类不能在派生子类。只有当需要确保类中的所有方法都不被重写时才应该建立最终(final)类,final关键字将为这些方法提供安全,没有任何人能够重写final类中方法,因为不能继承。

Final方法、成员变量:当用final关键字修饰方法后,该方法在子类中将无法重写,只能继承。

3.Final和Static
Static作用于成员变量用来表示只保存一份副本,而Final的作用是用来保证变量不可变。
Static修饰的属性强调它们只有一个,Final修饰的属性表明是一个常数(创建后不能被修改)。

public class Demo1 {
    public static void main(String[] args) {
            MyClass myClass1 = new MyClass();
            MyClass myClass2 = new MyClass();
            System.out.println("i:"+myClass1.i);
            System.out.println("i:"+myClass2.i);//i可变
            System.out.println("j:"+myClass1.j);
            System.out.println("j:"+myClass2.j);//staic不变
    }
}
class MyClass {
    public final double i = Math.random();
    public static double j = Math.random();
}

static在类加载时候加载,之后初始化对象就不变了。
final在每次新建对象时候都
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值