笔记2018-03-14

1、静态代码块

static{
//静态代码块
}

关于静态代码块,要注意的是:
(1)它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
(2)静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
(3)静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
(4)一个类中可以有多个静态代码块

public class Test{
staitc int cnt=6;
static{
      cnt+=9;
}
public static void main(String[] args) {
      System.out.println(cnt);
}
static{
      cnt/=3;
}
}
运行结果:
5

2、==和equals()

在Java中,==有两个作用:(1)常用来判断两个基本数据类型的变量是否相等;(2)判断两个引用变量是否指向同一个对象。
.equlas()的作用:equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。
Java中默认的 equals方法实现如下:

public boolean equals(Object obj) {
    return (this == obj);
}

而String类则覆写了这个方法,直观的讲就是比较字符是不是都相同。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
  “==”比较两个变量本身的值,即两个对象在内存中的首地址。
  “equals()”比较字符串中所包含的内容是否相同。
(2)对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。但是,不同数据类型的数据之间比较(即使数值大小是一样的)返回值是false,例如:

image.png

返回值是false。
(3)基本类型比较,那么只能用==来比较,不能用equals

int a = 3;
int b = 4;
int c = 3;
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较

(4)对于除了上述类型之外的变量来说,"=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

3、Switch

在JDK7之前,switch(表达式){……},其中的表达式结果只能是int(可以自动转为int的byte、short、char),枚举类型。
但是JDK7中,表达式结果也可以是字符串。
如果没有break的话,执行完当前打case,还会继续往下执行。

4、break continue

break用于强行退出循环,不执行循环中剩余的语句。(break语句还可用于多支语句switch中)
continue 语句用于循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

5、char与int

char b = 'a'+18; //因为char本身在码表中可以用数字表示的,然后运算之后还是char,应该输出s 
//另外,如果下面定义就是错的了。 
char a = 'a'; 
char b = a + 18; // 这样就是错的,因为JVM运算完后不知道结果是多少,
//所以会提示损失精度的错误,关于一个类型变量值的问题。

int以下的数据类型(精度小于int)运算的时候都会被自动转换为int后进行计算

char b='a'+18; 在运算的时候'a'自动类型提升为int, 加上18也为int类型,用char接收不报错是因为'a'+18相加的值在char类型范围里面,隐式向下转型为char类型,如果把18换成65534就会报错丢失精度了,这个时候就得需要强转或者用int类型来接收。

char a = 'a'; char b = a + 18; 这样报错是因为char b = a + 18中的a为变量,为变量则类型存在不确定性,变量a加上18的类型就不确定,所以会报错有可能丢失精度,需要强转。如果把char a = 'a'加上final则不会报错了,即为final char a = 'a';可见两者的差别,第一个是两个常量相加,第二个是一个变量加上一个常量。

其实char a和'a'不是一回事。就像'a'+18 和b+18不是一回事一样。'a'这个东西是一个常量值(你不要看到'a'就以为它是char类型,其实这里写'a'和97是一样的,默认都是int类型的常量,仅仅加上单引号是为了告诉我们这里面只能放char规定范围的数值)。而你定义了char a='a'这就不一样了,这个a是变量,仅仅是把常量的值赋给变量,这个是'a'这个int值传递给了char,这时候a就是char类型了。char类型与18进行运算,当然得到的结果就是int型,而且必须是int型的内存块。

‘a’+18其实是两个int型的常量进行运算,然后生成一个新的int类型的常量。传递给b的是一个常量值(常量不可改变,变量可以改变),常量的值赋给变量,不存在强制转换,只要这个变量的类型值能够容纳这个新的常量即可。理解这个,你就需要理解常量不可改变这一点上,两个新的常量相加会生成一个新的常量。而变量与常量相加会形成一个新的变量值。

而a+18,其实a已经分配了一个内存空间用存放char类型变量a(记着,a是变量,值可以改变,常量值不可以改变,而且a是char类型),然后把a复制一份放到内存,然后用复制的值的与int类型的常量18进行运算,这时候生成是一个变量值(没有标注,但是一定有一个变量来存放它),然后把这个变量值赋给变量b,因为是变量,存在着类型转换问题。原理是因为a与18分别处于不同的内存块当中,这时候传递给b的是2个内存空间的值,这时候就存在着转换问题了。

你可能感兴趣的:(笔记2018-03-14)