重载:同一个类,同一个方法名,不同的参数列表(参数的个数,类型和顺序不同);构造器可以重载;方法的重载与返回值类型和形参变量名无关,建议返回值类型最好相同。 重写:子类重写覆盖从父类继承下来的方法。要求方法名相同、参数列表相同以及返回值类型相同,从 jdk 1.5 开始支持返回子类类型(如果是泛型,父类泛型擦除后与子类相同就可以);方法的访问权限不能变小;子类方法不能抛出比父类更大的异常;两个方法要同为 static 或同为非 static。
Integer[]
到 Object[]
是小引用类型数组到大引用类型数组的转换,可以自动转换。
Integer[]
到 int[]
是引用数据类型数组到基本数据类型数组的转换,直接强转会报错,需要遍历数组一个个地转换。
不管是否有异常产生,finally 块中代码都会执行。
当 try 和 catch 中有 return 语句时,finally 块的代码仍然会执行。
如果 finally 中没有 return 时,而且 return 在 finally 的前面,那么无论 finally 中的代码怎么样,返回的值都不会改变,仍然是之前 return 语句中保存的值。
如果 finally 中有 return 时,try 和 catch 的 return 就会失效。
新建状态(New):当线程对象被创建后,即进入了新建状态,如:Thread t = new MyThread()
。
就绪状态(Runnable):当调用线程对象的 start() 方法 t.start(),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待 CPU调度执行,并不是说执行了 t.start() 此线程立即就会执行。
运行状态(Running):当 CPU 开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中。
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对 CPU 的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被 CPU 调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
死亡状态(Dead):线程执行完了或者因异常退出了 run() 方法,该线程结束生命周期。
1、Callable 接口的 call() 方法可以有返回值(通过 Future 接口的 get() 方法,不过此方法是阻塞性的),而 Runnable 接口的 run() 方法没有返回值。
2、Callable 接口的 call() 方法可以声明抛出异常,而 Runnable 接口的 run() 方法不可以声明抛出异常(run 方法出现异常时会直接抛出,打印出堆栈信息,不过可以通过自定义 ThreadFactory 的方法来捕捉异常)。
语言层次的安全性主要体现在:
底层的安全性:Java 在字节码的传输过程中使用了公开密钥加密机制 (public-key cryptography)。
在运行环境提供了四级安全性保障机制:字节码校验器,类装载器,运行时内存布局,文件访问限制。
newFixedThreadPool(int nThreads)
创建一个固定长度的线程池;每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化;当其中某个线程发生未预期的错误而结束时,线程池会补充一个新的线程。newCachedThreadPool()
创建一个可缓存的线程池;如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程;线程池的规模不存在任何限制。newSingleThreadExecutor()
这是一个单线程的 Executor;它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。newScheduledThreadPool(int corePoolSize)
创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于 Timer。原始构成
使用方法
等待是否可以中断
tryLock(long timeout, TimeUnit unit)
,另一种是 lockInterruptibly() 放代码块中,调用 interrupt() 方法进行中断。加锁是否公平
锁绑定多个 Condition
两个或一个。”xyz” 对应一个对象,这个对象放在字符串常量池,常量 ”xyz” 不管出现多少遍,都是字符串常量池的那一个;而 new String 每写一遍,就创建一个新的对象,它使用常量 ”xyz” 来创建出一个新 String 对象。如果之前已经创建了一个 ”xyz”,那么就直接从字符串常量池拿,这时只创建了一个 StringObject;但如果之前没有创建过 "xyz",那么就会创建一个 "xyz" 常量对象并放入字符串常量池,然后 new String 再新建一个对象指向 "xyz",这种情况下创建两个对象。
至于 String 类是否继承,答案是否定的,因为 String 类的用了 final 修饰,所以是不可继承的。