java深入学习笔记

  • 格式:docx
  • 大小:25.51 KB
  • 文档页数:9

1 / 9

Java深入学习笔记

面向对象编程的三原则(封装,继承,多态)怎样理解?

Java封装的基本单元是类。

为什么对整数或字符不使用new关键字?答案是java的基本类型并不是作为对象实现的。类是一个逻辑结构,而对象则有其物理真实性(在内存中占有空间)。

构造函数调用是在对象被创建后,new运算符完成之前,将调用构造函数。

一个构造函数隐含的返回类型是类类型本身。

This.关键字

一般是在方法内部使用this关键字来引用当前对象。This调用的是方法对象的一个引用。

当局部变量和一个实例变量同名时,局部变量隐藏了实例变量。

使用this可以解决在实例变量和局部变量之间可能出现名字空间冲突的问题。

垃圾收集机制

由于对象是使用new运算符动态第分配内存,所以还要销毁这些对象、释放其存储空间以备从新分配。

工作原理:当不存在对一个对象的引用时,就假定不在需要该对象了,垃圾(garbage)收集仅仅在执行时偶尔出现,finalize()仅在垃圾收集之前被调用。

堆栈类

在java中类是一种机制,正是通过它实现了封装,创建一个类时,就是创建一个新的数据类型,这个数据类型定义了被操作的数据的本质和操作数据的例程,

2 / 9

堆栈类有一点要注意,保存堆栈的数组可以被堆栈类外面的代码改变,这使得堆栈很容易被误用或受到损坏。

方法重载(java实现多态的方式之一)

重载的价值是:它允许相关方法通过使用一个公用的名称来访问。

对象参数

把对象作为参数进行传递是常用的用法,对象参数常用在构造函数中,

参数传递:

按值调用,按引用调用

Static关键字

通常,类成员必须通过它的类的对象访问。然而,可以创建这样一个成员,他能够被它自己使用,而无需引用一个特殊的实例。当声明一个对象为static时,可以在类的任何对象创建之前访问它,而无需引用任何对象,被声明为static的变量本质上是全局变量,当声明该类的对象时,不会产生static变量的副本,类的所有实例共享同一个static变量。

如果要通过计算来初始化static变量,可以声明一个static块,这个块仅在该类被第一次加载时执行一次。

内部类and嵌套类(nested classed)

嵌套类的作用域由包含它的类的作用域限定因此,如果类B在类A内定义,则类B为A所知,但不被A的外面所知。嵌套类可以访问嵌套它的类的成员,包括私有成员,但包围类不能访问嵌套类的成员。

有两种类型的嵌套类:静态的和非静态的,静态嵌套类是一个具有static修饰符修饰的类,因为是静态的,所以他必须通过对象来访问其包围类的成员,也就是说,他不能直接引用包围类的成员,因为有了这个限制,所以很少使用静态嵌套类。

3 / 9

最重要的嵌套类是内部类(inner),内部类是一个非静态的嵌套类。它可以访问它的外部类的所有变量和方法,并且可以象外部类的其他非静态成员那样以同样的方式直接引用他们,因此,一个内部类是完全在其包围类的作用域内的。

但是内部类的成员仅在内部类的作用与内是可知的,不可以被外部类使用。

String类

理解字符串第一件事是:创建的每一个字符串实际上都是一个String类型的对象,即使是一个字符串常量,也是一个String对象。

理解字符串第二件事是:String类型的对象是不可改变的。一旦创建一个String对象,就不能改变其内容。

变长参数(varargs)

一个变长参数由三个句点(。。。)来指定。

一个方法既可以带正常参数,也可以带变长参数,但是变长参数必须是该方法最后声明的参数,例如:Int doIt(int a, int b, double c, int ... vals);

而且只能有一个varargs参数。可变参数与模糊性。

超类变量可以引用子类对象(父类的引用指向子类的对象):

决定了可以访问什么成员的是引用变量的类型,而不是它引用的对象类型。也就是说,将一个子类对象的引用赋给一个超类引用变量时,只可以访问由超类所定义的那部分对象。

Super的两种常见的形式:第一种调用超类的构造方法。第二种访问被子类成员所隐藏的超类成员。

在多级层次结构中,super0方法总是引用最近超类中的构造方法,如果一个超类构造方法要求参数,那么所有的子类必须“向上“传递耐那些参数不管之类是否需要参数。

4 / 9

动态方法调度

方法重写构成了Java最强大的一个概念基础:动态方法调度(dynameic

method dispatch)

动态方法调用是一种机制,借助与这种机制,对一个已重写方法的调用将在运行时,而不是在编译时解析。

前面讲过,超类引用变量可以引用子类对象,java使用这个事实来解决在运行时对

重写方法的调用。其运行原理是:

当一个超类引用调用一个重写方法时,Java根据在调用时被引用对象的类型来决定执行哪个版本的方法,因此这个决定是在运行时作出的。但引用不同类型的变量时,将调用不同版本的重写方法。换句话说,是被引用对象的类型(不是引用变量的类型)决定将执行那个版本的重写方法,因此,如果超类包含一个被子类重写的方法,那么当通过超类引用变量来引用不同类型的对象时,就会执行那个方法的不同版本。

为什么重写方法:

重写方法允许java支持运行时的多态,多态是面向对象编程的本质,它允许通用类指定方法,这些方法对该类的所有派生类都是公用的,同时该方法还允许子类定义这些方法中的某些或全部特定实现,重写方法是java实现其多态性“一个接口,多个方法”的另一种方式。通过同时使用继承和重写方法,超类能够定义供其所有之类使用的方法的通用形式。

通过继承和运行时的多态性的双重机制,可以定义一个一致的接口,该接口可以被几个不同但却相关的对象使用。

继承中使用final

关键词final有三种用途。第一,它可以用于创建一个以命名常量的等价物,第二个用法是适用于继承,使用final来阻止重写

第三个用法是用来阻止继承

5 / 9

正则表达式(规则表达式)

Java.util.regex包,它是描述字符序列的字符串,

有两个可支持规则表达式的处理的类:PatternandMatcher.,使用pattern来定义规则表达式,使用matcher来匹配其他序列中的模式。

Pattern

该类没有构造方法,而是再调用compile()工厂方法是创建模式。

Matcher

该类没有构造方法,而是在调用matcher()工厂方法时创建一个Matcher,

Mathcers()模式全局匹配,放回的是布尔值

Find()判读部分匹配,返回布尔值,对find()的每一次调用都会从上一次到达的位置开始。

通过调用group()方法,可以得到一个包含最后匹配结果的字符串序列,如果不存在匹配项,会抛出IllegalStateException,通过调用start()方法,可以得到当前匹配的输入序列每一个匹配项的开始索引值,通过end(),可以得到超过当前匹配项末尾的一个索引。通过replaceAll(),可以用另一个血泪来替换一个匹配序列在文中出现的所有地方,newStr指定新字符串序列。

在默认情况下,find()首先找到与模式相符的最长序列,这被称为‘勉强模式(greedy behavior)‘.我们可以向模式中添加’?‘量词来指定“勉强模式(reluctant

behavior)”,

Java集合框架

所在包java.util

自动装箱为简单类型的使用提供了变量

利用自动装箱/拆箱,可以在使用集合中存储简单类型变得十分便利,因为一个集合只能存储引用,而不是简单类型,有了自动装/拆箱以后,若需要存储

6 / 9

或检索简单类型,java可自动地执行正确的装箱和拆箱操作,而无须再手动的方式。

List接口

List接口扩展了Collection,并声明集合的行为是存储一个序列的元素,列表中可以包含相同的元素。

Set接口

Set接口定义了一个组,他扩展了Collection接口并且声明该集合不允许存在相同的元素,该接口是一个泛型接口

SortedSet接口

该接口扩展了Set接口并且声明了自己是升序的集合,Null不允许存于集合中,

Queue(队列)接口

Queue是1.5新增的,他扩展了Collecion接口,并声明一个队列行为(通常是一个先进先出列表),他也是一个泛型接口,在使用Queue时,有几点要注意,首先,只能从队列的顶部删除元素,其次,只有两种方法可以获得删除元素:poll()和remove(),offer()方法只能添加一个元素到队列中,因为一个队列的长度固定。

Collection(集合)类

所有集合类都不是同步的,但可以得到同步的效果

ArrayList类

扩展了AbstractLIst接口,并且实现List接口

声明:class ArrayLIst

ArrayList支持按需要增长的动态数组,在Java中,标准数组是固定长度的,数组创建以后,不能增长或收缩,这也意味作你必须知道数组将容纳多少

7 / 9

元素,但有时候不知道多少元素,直达运行时才确定,为了处理这种情况,集合框架定义了ArrayList。实际上,一个ArrayList是一个对象引用的变长数组,也就是说,一个ArrayList可以动态增减大小,

从ArrayList中得到一个数组

将集合转化成数组的几个原因:

对于一些特定的操作获得更快的处理。

传递数组到一个没有被重载额方法中以接受集合。

集成新的基于集合的代码和没有使用集合的遗留代码。

转换ArrayList到一个数组有两种方法:

Object [] toArray();

T [] toArray(T array [ ])

第一个版本返回一个Object数组,第二个返回与T同一类型元素的素质,一般情况下使用第二种形式,因为它返回了数组的确切类型。LinkedList类

该类实现了List接口和Queue接口,他提供了一个链表型的数据结构,

声明:class LinkedList

HashSet类

它创建了一个使用哈希表存储的集合,

TreeSet类提供了一个使用树结构存储Set接口的实现,对象以升序存储,访问和遍历是很快,TreeSet是存储大量能很快查找排序信息的很好选择

在集合中存储用户定义的类

集合能够存储任何内嵌的对象,包括用户创建的类对象,

Map接口