初学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_导论的更多相关文章

  1. thinkinginjava学习笔记06_复用类

    MarsEdit粘代码好麻烦,所有代码交给github:https://github.com/lozybean/MyJavaLearning 复用一个类常用的两种方式:组合.继承: 组合 将对象引用置 ...

  2. thinkinginjava学习笔记07_多态

    在上一节的学习中,强调继承一般在需要向上转型时才有必要上场,否则都应该谨慎使用: 向上转型和绑定 向上转型是指子类向基类转型,由于子类拥有基类中的所有接口,所以向上转型的过程是安全无损的,所有对基类进 ...

  3. thinkinginjava学习笔记04_初始化与清理

    java沿用了c++的构造器,使用一个和类名完全一样的方法作为类的构造器,可以有多个构造器来通过不同的参数进行构造,称为重载:不仅是构造器可以重载,其他方法也一样通过不同的形参以及不同的返回值来实现重 ...

  4. MySQL学习笔记01_数据库基础知识

    01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...

  5. thinkinginjava学习笔记10_容器

    Java中并没有像Perl.Python.Ruby那样对容器有直接的支持,但是可以依靠容器类来完成相同的工作: 泛型 使用一个ArrayList对象可以保存一系列的对象,如: ArrayList ap ...

  6. thinkinginjava学习笔记09_内部类

    定义与创建 将一个类定义放在另一个类.方法.作用域.匿名类等地方,就是内部类:内部类只能由外部类对象创建(通过外部方法或者.new方法),内部类对象创建时必须已经有一个外部类对象,并且与之连接(在内部 ...

  7. thinkinginjava学习笔记08_接口

    抽象类和抽象方法 抽象方法是指没有具体实现的方法,仅仅有方法的声明和没有方法体:使用abstract关键字定义一个抽象方法:包含抽象方法的类成为抽象类,如果一个类中包含抽象方法则必须使用abstrac ...

  8. thinkinginjava学习笔记05_访问权限

    Java中访问权限等级从大到小依次为:public.protected.包访问权限(没有关键词).private: 以包访问权限为界限,public.protected分别可以被任意对象和继承的对象访 ...

  9. thinkinginjava学习笔记03_基本语法

    由于java是c系语言,基本保留c语言的所有基本操作,就快速过一下: java中的基本操作符仅仅对基本类型有效:=.==.!=对所有对象有效(值传递),String类支持+.+=; 在对基本数据进行算 ...

随机推荐

  1. 详解spl_autoload_register()函数

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php    <?php    class  ...

  2. python通过webservice接口实现配置下发

    项目上要开发一个小工具,通过webservice接口实现配置下发,考虑到python的第三方库对soap的良好支持,果断决定用python来完成这一使命. Python的支持webservice的第三 ...

  3. Foxmail 7.0破解版,拷贝到新机器后,发送邮件乱码问题

    申请了新机器,挺开心,键盘和鼠标也好用了,但是新机器也随之而来一些不便,以前存储的数据需要重新拷贝.还有一些邮件,有些邮件标记了*号. Foxmail7.0绿色版本还挺好用,直接拷贝到新机器上就能直接 ...

  4. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我又有一 个耗时任务需要执行,我们不得不重新创建线 ...

  5. 自己动手写http服务器——主程序(三)

    功能:目前只支持对资源的访问. 使用的模型:多线程加epoll,与传统的一个连接请求一个线程处理不同的是,这个模型只为那些需要服务的连接请求调用线程进行处理, 整个模型的大致流程 创建一个线程持对象, ...

  6. 三十天学不会TCP,UDP/IP网络编程-ARP -- 连接MAC和IP

    继续来做(da)推(guang)介(gao)我自己的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,目前已完成 ...

  7. 某pdf转word v6.3.0.2算法分析

    某pdf转word v6.3.0.2算法分析 [文章标题]某pdf转word v6.3.0.2算法分析 [文章作者]jieliuhouzi[原版下载]www.pdfcword.cn [保护方式]序列号 ...

  8. lua游戏开发实践指南学习笔记1

    本文是依据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1.  语言定义: 在lua语言中,标识符有非常大的灵活性(变量和函数名),只是用户不呢个以数字作为起始符 ...

  9. mac os x 触摸板点击无效

    macbook默认轻击触摸板无效,这样是为了防止误点击.可是习惯了windows笔记本的我对这一设置非常不习惯. 能够在"system preference"的"Trac ...

  10. mybatis关联

    title: mybatis关联 date: 2017-12-18 18:00:30 tags: - [mybatis] categories: - [编程] - [开发工具] permalink: ...