现在的位置: 首页 > 综合 > 正文

第十一天:接口

2018年05月16日 ⁄ 综合 ⁄ 共 4380字 ⁄ 字号 评论关闭

接口
 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 包装类

 
    
    

抱歉!评论已关闭.