thinkinginjava学习笔记01_导论
初学java,希望旅途愉快 :)
类型决定对象的接口,(有人认为类是类型的特定实现),接口确定对象所能发出的请求(消息),满足请求的代码和隐藏的数据一起构成实现;
对象设计时,应该很好地完成一项任务,并且不试图做更多的事情;
继承实现多态,导出类将包括基类的所有成员以及接口,因此,导出类与基类具有相同类型;
一个完善的基类应该包括所有子类都通用的接口,由导出类设计基类的具体接口实现,并将对象所属的类型当成基类处理(导出类和基类具有相同类型,第二次强调),通过导出新的子类型来扩展封装;
动态绑定:程序直到运行时才决定方法的具体地址,编译器确保调用方法存在并且检查其类型,但并不知道具体代码,java中,动态绑定是默认行为,并不需要virtual方法;
一个形象的例子:
void doSomething(Shape shape){
shape.erase();
//…
shape.draw();
}
Circle circle = new Circle();
Triangle triangle = new Triangle();
Line line = new Line();
doSomething(circle);
doSomething(triangle);
doSomething(line);
其中Circle、Triangle、Line是Shape的导出类,doSomething在实现时,对基类的接口进行实现,而并不需要知道具体的导出类型,在调用该方法时,由于Circle和Shape具有相同类型,Circle中实现了Shape的接口,所以doSomething可以正确执行:shape.erase();shape.draw();并且不需要直到Circle实现接口的细节过程。编译器将检查返回值和参数类型,但是并不决定接口实现的代码所在位置,只有在运行时,接口代码地址才被确定。
java具有单根继承结构,所有的对象最终都继承于一个单一的基类:Object,这点和其他oop语言一致,除了c++(或许还有其他吧);
只有在执行时才能确定需要的内存空间,通过创建可以自动扩展自身的容器(类型),并将对象置于容器中,并且使用容器处理分配等细节;不同的容器提供不同类型的接口和外部行为,选择不同的容器决定解决方案的灵活程度;不同的容器对某些操作具有不同效率,通过封装接口,可以在容器之间进行快速转换而不会对代码造成大的影响,例如:List接口的两种容器:ArrayList和LinkedList具有相同接口不同的效率,并且可以在两者之间灵活转换(类比上面的例子);
由于单根继承的特点,存储Object的容器可以存储任何其他对象,这使得容器容易被复用,然而由于容器存储Object,当对象置入容器时,需要向上转型为Object,这个转型是安全的,但是会丢失部分接口,当对象从容器中取出时,需要向下转型,这个转型可能是危险的,容器需要以某种方式记录对象的类型;
由于向下转型检查需要额外的时间,通过参数化类型,定制只接纳和取出某种类型的容器,即范型,范型通过一对尖括号来指定,如存储Shape的ArrayList范型: ArrayList<Shape> 。
Java采用动态内存分配方式,对象存在堆空间中(heap),通过new关键字创建对象实例(并返回地址引用),这样的方式相对C++等将对象置于堆栈(stack)中,需要更多的查询和释放开销,但是相对C++必须知道对象的具体生命周期并且保证不出错的情况要更加灵活,而动态方式也是基于对象趋于复杂,查询和释放存储空间的开销变得次要的假设前提下。
Java通过垃圾回收机制销毁对象,对象本省并不需要知道生命周期,该工作由垃圾回收机制完成,在对象不再被使用的时候自动释放该对象(引用计数机制?)
Java内置异常处理,并且强制使用,保证实现更加健壮的代码(也是我学习java的最大动机,除了异常处理,还有单元测试);
并发编程,除了解决计算速度的问题之外,还能代替中断实现相应功能(一句话点通,每个型号的CPU含有的中断操作都不一样,实现中断需要更加复杂的硬件调度,通过多线程可以代替中断实现功能);线程只是程序逻辑,指在单一处理器分配执行时间的手段,而当操作系统支持多处理器的时候,自动将线程分配给不同的处理器;通过线程与锁模型,解决多线程的资源同步问题。
Web编程:信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获得并处理信息,然后将他们显示在客户机上;当同时为多个客户服务时,需要保证每个客户操作数据不会对其他客户产生影响(SQL中的事务处理),当并发量比较大时,往往将计算负载分散给客户端处理,或者使用中间件将负载分散给服务器端的其他机器;
另外,通过客户端编程(Native app)来负担更多的处理负载,但同时会对客户端造成计算要求(需要平衡服务器和客户端的运算),B/S模型上,几乎所有的计算任务都由服务器完成(可以通过简单的js脚本在浏览器完成简单任务),而开发浏览器插件则能够让浏览器完成更多的功能,插件引发了脚本语言的开发(如:javascript),通过在页面中嵌入脚本来执行简单任务,而不需要安装特定插件,该做法的缺点是会暴露给任何人去浏览,所以一般不用脚本实现复杂功能;除了浏览器插件,实现复杂功能就需要跨平台的变成语言实现客户端程序,如:Java;Java通过applet以及使用Java Web Start进行客户端编程,applet作为网页的一部分自动下载,并在激活时执行程序,由于是通过网页自动下载,客户端不必在程序有所修改时重新编译安装,而只需要浏览器支持java解释即可;
thinkinginjava学习笔记01_导论的更多相关文章
- thinkinginjava学习笔记06_复用类
MarsEdit粘代码好麻烦,所有代码交给github:https://github.com/lozybean/MyJavaLearning 复用一个类常用的两种方式:组合.继承: 组合 将对象引用置 ...
- thinkinginjava学习笔记07_多态
在上一节的学习中,强调继承一般在需要向上转型时才有必要上场,否则都应该谨慎使用: 向上转型和绑定 向上转型是指子类向基类转型,由于子类拥有基类中的所有接口,所以向上转型的过程是安全无损的,所有对基类进 ...
- thinkinginjava学习笔记04_初始化与清理
java沿用了c++的构造器,使用一个和类名完全一样的方法作为类的构造器,可以有多个构造器来通过不同的参数进行构造,称为重载:不仅是构造器可以重载,其他方法也一样通过不同的形参以及不同的返回值来实现重 ...
- MySQL学习笔记01_数据库基础知识
01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...
- thinkinginjava学习笔记10_容器
Java中并没有像Perl.Python.Ruby那样对容器有直接的支持,但是可以依靠容器类来完成相同的工作: 泛型 使用一个ArrayList对象可以保存一系列的对象,如: ArrayList ap ...
- thinkinginjava学习笔记09_内部类
定义与创建 将一个类定义放在另一个类.方法.作用域.匿名类等地方,就是内部类:内部类只能由外部类对象创建(通过外部方法或者.new方法),内部类对象创建时必须已经有一个外部类对象,并且与之连接(在内部 ...
- thinkinginjava学习笔记08_接口
抽象类和抽象方法 抽象方法是指没有具体实现的方法,仅仅有方法的声明和没有方法体:使用abstract关键字定义一个抽象方法:包含抽象方法的类成为抽象类,如果一个类中包含抽象方法则必须使用abstrac ...
- thinkinginjava学习笔记05_访问权限
Java中访问权限等级从大到小依次为:public.protected.包访问权限(没有关键词).private: 以包访问权限为界限,public.protected分别可以被任意对象和继承的对象访 ...
- thinkinginjava学习笔记03_基本语法
由于java是c系语言,基本保留c语言的所有基本操作,就快速过一下: java中的基本操作符仅仅对基本类型有效:=.==.!=对所有对象有效(值传递),String类支持+.+=; 在对基本数据进行算 ...
随机推荐
- Postgres是如何管理空值的
创建表test,y字段插入null. test=# create table test(x bigint,y bigint,z text); CREATE TABLE test=# insert in ...
- Loadrunner 中socket协议RecvBuffer接收到数据长度为空
socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...
- java类中获取ServletContext的方法
起因是我想要获取一个相对路径,需要用到servletContext的getRealPath()方法,于是上网搜索,找到两种方法来获取ServletContext. 方法1:第一种方法是这样的: Ser ...
- 聊聊属性方法property的用法
写之前随便百度了一下博客,又看到廖雪峰的博客了.果然置顶的能力很强. 我想说其实property的用法并不是主要用来做类型检查.反而更多应该是用于简化操作的目的. 写之前想聊一个古老的话题.年初的时候 ...
- 此地址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求。
火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法 关于火狐浏览器访问本机IIS部署的网站弹出"此 ...
- docker commit使用
我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像 docker自己提供的有commit功能 我们以centos为例,现在我们要在一个裸的centos上面安装v ...
- 多命令顺序执行,dd命令,管道|,grep,通配符,其他特殊符号
多命令顺序执行:命令1;命令2 命令之间没有逻辑关系 命令1&&命令2 命令1执行正确才执行命令2,命令1执行错误不会执行命令2 命令1||命令2 命令执行错误才执行命令2,命令1执行 ...
- 【JMeter】获取json响应报文中数组长度
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Predicate; import net.minidev.json.J ...
- 云储存第三方--阿里云OSS VS 又拍云USS
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- iOS 模拟器安装应用
iOS模拟器是苹果Xcode IDE的一部分,主要用来为Mac,iPhone和iPad创建应用程序,为了给iOS模拟器打包应用程序,利用–package 在命令行上执行ADT并使用–target来指定 ...