1. public interface IService {
String NAME=”default”;
}
找出与红色字体等价的一项
public static final String NAME=”default”;
public: 因为接口是必然要被实现的,所以不定义为public,这个属性就没有任何意义。
static: 如果不是static,那么一个类可以实现多个接口就会出现重名的情况。
final: java的开闭原则,因为接口是一个模板,所以应该是修改关闭,对扩展开放。
接口中默认修饰变量属性用:public static final;而默认方法的修饰符是:public abstract
2. 可以使在一个类中定义的成员变量只能被同一包中的类访问
无修饰符
3. 关于短路与(“&&”)以及短路或(“||”)的说明
在短路与中,只要有一个表达式的值为false,则之后的表达式都不会再执行,因为结果已经确定。
在短路或中,只要有一个表达式的值为true,那之后的表达式都不会再执行,因为结果应确定。
4. 关于泛型
(1)创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。
(2)JVM如何理解泛型概念 —— 类型擦除。事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。
总结:泛型代码与JVM
① 虚拟机中没有泛型,只有普通类和方法。
② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)
③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。
泛型的类型擦除机制意味着不能在运行时动态获取List<T>中T的实际类型
这句话错误的原因在于可以通过反射机制实现动态获取。
5. 关于volatile关键字
volatile是java中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。
我们都知道jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。
volatile的两个特点: 1.保证读取的可见性 2.禁止指令重排。用于限定变量只能从内存中读取,保证对所有线程而言,值都是一致的。但是不能说volatile能保证线程安全。
6. 多线程中的同步操作
之所以选择同步操作,是为了防止线程在对一个数据进行处理时,其他线程对该数据进行访问读取。所以将读取和修改设置为一个原子性操作,在一个线程对一个数据进行修改时其他线程无法读取该数据。