Java笔记.docx

上传人:b****8 文档编号:10949549 上传时间:2023-02-23 格式:DOCX 页数:11 大小:45.90KB
下载 相关 举报
Java笔记.docx_第1页
第1页 / 共11页
Java笔记.docx_第2页
第2页 / 共11页
Java笔记.docx_第3页
第3页 / 共11页
Java笔记.docx_第4页
第4页 / 共11页
Java笔记.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Java笔记.docx

《Java笔记.docx》由会员分享,可在线阅读,更多相关《Java笔记.docx(11页珍藏版)》请在冰豆网上搜索。

Java笔记.docx

Java笔记

类的首字母大写。

方法,数据成员(成员变量),对象的句柄首字母小写。

package:

包名全部小写

面向对象的五个基本特征:

1.万物皆对象。

将对象想成一种特殊的变量;存储数据,有动作。

可以把所有待解决的问题中的概念性组件(狗,建筑,服务等)都表示成程序里的对象。

2.程序就是一组“互相之间传递消息,告诉对方该干些什么”的对象。

3.每个对象都可以利用别的对象来组建它自己的记忆。

由此,可以将程序的复杂性,隐藏在对象的简单性之下。

继承的概念。

4.对象都有类型,类(class)的概念就是类型(type)。

区分类的最突出的特点就是:

你能给它传递什么信息。

5.所有属于同一个类型的对象都能接收到同样的消息。

这是个定义而非特点。

对象的简洁定义:

对象

1)状态:

有内部数据(产生状态)

2)行为:

有方法(因而产生了行为)

3)标识:

每个对象能同其它对象区分开——每个对象在内存里有唯一的地址。

对象,虽然都是独一无二的,但同时也是某种“拥有相同特征和行为的对象”的类的一员。

这个概念直接以class为关键字,而class也为程序引入了一种新的类型。

simula:

simulationlanguage模拟语言。

类的概念:

由于类描述的是一组具有相同特征(数据元素)和行为(功能)的对象,所以类实际上是一种数据结构:

就浮点数来说,它也有自己的行为和特征。

类和数据类型的区别在于:

类是程序员为解决特定问题而定做的,而数据类型是为了表示机器的存储单元而设计的。

一旦创建了类,你就能创建任意多的那个类的对象,然后把他们当做待解决的问题中的元素来进行操控。

//面向对象编程的挑战之一:

如何在问题空间的元素与解决看见的对象之间建立一种一对一的映射。

 

接口只管你能向对象发起什么样的请求:

还必须有实现这个接口的代码,而这些代码和隐藏的数据组成了实现(implementation)

隐藏实现:

将程序员分为

1)类的创建者(classcreator那些创建新的数据类型的人):

类的创建者可以根据需要隐藏一些类的内容,防止被客户程序员修改。

2)客户程序员(clientprogrammer那些使用这些类编程的人):

是为了收集各种类以方便快速开发应用程序。

隐藏实现是通过访问权限来控制的:

1.禁止客户程序员去碰他们不该碰的东西。

2.允许类的创建者能在不打扰客户程序员的情况下修改类的内部工作方式。

java通过三个明确的关键字来确定类的边界:

1.public:

表示后面跟着的东西谁都能用。

2.private:

除非类的创建者使用这个类的方法就行访问,否则没人能访问到这个元素。

3.protected:

类似于private,区别在于继承类能够访问到protected内容,但不能访问到private内容。

4.frendly:

java的默认访问权限,通常称之为package权限。

同属于这个package默认类能够访问任何默认类,但是出了这个package就是private。

复用实现:

一旦一个类创建完并且测试完之后,它应该能很好的表示一段有用的代码。

这个是OOP(面向对象)语言最显著的优点之一。

复用代码最简单的方式就是创建这个类的对象,也可以将这个类的对象放在一个新的类中,这称之为创建一个"成员对象"。

合成:

用已有的类合成新的类(composition),如果对象是动态合成的称之为聚合(aggregation)

由于继承在OOP中是如此的重要,会被反复强调,给人错觉就是:

应该尽量使用继承。

实际上,在创建一个新类时:

应该优先考虑合成,这样更简单也更灵活,整个设计也是井井有条。

积累更多经验,才能用好继承。

继承:

复用接口(extends关键字)

对象本身就是一个非常有用的概念,它把数据和功能结合在一起,让编程的角度提升到问题本身,而不再过于注重过程。

当创建了一个类的时候,再创建一个类似的类的时候就显得非常的麻烦,要是将已经有的类克隆,在克隆类上修修改改。

这个就是继承的功效。

原先的那个类称之为(父类fatherclass,基类baseclass,超类supercalss),区别在于:

superclass修改了,其继承它的类也会得到改变。

继承的类称之为(衍生类,derivedclass,继承类inheritedclass,子类subclass,childclass)

基类是为了表达:

对系统中某些对象的核心思想的理解。

衍生类是从基类派生出来的,表达:

各种实现这个核心思想的方式。

当继承一个类的时,也创建了一个新类。

这个新类不仅包含了已有类的所有成员(尽管private成员已经隐藏起来了,是不能访问的),更重要的是它复制了基类的接口,于是所有能够传给基类的消息也都可以传给派生类。

根据一个类能够接受什么消息来判断这是什么类,因此这就意味着派生类和基类是属于同一类型。

既然基本和派生类具有相同的基本接口,那么这个接口背后就必须跟着实现:

也就是当对象收到某个消息的时候,它必须能执行一些代码。

如果你只是继承了这个类,其他什么都不做,那么基类的方法会直接带到派生类。

有两种方法来区分派生类和基类:

1)直接往派生类里加新的方法,这些新的方法不属于基类的接口。

这种简单原始的继承方法常常是解决问题的完美方案。

2)覆写(override)也是更重要的区分方法是在新的类中修改基类的方法

把基类和派生类这种关系称作是(is-a)关系。

“园是一种形状”。

也可以是(is-like-a)。

可凭借多态性相互替换的对象:

后绑定(latebinding):

当向某个对象发送了一个消息之后,不到运行时,系统不能确定到底该调用哪段代码。

编译器只保证这个方法存在,并且检查参数和返回值的类型(不这么做的语言属于弱类型weaklytyped),但是它并不知道具体执行的是哪段代码。

要进行后绑定,java用了一些特殊代码来替代绝对调用。

代码用存储在对象中的信息来计算“方法”的地址,因此每个对象的运行方式会根据这段代码的内容而改变。

当你向那个对象发送一个消息时,对象实际上知道该如何处置。

动态绑定是java的缺省行为。

因此无需添加额外的关键词就能获得多态性!

要展示多态性:

要单独写一段会忽略类型的具体信息,而只跟基类打交到的代码

上传(upcasting):

把派生类当作它的基类来用的过程,当你向对象发送消息的时候,即便是上传之后,这个对象也会做出正确的反映。

abstract基类和interface

通常在有些设计方案中:

让基类去表示由其派生出的类的接口——也就是不让他人创建一个基类的对象,而只是向把对象上传给它,以期能使用这个类的接口。

这个时候使用abstract关键词来把这个类做成抽象类,编译器会阻止任何人创建abstract类的对象——这是个用来强化设计的工具。

abstract关键词也可以用来表示这个方法还木有实现——就像一个声明:

"由这个类所派生的所有的类都有这个方法,但是它的实现不在原super类"的一个存根。

abstract方法只能存在于abstract里,如果有个类继承了这个abstract类:

1)实现这个抽象方法.2)也是一个抽象类。

abstract方法能让你将方法放到接口而不必为它写一些无意义的代码。

interface关键词更是对abstract类的概念的深化:

它不允许你实现任何方法。

interface是个很趁手也很常用的工具,因为它能彻底地将接口与实现分离开来,如果你愿意,还可以继承多个接口,因为要继承多个常规或是抽象类是不允许的。

对象的创建(new),使用和生命周期

从技术角度而言:

OOP只包括抽象的数据类型,继承和多态。

还有一个重要的问题:

对象它是如何创建的,又是如何消亡的,用来表示对象的数据是存储在哪里的,又该怎样控制其生命周期?

1)C++的做法是强调效率是第一位的:

它让程序员自己去选择,为了获得更快的运行速度,可以在写代码的时候决定将对象放在栈里(有时会被称为automatic或scoped的变量)或是静态的存储区域。

这个方法把分配和是否存储空间的速度放在第一位,在某些场合下是有价值的,但是这样做牺牲了灵活性。

2)java在一个被称之为堆的内存池里动态创建对象:

只有到了运行时,你才可以知道对象的数量,寿命以及其确切的类型。

如果你要一个新的对象,可以在要用它的时候,在堆中直接创建一个。

(在栈中分配存储空间通常只需要一个汇编指令,把栈指针向下移就行了,想把指针指回来也只要一条指令,而堆的存储分配则取决于存储几只的设计)这种动态的方法是建立在这样的一个合理的假设的基础上的:

对象都比较复杂。

所以与创建对象相比分配空间,释放空间这点开销不会对性能造成很大的影响。

此外,更高的灵活性对于解决更为通用的编程问题也是很重要的。

3)java为不同的任务提供了不同的容器:

a)好几种list类(以持有线性序列)

b)Map类(也称之为关联性数组associationarrays,将一个对象同另一个对象关联起来)

c)Set类(不持有两个相同的对象)

d)有些容器类还包括队列,树,栈。

所有容器都能让你放东西进去,拿东西出来;通常有将元素放入和元素取出的方法,dan'shi

单根继承体系

创建对象:

Strings=newString("abcd")

表示给我创建一个新的String,而且还用字符串参数告诉它“如何”制作这个Strin

其中s为reference:

句柄,存放在栈中。

java编程基本上就是创建类。

数据存放在哪里?

1。

寄存器(registers)这是反映最快的存储,处在处理器里面,由编译器进行分配。

2。

栈(stack):

位于常规内存区,处理器可以通过栈指针对它进行直接访问.对象的句柄存放在栈里,但对象本身并没有放在栈里。

基础类型也存在栈中,可以提高效率。

3。

堆(heap):

这是一段对用途的内存池(也在内存里面),所有的java对象都保存在这里。

堆的优点是:

分配空间的时候,编译器无需知道该分配多少空间,或者这些数据毁在堆里呆多长时间。

4。

静态存储(statisstorage):

静态的含义就是“在固定的位置”(尽管它还是在RAM里面),静态存储里面的数据在整个程序的运行期间都能访问到。

可以用static关键字来指明对象中的某个元素是静态的,但java对象本身是绝对不会放到静态存储中区的。

5。

固定存储(constantstorage):

常量值通常直接放在程序里,这样他们就不会被改动了,因而也更安全。

6非内存的存储(Non-RAMstorage):

如果数据完全独立与程序,那么即使程序不运行,它也应该也还在;即使程序失去了对数据的控制,它也仍然还在。

例子:

流对象(streamedobject):

一种会被送往另一台机器,由对象转化而成的字节流。

“persistent”对象:

保存在磁盘上,能在程序中止后仍保存对象状态的文件。

这类存储的奥妙就在于,对象被转化成了某种能保存在其他介质上的东西,但是要用的时候,又能在内存里重建。

特列:

primitive(原始)类型

用new创建对象--特别是想简单变量之类的小对象的时候,效率不是很高,因为它们都放在堆里。

对于这类原始数据,java承袭了C和C++的办法。

也就是说,这个变量不是用new来创建的,相反,这里所创建的是一个“非reference”的自动变量。

这个变量保存着值,并且存储在栈中,因而效率会比较高。

所有的数字型都是带符号的。

primitive类型的“wrapper”类允许你在堆里创建一个表示这个primitive型的数据的对象。

这个对象不是primitive型的。

charc='x';

Charcaterc=newCharcater('x');

java还包括两个能进行高精度算术运算的类:

BigInteger(任意精度的整数)andBigDecimal(任意精度的浮点数)虽然也勉强可以算作是“wrapper”类,但是木有那个primitive类型能和这两个类想对应。

作用域(scope):

决定了在这个作用域里定义的变量的可见性与生命周期。

intx=12;

{

intq=96;

}

在作用域中定义的变量只能用到这个作用域的结尾。

intx=12;

{

intx=96;

}

这个写法虽然在C和C++里是完全合法的,但是不能在java里这么写。

java、的设计者认为这会导致令人费解的程序。

 

对象的作用域:

java对象的生命周期同primitive的不同,当你用new创建java对象之后,它会晃荡到作用域外面

Strings=newString("abcd")

s这个reference会在作用域结束之后消失,但是s所指的那个String仍然还占这内存。

在这段代码里,你已经没法访问这个对象了,因为唯一指向它那个的reference现在已经出了作用域。

java有个垃圾回收器(gabagecollentor),它会看着所有用new创建的对象,并且还会知道其中的哪些已经木有reference智者乐,然后它会释放那些木有reference指着的对象所占有的内存。

创建新的数据类型:

classATypeName{

}

可以用new来创建这种类型的对象:

ATypeNamea=newATypeName();

当你定义类的时候(java编程要做的就是定义类,创建这些类的对象,然后再向这些对象发送消息)

可以往类里放两种元素

1)数据(field,有时候也称作沈佳怡成员)

2)方法(method,有时候也称作成员函数)

primitive成员的缺省值:

只有在“变量被用作类的成员”时,java才能确保它获得这些默认值,这样就确保了primitive的类的成员肯定能得到初始化!

“本地”变量——也就是非类数据成员的变量,就享受不到这种保障了。

在java中,方法决定了对象能接受那些消息。

唯一标识一个方法1)方法的名字

2)方法的参数列表

intx=a.f();

调用方法通常被称为向对象发消息。

f()就是消息,a就是对象。

面向对象的编程通常被简单的归纳为“向对象发消息”

 

参数列表:

方法的参数列表会告诉你应该向方法传哪些信息,按照java“万物皆对象”的法则,这种信息也该是以对象的形式出现的,所以实际上参数列表就是传给方法的对象的类型和名字。

不管哪种情况下,java传递对象的时候,实际上是在传reference,因此reference的类型必须正确!

return有两个作用:

1.它会告诉你方法要返回哪个值(如果不是void返回型的)

2它会立即返回那个值。

程序就像是一堆带着方法的对象,而方法又都拿其它对象作参数,并且向其他对象发消息。

构建java程序

static关键字:

通常创建类的时候,你只是在定义这类对象会长什么样子,会有什么行为!

除非用new创建一个那种类的对象,否则什么也得不到,只有创建了对象,它才能分配到内存,方法也才能用。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1