面向对象二.docx

上传人:b****6 文档编号:8682732 上传时间:2023-02-01 格式:DOCX 页数:16 大小:133.63KB
下载 相关 举报
面向对象二.docx_第1页
第1页 / 共16页
面向对象二.docx_第2页
第2页 / 共16页
面向对象二.docx_第3页
第3页 / 共16页
面向对象二.docx_第4页
第4页 / 共16页
面向对象二.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

面向对象二.docx

《面向对象二.docx》由会员分享,可在线阅读,更多相关《面向对象二.docx(16页珍藏版)》请在冰豆网上搜索。

面向对象二.docx

面向对象二

1.抽象类

Animal不是具体的动物,不应该能够制造出对象,并且相应的功能不应该有具体的实现。

一个方法如果有方法体(有大括号即有方法体),说明此方法有具体实现。

那么Animal的相关方法不应该有方法体。

如果一个方法没有具体实现,我们称为抽象方法,必须用abstract进行修饰。

当一个类中有抽象方法时,其所在的类也必须定义成抽象的。

抽象类不能被实例化,即不能new出对象。

一个类中只要有一个抽象方法,这个类就必须是抽象的。

如果子类没有完全实现父类的抽象方法,即么子类也必须定义成抽象的。

一个抽象类可以没有抽象方法,但是包含了抽象方法的类必须是抽象的。

2.final关键字

修饰类:

这个类称为最终类,不能被继承。

当一个类被定义为抽象类,就不能再用final修饰了。

实际开发中基本不会用来修饰类。

修饰方法:

此方法不能被重写。

但是可以正常调用。

修饰变量:

修饰成员变量:

被当作常量处理。

必须被初始化。

一旦初始化,不能再改变其值。

一个约定:

通常情况下,我们把常量名全大写,而且声明为静态的。

通常见到的常量是这样定义的:

publicstaticfinalintUSER_ACTIVE=1;

publicstaticfinalintUSER_NO_ACTIVE=0;

修饰局部变量:

被当作常量处理,必须被初始化。

一旦初始化,不能再改变其值

3.接口

抽象类是从多个类中抽象出来的模板,如果希望抽象的更彻底,就使用接口。

*USB接口并不是我们看到的USB插槽,而是插槽所遵循的一套规范。

我们所看到的插槽是根据这套规范设计出来的实例。

*

*接口只定义类应该遵循的规范,并不关心实现的细节。

*这样的做法分离了规范和实一同,增强了扩展性和可维护性。

*

*

*接口中一般存在两种成员:

*成员变量:

全部是常量

*publicstaticfinal

*成员方法:

全部抽象方法

*成员方法直接默认成抽象的,可以省略abstract

*

*一个类可以实现多个接口

*接口可以继承接口

*一个类可以继承一个类的同时再实现多个接口

*接口不能实例化,

*多态的应用:

一个接口的引用指向一个实现类对象(更常用)

4.一些常用类

API:

(ApplicationProgrammingInterface)

应用程序编程接口。

即JAVA提供给我们使用的类。

这些类将底层的实现进行了封装。

作为程序员不需要关心这些类是如何实现的,我们需要学习如何使用这些类。

看帮助手册。

看帮助手册的方法:

1)先看某个类的构造方法

2)看这个类的相关方法

1 Object

类Object是类层次结构的根类。

每个类都使用Object作为超类。

所有对象(包括数组)都实现这个类的方法。

关心Object的三个方法:

看参数,看返回值,看此方法是不是静态的。

1,hashCode()

哈希值:

是根据对象的地址换算出来的一个int值,不同的对象,地址不同,hash值也是不同的。

2,equals

Object的equals方法比较的仍然是地址值。

(可参考源代码)

String重写了equals方法。

如果我们自己的类想要比较两个对象是否内容一样(即成员变量的值是否相等),就需要像String一样重写equals方法。

例如:

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

}

if(objinstanceofStudent){

Students=(Student)obj;

returnthis.name.equals(s.getName())&&this.age==s.getAge();

}

returnfalse;

}

3,toString

打印一个对象时,默认调用toString()方法。

而toString()方法返回结果是:

getClass().getName()+'@'+Integer.toHexString(hashCode())

 

2 String

String类代表字符串。

字符串是常量;它们的值在创建之后不能更改.

String可以看作是字符数组。

Stringstr=“hello”;

str=“world”;

String类的方法:

A,判断功能

equals

contains

startWith

endWith

isEmpty

B,获取功能

charAt

substring(startIndex,endIndex)startIndex包括,endIndex不包括

C,转换功能

toCharArray

toLowerCase

toUpperCase

getBytes

D,其他

length()

concat()效果同+

3 日期相关类

a)Date

Date中的很多方法已过时,需要用Calendar中的相关方法取代。

需了解的方法:

Date()

Date(longdate)

getTime()

setTime()

b)Calendar

是一个抽象类

它的getInstance()方法实际上返回的是其子类的对象。

需了解的方法:

getInstance()

get(intfield)取代了诸如Date中的getYear,getMonth等。

set(...)

getTime()返回一个Date对象.实现Calendar与Date的转换。

需了解的常量字段:

Calendar.YEAR

Calendar.MONTH(月份从0开始)

Calendar.DATE

(其他参考API)

c)SimpleDateFormat

用于对日期按要求的格式进行处理。

简单总结:

与日期相关的类:

1,Date

构造方法:

Date()--当前时间

Date(longdate)

方法:

longgetTime()

voidsetTime(longdate)-与Date(longdate)作用相同

Date重写了toString()方法,返回的是dowmonddhh:

mm:

sszzzyyyy

与中国人表示日期的习惯不同。

所以我们需要一个格式化类。

2,SimpleDateFormat

构造方法:

SimpleDateFormat(Stringpattern)

pattern常用格式"yyyy-MM-ddHH:

mm:

ss"

方法:

Stringformat(Date)--将一个日期对象转成指定格式的字符串

Dateparse(Strings)--将指定格式的字符串转成日期对象

java.text.ParseException:

Unparseabledate:

"2005年12-1010:

12:

30"

模式串(格式串)必须和表示日期字符串(s)的格式要完全一致。

3,Calendar--Date的取代类

抽象类

方法:

CalendargetInstance()--返回的是一个子类对象

intget(intfield)--取代了Date的getYear,getMonth,getDate...

field的取值参考Calendar的常量字段

intset(intyear,intmonth,intdate);--month从0开始

4,Date转成Calendar

setTime(Datedate)使用给定的Date设置此Calendar的时间。

Calendar转成DateCalendar的getTime()返回Date

5.基本数据类型的包装类

java为以下8种基本数据类型提供了对应的包装类,通过这些类可以把基本数据类型包装成对象使用。

JDK1.5开始提供自动的装箱和拆箱功能。

允许把基本数据类型的值直接赋给包装类的引用变量(装箱)。

也允许把包装类对象直接赋给对应的基本数据类型变量(拆箱)。

byte-Byte

short-Short

int-Integer

long-Long

char-Character

boolean-Boolean

float-Float

double-Double

1 Integer说明

把一个int类型的值转换成Integer的方法:

1,通过构造方法(newInteger(int))

2,Integer.valueOf(int)--优先使用

内部缓冲区-128到127之间。

超过此区间会重新new

直接装箱的动作Integeri=10;默认调用valueOf(int)方法。

将字符串(数值型字符串)转成int的方法:

Integer.parseInt(str)

把int(Integer)转成字符串的方法:

Integer.toString(int)

2 Character

6.集合类

数组可以存放基本数据类型和引用数据类型的数据

但是数组长度固定,不能适应变化的需求

1)集合根接口Collection

interface

Collection层次结构中的根接口

2)集合类的继承体系

 

java当中提供了不同的集合类,但这些集合都有一些共性的东西,于是就有了集合的继承体系。

而Collection就是这个体系的根结点。

Collection规范中规定了作为集合必须实现的功能:

a,添加功能

add(Objectobj)

b,删除功能

remove()

clear()

c,判断功能

isEmpty()

contains()

d,遍历功能

Iteratoriterator()

Iterator-hasNext()next()

e,转换功能

Object[]toArray()

f,获取功能

sizw()

遍历集合的两种方式

a,使用iterator()--推荐

b,使用toArray()

3)List特点

集合中的元素可以重复,并且元素有序(存储和取出顺序一致)

list.add(“hello”);0

list.add(“hello”);1

4)Set特点

集合中的元素不可以重复,并且元素无序。

(存储顺序和取出不一致)

像一个大盒子,无法记住添加元素的顺序,因此元素也就不能重复,否则集合就无法准确识别某个元素。

set.add(“hello”);

set.add(“hello”);

面试问题:

List和Set的区别

ArrayList,LinkedList,Vector的区别

●实现类HashSet

HashSet是Set的典型实现。

是最常用的一个Set实现类。

HashSet是按照Hash算法来存储集合元素的。

有良好的存取和查找性能。

不是同步的。

如果有多个线程同时修改集合,我们必须自己通过代码来保证数据安全。

元素可以为null,且只能有一个。

当向HashSet中存储元素时,HashSet会调用元素的HashCode()方法得到对象的hashCode值,用这个值来决定元素在HashSet中的存储位置。

如果两个元素的equals的比较为true,但是hashCode值不同,HashSet会将这两个元素存储在不同的位置,可以添加成功。

如果两个元素的equals的比较为true,但是hashCode也相同,不能存入。

遍历方法:

1,通过Iterator

2,通过增强for(可以遍历数组和集合)

结论:

当我们自定义的对象存储到HashSet中时,应该重写equals和hashCode方法

自动生成即可。

●实现类TreeSet

使用元素的自然顺序对元素进行排序.此实现不是同步的.

构造方法:

TreeSet():

构造一个新的空set,该set根据其元素的自然顺序进行排序。

自然顺序:

内部还是调用对象的compareTo方法进行比较的。

5)Map特点

将键映射到值的对象。

一个映射不能包含重复的键;每个键最多只能映射到一个值。

值可以重复。

●实现类HashMap

此类不保证映射的顺序。

线程不安全,此实现不是同步的.效率高。

允许null键和null值。

添加:

booleanput(k,v);

移除:

vremove(k);

voidclear();

判断:

booleanisEmpty();

booleancontainsKey(k);

booleancontainsValue(v);

获取:

vget(k);

SetkeySet();

Collection

Set>entrySet();

intsize();

●实现类Hashtable

Hashtable是比较早的一个实现类,线程安全,是同步的,但是效率低。

不允许null键和null值,如果设置会引发空指针异常。

注意:

一般不会Hashtable,如果需要保证线程安全,可以通过Collections工具类将HashMap变成安全的。

6)Collections操作集合的工具类

排序方法:

Sort(List)

查找方法:

binarySearch

使用二分搜索法搜索指定列表,以获得指定对象。

在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过sort(List)方法)。

如果没有对列表进行排序,则结果是不确定的。

打乱集合:

shuffle(List

> list)

反转集合:

reverse(List)

7)集合回顾

Collection单列集合

|-List(有序,可重复)

|-ArrayList内部用数组实现,线程不安全,效率高。

在查询时效率较高,但是增删时效率低。

|-Vector内部用数组实现,线程安全,效率低。

在查询时效率较高,但是增删时效率低。

|-LinkedList内部用链表实现,线程不安全,效率高。

在查询时效率较低,但是增删时效率高。

List遍历方式:

a,迭代器

b,增强for

c,get(index)和size()组合用普通for

|-Set(无序,唯一)

|-HashSet通过hashCode和equals方法保证唯一性。

|-TreeSet按照自然排序方式对元素排序。

如果是自定义的类作为元素被排序应该实现Comprable接口,

Set遍历方式:

a,迭代器

b,增强for

Map(元素是键值对,键唯一)双列集合

|-HashMap线程不安全,效率高。

允许null键和null值。

|-Hashtable线程安全,效率低。

不允许null键和null值。

Map遍历方式:

a,先得到key的集合(Set),通过set的遍历方式得到value

b,t先得到键值对的集合(Set),通过set的遍历方式得到Map.Entry

Collections和Collection的区别:

Collection是集合体系的一个根接口。

Collections是操作集合的一个工具类。

集合中必须掌握的方法:

Collection:

add(E),remove(0,contains(E),iterator(0,size()

List:

get(index)

Set:

没有特殊方法

Map:

put(k,v),remove(k),containsKes(k),containsValue(v),keySet(),values(),entrySet(),size(),get(k)

8)数组和集合的区别

A,长度

数组长度固定

集合长度可变(自动扩展)

B,内容

数组只能存放同一种类型数据

集合可存放多种类型的数据

数组可以存放基本数据类型和引用类型

集合只能存放引用类型(基本数据类型被包装成其包装类)

9)常见数据结构

栈:

先进后出

压栈

出栈

队列:

先进先出

链表:

由一个或多个节点连起来的结构。

每个节点由指针域和数据域组成。

指针域存储另一个节点的地址。

ArrayList内部是用数组实现的,查询速度快,但是删除和插入较慢。

线程不安全的,效率更高。

Vector内部也是用数组实现的,查询速度快,但是删除和插入较慢,线程安全,效率较低。

LinkedList内部是用双向循环链表实现的,查询较慢,但是删除和插入较快。

线程不安全。

10)泛型

可以让集合模仿数组,在创建集合时指定元素的数据类型。

即泛型。

把类型明确的工作推迟到创建对象时,也叫参数化类型。

A,格式:

〈类型〉类型只能是引用类型

B,好处:

把运行期的问题提前到编译期

避免了强制类型转换

C,哪里会使用泛型?

参考API,如果接口,抽象类后面有,就会使用到泛型。

一般集合中最常用。

11)泛型的应用

A,泛型类

格式:

publicclass类名<泛型类型1,泛型类型2,……>

泛型类型只是一个标识,只要符合标识规范即可。

常用E,T,K,V

B,泛型方法

C,泛型接口

格式:

publicinterface接口名<泛型类型1,泛型类型2,……>

 

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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