final关键字的含义
作用:
对于基本类型,final使数值恒定不变。对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它指向另一个对象,然而,对象其本身确实可以被修改的,这句话怎么理解请看一个Demo。
public class Value {
int i;
public Value(int i) {
this.i = i;
}
import java.util.Random;
public class FinalData {
private static Random rand = new Random();
private String id;
public FinalData(String id) {
this.id = id;
}
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
public final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
private final int[] a = {1, 2, 3, 4 , 5 , 6};
@Override
public String toString() {
return id + "+ "i4= " + i4 + ", INT_5 = " + INT_5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
fd1.v2.i++;
fd1.v1 = new Value(9);
for (int i = 0; i < fd1.a.length; i++) {
fd1.a[i]++;
}
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1);
System.out.println(fd2);
}
}
输出:
fd1:i4= 5, INT_5 = 15
Creating new FinalData
fd1:i4= 5, INT_5 = 15
fd2:i4= 7, INT_5 = 15
大家可以看到i4的值在变,为什么。因为final修饰符的真正含义是引用指向的对象不变,但是对象本身的值在初始化的时候却是可以改变的。因为初始化对象采用的是随机数,所以导致对象的值可以改变。这也就是为什么常量不仅是final 还是static 的,因为static表示在装载时已经被初始化,而且也只会被初始化一次,所以IINT_5的值是不变的
final指定的值必须在域定义处或者每个构造器中用表达式对final进行赋值。
class Peoppet {
private int i;
Peoppet(int ii) {
i = ii;
}
}
public class BlankFinal {
private final int i = 0;
private final int j;
private Peoppet p;
public BlankFinal() {
j = 1;
p = new Peoppet(1);
}
public BlankFinal(int x) {
j = x;
p = new Peoppet(x);
}
public static void main(String[] args) {
new BlankFinal();
new BlankFinal(47);
}
}
如果不在这两个步骤初始化就会报错。
不要将final与private合用,因为无任何意义,一般在方法内使用final处于设计或者效率的原因。
但是在JAVASE5以上就不需要使用final去提高方法的效率,那么就剩处于将方法设计为无法修改的目的。
final类是希望没有任何子类,不希望被继承。String类就是典型的这种类
static 静态的
涉及的知识点
(1)静态代码块(执行顺序是第一位)
(2)静态变量
(3)静态方法(用类可以调出来)
静态属性是共享的,在静态方法中是没有this对象的
this 当前对象的引用
在JAVA中是依靠引用去判断是否有些哪些方法,实际使用:
public class Freedom {
private int i;
private String mFood;
private String mWater;
public Freedom(int i, String mFood, String mWater) {
super();
this.i = i;
this.mFood = mFood;
this.mWater = mWater;
}
public Freedom(int i, String mFood) {
this(i, mFood, null);
}
}
运用重载有不同的构造方法,用this可以调用本类的构造方法。同样可以用this也可以调用本类中的方法进行不同的封装。
continue与break关键字的使用:
for(int i = 0 ; i < 5 ; i++) {
System.out.println("for循环++" + i);
continue;
}
for(int i = 0 ; i < 5 ; i++) {
System.out.println("for循环++" + i);
break;
}
当年在continue下面继续输入code,就会提示该code不可到达
1、continue只是该次循环continue后面的code不再执行,而break则是直接跳出当前循环
2、continue必须在一个循环中使用,for循环或者while循环之类使用,而break不仅可以在这种循环中使用也可以在switch以及if中使用,表示退出当前循环或者跳出当前逻辑判断的逻辑