接口
1 接口:全部的方法都是抽象方法,全部的属性都是常量(final static)。
接口用来表示纯抽象概念,没有任何具体的方法和属性。
//所以抽象类不全的方法不全部是抽象方法。
2 不能实例化(不能new),可以定义变量。
3 接口变量可以引用具体实现类的实例。
4 接口只能被实现,一个具体类实现接口,必须使用全部的
抽象方法。
//而继承一个抽象方法只需要实现自己想要的方法。
5 接口之间可以继承。
6 一个具体类可以实现多个接口,实现多继承现象,表示:
一个概念即是XXX也是XXX.
7 接口中的属性,默认是常量 public static final
8 接中的方法一定是:public abstract
9 实现一个接口,使用关键字implements, 实现实际上是
一种继承关系。接口和实现类是父子类型的关系
Object 的方法 是Java的继承root类, 所有类都从
这个类继承.
1 toString() 方法, 返回对象的文本描述, 经常被
系统默认调用,
默认返回: 权限定名@HashCode;
权限定名:包名.类名
SUN 建议覆盖toStirng(), 返回合理的文本.
//对于一个对象加不加toString方法返回的一样的,默认都是调用toString();
//Arrays.toString(cards)返回的是数组中每个元素的toString方法。
Object 类
2 equals 是用来比较两个对象是否相等的方法。
区别:引用相等 与 对象相等
引用相等: 使用 “==”
对象相等: .equals() 方法
equals在Object类中声明,默认的比较规则是:比较引用
// 本来equal是用来比较两个对象的数据是否相等,但是equal默认还是比较的引用,所以要重写。
建议覆盖,实现对象的比较(比较对象的状态,就是比较对象
的数据)。
* 覆盖规则:
a 自反性:对于任何非空引用值 x,x.equals(x)
都应返回 true。
b 对称性:对于任何非空引用值 x 和 y,当且仅当
y.equals(x) 返回 true 时,x.equals(y)
才应返回 true。
c 传递性:对于任何非空引用值 x、y 和 z,如果
x.equals(y) 返回 true,并且 y.equals(z) 返回
true,那么 x.equals(z) 应返回 true。
d 一致性:对于任何非空引用值 x 和 y,多次调用
x.equals(y) 始终返回 true 或始终返回 false,
前提是对象上 equals 比较中所用的信息没有被修改。
e 对于任何非空引用值 x,x.equals(null) 都应返回
false。
标准的equal写法:
public boolean equals(Object obj) {
if(obj==null)
return false;
if(this==obj)
return true;
if(obj instanceof Point){
Point other = (Point)obj;
return x==other.x && y==other.y;
}
return false;
}
3 hashCode() (hashCode()、equals()通常在一起重写,直接用快捷键盘即可重写)
1 hashCode()方法要与equsle方法一同覆盖
a 当两个对象equals比较为true时候,这两个对象应该
具有相同的hashCode()值
b 当两个对象equals比较为false时候,这两个对象应该
具有不相同的hashCode()值
c hashCode() 值要稳定(一致性),一个对象创建以
后就不应该再变化
2 默认的hashCode() 值是当前堆对象地址转换的一个整数
这个整数不是内存地址。
3 一般使用对象的OID值作为hashCode的值。
OID 对象的唯一编号,在工程项目中一般采用数据库来
生成OID,也就是数据库中的“主键”
//结论:在写项目的时间,hashCode()、equals()必须要一起重写。十分重要,参看jobsys.
String 字符串
一串字符就是字符串: char[] , String,
StringBuilder,StringBuffer 都是相当于一串字符串,效率更高的用char[]
java底层用的是char[]。
1 字符串"字面量"都是String类型实例
String 内部就是一个char[].
2 String API 有一个实现原则: 对象内容永远不变
也就是说: String对象永远不变.
3 String 字面量(直接量), 如果相同, 会替换为同
一个String对象的引用, 常量连接的结果也被优化
为一个字符串.
String s1 = "abc";
String s2 = "abc";
String s3 = "ab"+"c";//abc
System.out.println(s1==s2);//true
System.out.println(s1==s3);//true
String s4 = new String("abc");、
//此时内存中有两个字符串对象,一个字面量对象在字符串缓冲池中,一个是new出来的,内容都是abc.
System.out.println(s1==s4);//false
4 String 的比较, equals, hashCode()
//比较string时间,用equals方法,如果相等,hashCode()一定一样。
//sun公司规定,覆盖equals一定覆盖hashCode();
5 String API (字符串的常用方法)
这些方法如果返回String 一定是一个新String对象
toString() 除外.
字符串中的字符有序号, 从0开始.
API 方法://它们返回的都是新的字符串对象,不改变原对象的内容 。
charAt()
length()
trim()
indexOf()//从前往后数第一个满足的。
lastIndexOf()//从后往前数第一个满足的。
endsWith()
startsWith()
substring(int start, int end)//从start到end不包含end。
substring(int start)//从所在位置到最后
java中所有索引都是从0开始。
java中所有的范围都是包含开头不包含结束。
java中所有关于字符串的方法不改变原字符串的内容,而是其返回值返回一个新的对象 。
预习: 正则表达式
//java中所有范围的规则都是包含前,不包含后面。
正则表达式: 负责的字符串匹配处理规则, 应用广泛.
学习建议: 1 要能够读懂"正则表达式"
2 能够写出简单的"正则表达式"
3 不要过多的分配学习时间!
例子:
群众[甲乙丙丁]
[0-9][0-9][0-9][0-9][0-9][0-9]匹配六位少于六位不能匹配,大于六位,
只匹配前六位。
由于上面这样写很麻烦,所以我们引入了数词。
[0-9]{6}与上面的效果相同。
在匹配手机号时间,如果位数多了,还能够匹配,所以
^[0-9]{11}$这样就表示开始到结尾中间共有11位数字。
匹配十八位身份证:^[0-9]{17}[0-9Xx]$前17位是数字,最后一位可以是数字,也可以x X.
也可这样写: ^[0-9]{17}[0-9|X|x]
数字[0-9]也麻烦,可以缩写成\d
[0-9]=\d
如:\d{17}[\dxX]$
网站用户名:^\w{6,8}$表示从头开始包含6-8个字母或者数字或者_的用户名。
//空白不是空格,空格,回车,换行,跳格(tab)都是空白。
trim()所指的空白,和正则的空白都是指这个。整个java中的空白都是指这个。
可以应用于: java grep vi
1 字符集: [1234] 表示 1,2,3,4 之一
[^12] 表示除了 1,2
[1-5] 表示 1,2,3,4,5
[a-f] 表示 a-f 之间的
[0-9a-fA-F] 表示:一个16进制字符
预定义字符集:
\d : [0-9]
. : 任意字符
\w: 单词字符 [0-9a-zA-Z_]=[0-9|a-z|A-Z|_]
\s: 匹配空白: 空白不是空格,空格,回车,换行,跳格(tab)都是空白。
2 {m,n} 数词
{n}
{m,n}
? : {0,1}
+ : {1,n}
* : {0,n}
3 ^ 开头
$ 结尾
邮政编码: ^[0-9][0-9][0-9][0-9][0-9][0-9]$
^[0-9]{6}$
^\d{6}$
用户名规则: ^\w{8,10}$
电话号: +86 13912345678
^(\+86)?\s?\d{11}$ //第一个\+86是转义字符。
身份证号码: ^\d{15}(\d{2}[0-9xX])?$
一个点的坐标: ^\d+(,\s*|\s+)\d+$
3,2
3, 2
3 2
3 2
String 对正则表达式的支持
.matches() 匹配正则表达式//返回值是true或者false.
.split() 切分字符串为字符串数组
.replaceAll()
/**
* 检测收件人是否合法
* @param ed
* @return
*/
private boolean EmailDataIsValidate(String ed){
Pattern pattern= Pattern.compile("^(\\w|[\u4E00-\u9FA5])+<([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z0-9A-Z]{2,}>$");
Matcher matcher=pattern.matcher(ed);
return matcher.find();
}
Integer.parseInt() 转换到字符串到整数: 如: "23"-> 23
预习: 日期时间, StringBuffer 包装类