Posts

Showing posts from April, 2018

接口

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法,本文主要讲解接口,内部类的内容将在下篇博文中进行说明 抽象类 包含抽象方法的类必须定义为抽象类,但抽象类不一定有抽象方法,不能产生抽象类的对象 使用abtract关键字声明抽象类和抽象方法 若我们希望阻止某个类产生任何对象,也可以把它声明成一个抽象类 接口 如何实现 使用interface关键字代替class关键字来产生一个完全抽象的类(是接口而不是抽象类) 特征 #访问权限 可以拥有public,或者默认的包访问这两种可视性 #域: 这些域隐式地是public,static和final的 域不能为空,但是可以被非常量表达式初始化 e.g. public interface RandVals{     Random RAND = new Random();     int RANDOM_INT = RAND.nextInt(10);     long RANDOM_LONG = RAND.nextLong()*10;     ... } //这些域不是接口的一部分,它们的值被储存在该接口的静态储存区域内 #方法声明: 访问权限: 方法声明隐式地是public的 当实现一个接口时,在接口被定义的方法必须显式地定义为public的 返回值类型: 返回类型可以是原类型也可以是协变类型 参数类型: 参数类型不可变,参数名可变 可在方法体中用强制类型转换将接收到的参数转换成更合理的类型 #实现一个接口 在类名后使用implements关键字 #用途 允许实现接口的类向上转型为接口,由于一个类可以实现多个接口,这变相的使一个类可以向上转型为多种基类型(包括接口,这带来了极大的灵活性),实现某种类似多重继承的变种(Java不允许直接实现多重继承详见 谈谈我对复用类的理解 )                      另一个用途是防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口 完全解耦 在了解完全解耦之前,先考虑这样一个问题:为什么Java为什么是单根继承结构? 单根继承结

讲讲并发

有一阵子没有更新博文了,这段时间接触的知识比较杂,内容不足以写成一篇像样的文章,不过只是因为这样的原因而迟迟不更新的话太不像样了,所以我决定以对目前所学知识的理解写一篇大概的框架,随着理解的深入再不断补充 并发的一些概念 首先我们需要理清一些概念问题: 线程与进程的区别    1、一个进程同时执行多个任务,通常,每一个任务相当于一个线程    2、每个进程拥有自己的一整套变量,而线程则共享数据(共享数据是不安全的,这就需要同步机制解决这个问题) 并行和并发区别    1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;    2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)  同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率 单台拥有多个CPU的计算机往往给人一种进程与CPU一一对应的错觉,事实上并发执行的进程数目并不是由CPU数目制约的,操作系统将CPU的时间片分配给每一个进程,给人以并行处理的感觉(在进程数目小于处理器数目时的确是并行处理的) 多线程的作用 在我们的程序中或多或少会出现一些耗时的任务, 在传统的单线程程序中(只有主线程)我们不得不等待这些恼人的任务结束后才能继续执行其他操作,也就是说在此期间我们无法与程序进行交互,这无疑是致命的。 举个栗子,现在需要我们设计一个音乐播放器, 有播放和取消两个按钮, 想象在不使用多线程的情况下执行这个程序会发生什么, 正如预料的那样,当我们点击播放按钮后这个程序的确是在播放音乐,但在此同时我们丧失了对这个程序的控制权,在音乐播放的这段时间内我们无法对这个程序进行操作 我们可以通过运行一个线程中的关键代码来保持用户对程序的控制权从而解决这个问题 创建一个线程 有两个方法可以定义一个线程 #方法一    1、 实现Runnable接口          class xxx implements Runnable {          @Override          public void run() {                   }