JAVA笔记(新)

更新时间:2023-09-21 18:43:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章

Smalltalk 的五大基本特征

Alan Kay 总结了Smalltalk 的五大基本特征。这是第一种成功的面向对象程序设计语言,也是Java 的基础语言。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的:

(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。

(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。

(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。

(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。

(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP 最重要的概念之一。

有人强调“类型”决定了接口,而“类”是那个接口的一种特殊实现方式。

接口

每一个对象都需要接受和“发送”信息,“接口”(Interface)规定了可对一个特定的对象发出哪些请求。

接口是为了——实现方案的隐藏。 好处:

1、防止程序员接触不该接触的东西(不需要接触)

2、使得库的设计人员可以在不影响程序员的情况下修改内部结构。

如同公共汽车一样。我们不知道他的行驶路线,我们只知道他可以到达我们要去的目的地。即使路线修改了,我们仍然不用担心,因为我们知道,她可以到达我们要去的地方,而路线或许不同了。

封装

java的3个显示关键字和1个默认关键字 public (公共的)所有人都可以用 private (私有的)只有自己可以用

protected (受保护的)自己和自己的子女可以用 默认的

friendly (友好的)没有显示说明时,默认的。在同一个Package下可以用。(包装访问)

组织与继承

组织比继承更清晰简单灵活。组织就是类之间的相互包含。

继承是创建一个新类,它拥有extends(关键字)父类的部分成员(除private和构造函数)。这个新类与父类有相同的类型,尽管具体的成员不同(子类扩展)。

多态性(Polymorphism)

我们来看这个函数

void doStuff(Shape s) { s.erase(); // ... s.draw();}

这个函数可与任何“几何形状”(Shape)通信,所以完全独立于它要描绘(draw)和删除(erase)的任何特定类型的对象。如果我们在其他一些程序里使用doStuff()函数: Shape c = new Circle(); Shape t = new Triangle(); Shape l = new Line(); doStuff(c); doStuff(t); doStuff(l);

凡是doStuff()能发给一个Shape的消息,Circle也能接收。因为他们是同一类型。Circle 继承了Shape。编译器在编译的时候并不知道自己要操作的准确类,是Circle还是Triangle, 在执行的时候才由编译器和系统负责对细节控制,使之得到我们期望的结果。这就是多态性。 (C++中用Virtual)这种方法称为“动态绑定”。

抽象类

当一个类只希望为自己的衍生类提供接口时,可用abstract。抽象方法也可以用关键字abstract描述。继承抽象类的方法如果不实现其中的抽象方法,那么它也会变成抽象类。抽象类不能被实例化。

interface 关键字延伸了抽象类的概念。完全禁止所有函数的定义。 对象的创建和存在时间

对象的回收

对于静态的对象无需考虑,编译器已经做好了。动态的可以手动释放,如C++ 也可以利用

GC

有JRE所提供的 “垃圾收集器”将为你完成。Delphi中默认没有垃圾收集器,但可以安装。 java中可以强迫垃圾回收,如:System.gc() ,Runtime.gc(),当然还有finalize()方法,使用System.runFinalization

集合于继承器(迭代器)

集合也称为“容器”。他提供读写操作。如“推”(Push),“添加”(Add)等相似操作。对集合可以用继承器(Iterator)来操作他们。例: Iterator iter = c.iterator(); while(iter.hasNext()) {

Object obj = iter.next(); do Something with obj; }

“容器”的种类:为适应不同的需要。 如:集、队列、散列表、树、堆栈等。例如:Vector和List的区别。他们拥有一致的接口和外部行为。然而相同的操作对他们却有不同开销。Vector的随机访问是等时的。而List则要付出更多的不同开销,远一点的对象可能要长的时间。

我们所要记住的是集合是一个用来置放对象的储藏所,我们关心的是他是否能满足我们的需要,而无需关心她的内部结构设计。

单根结构

所有的类都继承一个终极基础类:Object 单根结构的优点:

1、单根结构中的所有对象都有一个通用的接口,他们最终都属于相同类型。 2、实现类似C++中的模版功能。

3、单根结构中的所有对象都可以保证拥有一些特定的功能。一个单根结构,加上所有对象都在内存堆中创建,大大简化了参数传递。方便实现垃圾收集器。

第二章

用引用操纵对象

操纵对象的标示符实际是指向对象的“句柄”(Handle)。电视(对象)与遥控器(句柄)的关系。

创建一个句柄,如String s;

指向一个对象 (初始化)S = \创建一个对象并用一个句柄操作

String s = new String(\所有对象都必须创建。

有六个地方都可以保存数据:

(1)寄存器:由编译器分配

这是速度最快的地方,数据位于和其他所有方式都不同的一个地方:处理器的内部.不过,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何迹象.

(2)堆栈:保存对象的句柄,而不是对象本身

堆栈位于常规RAM(随机访问存储器)内,但可通过它的“堆栈指针”获得处理的直接支持.这是一种特别快.特别有效的数据保存方式,仅次于寄存器.创建程序时, java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”.这是由于它必须生成相应的代码,以便向上 与向下移动指针.这一限制无疑影响了程序的灵活性,所以尽管有些java数据要保存在堆栈里——特别是对象句柄,但java 对象并不放到其中.

(3)堆: 使用“new”关键字。保存对象,可以事先不知道此对象的信息

一种常规用途的内存池(也在ram区域)其中保存java对象.与堆栈不同,“内存堆”或“堆”(heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储 空间,也不必知道存储的数据要在堆里停留多长的时间.因此,用堆保存数据时会得到更大的灵活性.要求创建一个对象时, 只需用new命令编制相关的代码即可.执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会 付出一定的代价:在堆里分配存储空间时会花掉更长的时间

(4)静态存储: 这儿的“静态”(static)是指“位于固定位置”(尽管也在ram里)程序运行期间,静态存储的数据将随时等候调用.可用static关键字指出一个对象的特定元素是静态的.java对象本身永远 都不会置入静态存储空间.

(5)常数存储

常数值通常直接置于程序代码内部.这样做是安全的,因为它们永远都不会改变.有的常数需要严格地保护, 所以可考虑将它们置入只读存储器(rom).

(6)非ram存储

若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外.其中两个最主要的例子便是“流式对 象”与“固定对象”.对于流式对象,对象会变成字节流,通常会发给另一台机器.而对于固定对象,对象保存在磁盘中.即使程序中止运行,它们仍可保持自己的状态不变.对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中.

使用栈比堆快,因为栈是存放句柄的,只需要创建固定长度,所以比较快。而堆是任意长度,所以慢。

特殊类型,主要类型

主类型 大小 最小值 最大值 封装器类型 默认值 boolean Boolean false char 16-bit Unicode-0 Unicode216-1 Character null byte 8-bit -128 +127 Byte (byte)0 short 16-bit -2^15 +2^15-1 Short (short)0 int 32-bit -2^31 +2^31-1 Integer 0 long 64-bit -2^63 +2^63-1 Long 0L float 32-bit IEEE754 IEEE754 Float 0.0f double 64-bit IEEE754 IEEE754 Double 0.0d void Void 主类型保存在堆栈中,封装器类型则保存在堆中

高精度数字

BigInteger 和 BigDecimal(封装器类型) BigInteger支持任意精度的整数

BigDecimal支持任意精度的定点数字(币值)

数组:

java编译时系统会自动进行检查。以小的开销换取安全性(数组越界问题)

作用域

{

大括号内 }

创建新的数据类型:类

Class ATyepName { } 创建这种类型的对象:

ATyepName a = new AtyepName();

方法的基本组成部分:

名字、参数、返回值和方法体。

本文来源:https://www.bwwdw.com/article/up3h.html

Top