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执行余下部分。

原文地址:https://www.cnblogs.com/jason31/p/9770856.html