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类支持+.+=; 在对基本数据进行算 ...
随机推荐
- CCF-201403-2-窗口
问题描述 试题编号: 201403-2 试题名称: 窗口 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平 ...
- BP算法从原理到python实现
BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自 ...
- pymysql实现MySQL与Python交互
常见MySQL操作 所需模块: pip3 install pymysql 查询(fetchone,fetchmany,fetchall): import pymysql #连接 con = pymys ...
- post 与get 区别
刷新/后退按钮 GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交). 书签 GET书签可收藏,POST为书签不可收藏. 缓存 GET能被缓存 缓存是针对URL来进 ...
- Spark之搜狗日志查询实战
1.下载搜狗日志文件: 地址:http://www.sogou.com/labs/resource/chkreg.php 2.利用WinSCP等工具将文件上传至集群. 3.创建文件夹,存放数据: mk ...
- Qt---自定义界面之 Style Sheet
这次讲Qt Style Sheet(QSS),QSS是一种与CSS类似的语言,实际上这两者几乎完全一样.既然谈到CSS我们就有必要说一下盒模型. 1. 盒模型(The Box Model) 在样式中, ...
- MyBatis_关联关系查询
一.关联查询 当查询的内容涉及到具有关联关系的多个表时,就需要使用关联查询.根据表与表间的关联关系的不同.关联查询分为四种: 一对一关联查询: 一对多关联查询: 多对一关联查询: 多对多关联查询: 二 ...
- springboot整合redis
springboot-整合redis springboot学习笔记-4 整合Druid数据源和使用@Cache简化redis配置 一.整合Druid数据源 Druid是一个关系型数据库连接池,是阿 ...
- 微信小程序教学第三章(含视频):小程序中级实战教程:列表-页面逻辑处理
§ 页面逻辑处理 本文配套视频地址: https://v.qq.com/x/page/n0554dndrez.html 开始前请把 ch3-2 分支中的 code/ 目录导入微信开发工具 修改 ind ...
- ES6之Class
ES6中的Class和JS的比起来无疑是让对象原型的写法更加清晰,更像面向对象编程的语法而已,注意一个问题ES6里面的Class的内部定义的所有方法都是不可枚举的,而且在ES6中Class不存在变量提 ...