初学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. PHP的AES加密类

    PHP的AES加密类 aes.php <?php /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  2. Java调用C# DLL

    由于项目需要,利用了短信猫,但是一个短信猫会加载多个串口,而只需要其AT口,通过java代码,获取其AT口对应的串口号比较困难,于是通过C#获取,这里直接调用C#生成的DLL,但java不能直接调用C ...

  3. 怎么配置Jupyter Notebook默认启动目录?

    前言 系统环境:win10 x64:跟环境也没啥关系,在LInux下也一样... 前段时间重换了系统后,发现Jupyter Notebook的默认启动目录不太对呀,所以,就翻到了以前的笔记,还是记在这 ...

  4. Linux用户管理的复习时间

    所谓三天不练手生,你还记得关于Linux用户管理的所有知识吗?现在就来跟我一起复习一下吧! 1.常用配置文件 用户信息文件: /etc/password 密码文件: /etc/shadow 用户组文件 ...

  5. IP协议和网络传输中的封装与分用。

    关于七层模型和四层模型可以参考这个:http://www.cnblogs.com/xcywt/p/5027277.html 因为四层模型用的比较多,这里只拿四层模型来分析. 1.四层模型中的最下层是链 ...

  6. java学习笔记之StringBuilder

    StringBuilder总结 StringBuilder概述: StringBuilder是一个线程不安全的类,他在字符串连接方面性能尤其出色 StringBuilder类的构造方法: 1.空参数构 ...

  7. Cocos2d-X使用CCAnimation创建动画

    动画在游戏中是很常见的 程序1:创建一个简单的动画 首先须要在project文件夹下的Resource文件夹中放一张有各种不同动作的图片 在程序中加入以下的代码 #include "Anim ...

  8. Ubuntu下关闭防火墙

    默认情况下ubuntu无firewall,除非你自己安装了,怎么装的就怎么删呗. . 假设是已启用的自备的iptables 删了即可了 sudo apt-get remove iptables.

  9. 自学Python4.1-文件操作

    文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 关闭文件(非必须) 一.打开文件 open('文件路径', '模式')      打开文件时,需要指定文件路径和以何等方式打开文件,打 ...

  10. 大数据学习(6)MapReduce应用

    倒排索引 /** * * * <pre> *file1.txt: *hello ketty *hello tomcat * *file2.txt: *hello hadoop * *map ...