1.与 或 非 与非 或非 && ||
与: | and -> 有0出0,全1出1 例如:1 ,1–>1 1 ,0–>0 0 ,1–>0 0 ,0–>0 |
或: | or -> 有1出1,全0出0 例如:1 ,1–>1 1 ,0–>1 0 ,1–>1 0 ,0–>0 |
非: | not ->有1出0,有0出1 例如:1 -->0 0–>1 |
与非: | nand ->先按与的操作,然后结果取反 例如:1 ,1–>0 1 ,0–>1 0 ,1–>1 0 ,0–>1 |
或非: | nor ->先按或的操作,然后结果取反 例如:1 ,1–>0 1 ,0–>0 0 ,1–>0 0 ,0–>1 |
同或 | xnor ->相同为1,相异为0 例如:1 ,1–>1 1 ,0–>0 0 ,1–>0 0 ,0–>1 |
异或: | xor ->相异为1,相同为0 例如:1 ,1–>0 1 ,0–>1 0 ,1–>1 0 ,0–>0 |
&,&&:(与,短路与):一样的地方就是二者执行最后的结果是一样的,但是执行的过程有区别,
对于&:无论&左边是否为false,他都会继续检验右边的boolean值。
对于&&:只要检测到左边Boolean值为false时,就会直接判断结果,不会在检验右边的值(因为"与"有一个false最后结果就是false了)
所以&&的执行效率更高,所以一般都是使用&&.
|与||之间也是同样的道理,|:无论左边是否为ture,都会检验右边 ,||:则不会。|| 的执行效率会更高
特别的
n&1 == 1; | 则 n为奇数; |
n&1 == 0; | 则n 为偶数; |
2.访问权限修饰符
private | 定义它的类体中 |
default | (什么也不用加,并不是用 default 修饰 ,是默认)同包中的其他类,或者是在定义它的类体中 |
protected | 非同包的子类也能访问到,同包中的其他类,定义它的类体中 |
public | 公共的 相当于 没有设置 任何访问权限 |
3.java中为final变量赋值的三种方式
转载大佬的 点击即转
储备知识:在类的加载中,类的加载顺序我们应该都知道,静态代码块->构造代码块->构造方法
精华:当类被加载进内存的时候,这个属性只是声明了一个变量,并没有给分配内存空间,
只有当类在被实例化的时候才分配了内存空间,而这个时候又同时执行了构造方法,
所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要实例化,
以后不在改变的条件。
1、在定义时直接赋值
public class Test {
public final String str = "mark";
}
2、声明时不赋值,在构造方法中进行赋值
public class Test {
public final String str;
public Test() {
this.str = "mark";
}
}
3、声明时不赋值,在构造代码块中进行赋值
public class Test {
public final String str;
{
this.str = "mark";
}
}
当你发现一个类的变量被final修饰但没被赋值,那么可以判断出它肯定会在构造函数里被赋值。
(因为倘若是set方法赋值,线程是不安全的,因为set方法可以被调用多次,而final变量只能被赋值一次)
4.被final static修饰的变量
1、在定义时直接赋值
public class Test {
public static final String str = "mark";
}
2、在静态代码块里面进行赋值
public class Test {
public static final String str;
static {
str = "mark";
}
}