面向对象二.docx
- 文档编号:8682732
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:16
- 大小:133.63KB
面向对象二.docx
《面向对象二.docx》由会员分享,可在线阅读,更多相关《面向对象二.docx(16页珍藏版)》请在冰豆网上搜索。
面向对象二
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);
Set
Collection Set 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,……>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象