第十章:面向对象思考
一.面向对象
1.面向过程的范式在于设计方法,面向对象的范式在于将数据和方法偶合在一起。
2.类的抽象是指类的实现和类的使用分开,实现的细节被封装并对用户隐藏,称为类的封装。
二.类的关系
类之间的关系是关联、聚合、组合和继承
1.关联:一种常见的二元关系,描述两个类之间的活动
2.聚集是关联的一种特殊形式,代表两个对象之间的归属关系,例如学生与地址,一个对象可以被多个其他的聚集对象所拥有
3.如果一个对象指归属于一个聚集对象,那么它和聚集对象之间的关系被称为组合,例如:学生和名字
三.将基本类型当做对象处理
1.基本类型:int double char……
包装类:Integer Double Character……
每个包装类都包含intValue()、doubleValue()等方法将对象“转换”为基本类型值
可以使用基本类型值和表示数值的字符串构造包装类
compareTo()方法返回大于等于小于所对应的1、0、-1
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer i = new Integer(3);
Double d = new Double(3.5);
Double d2 = new Double("3.5");
Double d3 = new Double("1.5");
Double d4 = new Double("8.5");
System.out.println(i.intValue());//3
System.out.println(d.doubleValue());//3.5
System.out.println(d2.doubleValue());//3.5
System.out.println(Double.valueOf("6.5"));//6.5
System.out.println(d.compareTo(d2));//0
System.out.println(d.compareTo(d3));//1
System.out.println(d.compareTo(d4));//-1
}
将字符串转为二进制、八进制、十进制、十六进制
//语法:
Integer i=Integer.parseInt(字符串,进制)//进制可以为2,8,10,16
int i2=Integer.parseInt("011", 2);
System.out.println(i2);//3
//转换为16进制的第二种方法
System.out.println(String.format("%x", 26));//1a
注意
包装类没有无参构造
2.基本类型和包装类型之间的自动转换
基本—>包装(装箱)
包装—>基本(开箱)
Integer x=new Integer(2);//等价于 Integer x=2 (自动装箱)
//但是:
Double d=3;//错误
Double d=3.0//正确
四.BigInteger和BigDecimal对象
1.BigInteger和BigDecimal类可以表示任意大小和任意精度的整数或十进制数
2.通过new BigInteger(字符串)来创建
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger bi = new BigInteger("1234567845678984327");
System.out.println(bi);//1234567845678984327
BigDecimal bd = new BigDecimal("3.14159265358979323846264338327950288");
System.out.println(bd);//3.14159265358979323846264338327950288
}
3.使用add substract multiply divids remainder 做加减乘除余运算
4.注意:
BigDecimal如果结果不能终止,就会抛出异常。可以使用重载的divide(BigDecimal d,小数点后位数,除数)
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(fact(50));//返回50的阶乘结果
//608281864034267560872252163321295376887552831379210240000000000
}
public static BigInteger fact(long x) {
BigInteger sum=BigInteger.ONE;//BigInteger.ONE=1;
for(int i=1;i<x;i++) {
sum=sum.multiply(new BigInteger(i+""));//使用multiply做乘法
}
return sum;
}
五.String类
String 对象是不可改变的,字符串一旦建立,内容就不可改变
String类有13个构造方法和多个处理字符串的方法
char[] c= {
'j','a','v','a'};
String s=new String(c);
System.out.println(s);//java
String s1="welcome";//创建了一个对象,将Welcome放入了常量池中
String s2=new String("welcome");//新的对象 如果常量池中不存在welcome,则词语局创建了两个对象,分别是将Welcome放入常量池中,将new的对象放入堆中
String s3="welcome";//和s1指向同一个地址
System.out.println(s1==s2);//false
System.out.println(s1==s3);//true
字符串中常用方法:
String s="hello java";
System.out.println(s.replace('a', 'e'));//hello jeve
System.out.println(s.replaceFirst("l", "y"));//heylo java
System.out.println(s.replaceAll("l", "y"));//heyyo java
String[] list=s.split("o");
for(String i:list)
System.out.print(i+" ");//hell java
六.正则表达式
正则表达式:用某个模式来匹配、替换和分割一个字符串
将字符串转为字符数组:
String s="hello java";
char[] a=s.toCharArray();
for(char i:a)
System.out.print(i+" ");//h e l l o j a v a
将数组转为字符串
上文中有提到
通常使用matches、replace、replaceAll等方法,建议面向百度编程,更加全面
七.StringBuilder和StringBuffer类
1.可以给StringBuilder和StringBuffer类添加、插入、追加新的内容
2.StringBuffer适合执行多任务并发时,因为它修改缓冲区是同步的,而StringBuilder执行单任务效率更高,剩余两个一模一样
3.StringBuilder有3个构造方法和30多个处理字符串的方法
StringBuilder s=new StringBuilder();//创建一个容量为16的空字符串构造器
StringBuilder s2=new StringBuilder(20);//指定容量
StringBuilder s3=new StringBuilder("hello java");//指定字符串
System.out.println(s.capacity());//16
System.out.println(s2.capacity());//20
提示:
如果一个字符串不需要改变,则用String,因为String优化共享字符串
在计算机中字符串构造器就是字符数组,构造器的容量就是数组的大小,如果超出容量,就会创建一个容量为2*(现有容量+1)的数组
如果容量过大,可以使用trimToSize()将容量降到实际大小
下面这个案例可以看到字符串和它的倒置竟然相等!!!
StringBuilder s=new StringBuilder("java is fun");
System.out.println(s.reverse());//nuf si avaj
System.out.println(s.equals(s.reverse()));//true
原因是StringBuilder没有没有重写equals方法,而总是指向原先的对象
需要加toString方法来实现比较
System.out.println(s.toString().equals(s.reverse().toString()));//false
StringBuilder的其他方法就不过多介绍了,今后也会经常使用
[后期补充]-2020-03-06
1.String类的内容不会改变
StringBuilder可以动态构造字符串,线程不安全
StringBuffer可以动态构造字符串,线程安全
2.三者在速度和占用内存方面的比较
速度:StringBuilder>StringBuffer>String
内存:String>StringBuffer>StringBuilder
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder s = new StringBuilder();
long remain1 = Runtime.getRuntime().freeMemory();// 剩余内存
long begin = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
s.append(i);
}
long end = System.currentTimeMillis();
long remain2 = Runtime.getRuntime().freeMemory();// 字符串拼接完成后剩余内存
System.out.println("使用毫秒数:" + (end - begin) + "\t使用内存:" + (remain1 - remain2));
//结果:StringBuilder:使用毫秒数:10 使用内存:1032240
//StringBuffer:使用毫秒数:12 使用内存:1032240
//String:使用毫秒数:4196 使用内存:-114659128
}
3.使用场景:
- 少量数据并字符串不会改变——String
- 单线程操作字符串缓冲区下操作大量数据——StringBuilder
- 多线程操作字符串缓冲区下操作大量数据——StringBuffer
八.总结
通过本章学习,我知道了面向对象的特点和类的四种关系,学会了基本类型和包装类型的互相转化,学会了自动装箱与拆箱,学会了BigInteger类和BigDecimal类基础的用法,学到了String类对字符串的处理和存储机制,学到了StringBuilder和StringBuffer的区别和相同点,对字符串可以说是全方位服务,和String类各有千秋,正则表达时在本章只是提了一下,这是一块非常实用的功能,奈何本人能力有限,顾虑讲解不够全面,大家大可面向百度编程此方面内容,量大全面。
加油!第十一章待更……