线程
1.【使用层级】
volatile仅能使用在变量级别;
synchronized则可以使用在变量、方法、和类级别的
2.【可见性与原子性】
volatile仅能实现变量的修改可见性,并不能保证原子性;
synchronized则可以保证变量的修改可见性和原子性
(因为synchronized有锁机制!)
3.【阻塞】
volatile不会造成线程的阻塞;
synchronized可能会造成线程的阻塞。
(还是因为synchronized有锁机制!)
4.【优化】
volatile标记的变量不会被编译器优化;
但是volatile可以禁止重排序;
synchronized标记的变量可以被编译器优化
^^^^^^^^^^^^^^^^^^^^
^^其他参考文章
^^《Java多线程编程-(13)-从volatile和synchronized的底层实现原理看Java虚拟机对锁优化所做的努力》
^^《既然synchronized是"万能"的,为什么还需要volatile呢?》
^^Android(Java) | 如何使程序实现线程安全(拓展关键词:ThreadLocal、重排序、volatile/final)**
IO
权限
- main 方法是 Java Application 程序执行的入口点,以下描述哪项是合法的()。

继承、重载
- C++可以多重继承,但是Java中对于类而言,只有单继承,接口可以多继承。
- Java不能重载运算符,C++可以。

接口与抽象类的区别
**1 .【实现】
抽象类要被子类继承,接口要被类实现;
2 .【方法】
接口只能做方法声明,
声明的方法默认为公共抽象的;
抽象类中可以作方法声明,
也可以做具体的方法实现。
3 .【变量】
接口里定义的变量只能是公共的静态的不可变常量,
抽象类中的变量还可以是普通变量。
【同:两者都能有静态抽象内部类!!!】
【不过接口可以通过定义静态抽象内部类,
从而间接取用抽象类的所有特性,如实现具体的方法等;
demo 如AIDL生成的接口中的 Stub类】
4 .抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
5 .接口是设计的结果,抽象类是重构的结果。
6 .抽象类主要用来抽象类别【抽象属性+行为】,
接口主要用来抽象功能【抽象行为】。**
题目

**A.vector是线程安全的ArrayList,在内存中占用连续的空间。
初始时有一个初始大小,
当数据条数大于这个初始大小后会重写分配一个更大的连续空间。
如果Vector定义为保存Object则可以存放任意类型,
无需事先知道!!!
B.选项说的情况就是我们自定义异常的情况,
我们可以用违例(Exception)来抛出一些并非错误的消息,
可以,并非错误的消息。
比如我自定义一个异常,若一个变量大于10就抛出一个异常,
这样就对应了B选项说的情况,
我用抛出异常说明这个变量大于10,
而不是用一个函数体(函数体内判断是否大于10,然后返回true或false)判断,
因为函数调用是入栈出栈,栈是在寄存器之下的速度最快,且占的空间少,
而自定义异常是存在堆中,肯定异常的内存开销大!
C选项是错误的,因为接口中不能声明变量,只有常量!
接口中只有常量定义,没有变量声明。
接口中方法默认是abstract public,
所以在接口只写函数声明是符合语法规则。
但是变量默认是用public final static 修饰的,
意思它是静态常量,不是变量!
另外,
常量不管在接口中还是类中必须在声明时初始化。
D.子类可以访问父类受保护的成员
访问修饰符 访问范围 继承性
private 本类内部 不可继承 私有的
(default) 本类+同包 同包子类可以继承 默认的
protected 本类+同包+子类 可以继承 受保护的
public 公开 可以继承 公开的**
参考
- 慕课网
- 极客时间
