java/android 做题中整理的碎片小贴士(19)
1、实例化泛型对象时记得要指出类型变量的具体类型。JVM理解泛型的逻辑是类型擦除,JVM虚拟机本身不知道也不能理解泛型,所有泛型在编译阶段都会被处理成普通类和方法。
2、bootstrap classloader 引导类加载器,加载java核心类;
extension classloader 扩展类加载器,加载JRE的扩展目录中的jar包;
system classloader 系统类加载器,在JVM启动时加载来自java命令中-classpath或java.class.path 系统属性,或CLASSPATH*作为系统属性所指定的jar包、类路径。
3、System是java.lang中的一个类,out是System中的一个成员变量,它是一个java.io.PrintSystem类的对象,println()是一个方法。
4、final 定义的变量,可以不在定义时初始化,也可以在构造方法中初始化,但使用前需是要初始化了的。
5、static方法不能被子类重写,子类如果写了同名方法只能将父类的隐藏。Father f = new son()这种生明父类实例化为子类的方式,调用的静态方法、静态非静态域,都还是父类的。所以多态仅体现在非静态方法上吧。
6、接口可以用abstract修饰(虽然接口本身是抽象的),但不能用final(用了之后内部的方法无法再重写)。
7、volatile修饰的变量不会造成阻塞,不可用作多线程环境下的计数器。
8、子类能继承父类的所有成员,不能调用private以及声明父类实例化为子类的是另一码事。
9、
public class NameList { private List names = new ArrayList(); public synchronized void add(String name) { names.add(name); } public synchronized void printAll() { for (int i = 0; i < names.size(); i++) { System.out.print(names.get(i) + ””); } } public static void main(String[]args) { final NameList sl = new NameList(); for (int i = 0; i < 2; i++) { new Thread() { public void run() { sl.add(“A”); sl.add(“B”); sl.add(“C”); sl.printAll(); } } .start(); } } }
①"ABCABCABC"、②"ABCAABCABC"这些输出都是可能的。
因为在一个线程内是顺序执行,字母是按abc的顺序输出。①是线程1完全执行完毕之后到线程2执行;②是线程1把字母存好了,最后一句没执行,然后线程2把'A'放进去了,又给线程1执行打印,至此执行完毕,交给线程2执行余下部分。