一.内部类
1.定义:
在一类内部定义一个完整的类 比如身体的内部类头
2.特点:
- 内部类可访问外部类的私有成员 不破坏封装性
- 内部类也会生成.class文件
- 为外部类提供功能组件
成员内部类
1.内部类对象创造方法:
创建内部类对象时,必须依赖外部类对象。
Outer outer = new Outer();
Inner inner = outer.new Inner();
Inner inner1 = new Outer().new Inner();
2.注意:
- 成员内部类在类的内部定义,与实例变量,实例方法同级别的类
- 当内部类、外部类存在重名属性时,会优先访问内部类属性
- 内部类方法需要访问外部类同名属性,Outer.this.name
- 成员内部类不能定义静态成员static,可以包含静态常量static final
静态内部类(常用)
- 通过创建外部类对象访问外部类的静态成员
-
调用:Outer.Inner inner = new Outer.Inner(); inner.run();
- 只有内部类名前才能加static 普通类不能加
- 在成员内部类的基础上加一个static
局部内部类
- 定义在方法中,作用范围和创建对象仅限于当前的方法
- 不能加任何访问修饰符
- 调用局部内部类方法时候,在所属方法内创建对象并调用
- 方法内无法保障变量的生命周期 必须加final 不可以单加static
匿名内部类(常用):相当于创建一个局部内部类
- 没有类名,特征与局部内部类相同
- 必须继承一个父类或者实现一个接口
- 定义类,实现类,创建对象的语法合并,只能创建一个该类的对象。
- 在类的内部写 class x implements a{},可以创建它的对象
- 减少代码量,但可读性差
二.Object类
getclass()方法
获取对象所属的类
hashCode()方法
- 返回对象的哈希码值
- 相同对象返回相同哈希值
哈希值:根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值
toString()方法
- 默认情况返回对象类型和16进制的哈希值
- 可以重写
instanceof()方法
- 判断对象是否属于某种类型
equal()方法
- 看两个对象是否为同一个,通过比较地址是否相同
finalize()方法
三.包装类
对应类型
装箱和拆箱(类型转换)
定义:
- 装箱:将栈中数据拿到堆里,基本类型转为引用类型
- 拆箱:将堆中数据拿到栈中,引用类型转为基本类型
jdk1.5之前用的方式:
装箱
int num=18;
Integer integer = new Integer(num);
Integer integer1 = Integer.valueOf(num);
拆箱
Integer integer2 = new Integer(100);
int i = integer2.intValue();
jdk1.6后,自动装箱和拆箱( 通过调用valueof()方法 )
int age=30;
Integer integer=age;//装箱
int age1=integer; //拆箱
利用XJad以及idea可以将字节码文件反编译为,java文件
基本类型和字符串的转换
1.基本类型转换成字符串
int n1=100;
1.1 使用加号
String s1=n1+" ";
1.2 使用Integer中的toString()方法
String s2=Integer.toString(n1);
2.字符串转为基本类型
String str="150";
int n2=Integer.parseInt(str);
四.Integer缓存区
从-128到127已经在堆中的数组中缓存好,有的话直接将地址赋给栈中的变量(如代码中的100)
如此设计的目的,为了对创建的对象进行复用,减少内存消耗
五.String类
1.概述
- 字符串是常量,创建后不可修改
- 字符串字面值存储在字符串池中,可以共享
-
String name="hello"; 产生一个对象,字符串池存储 name="zhansan"; String name1="zhangsan";
- 第二种方式String s=new String("hello"); 产生两个对象,堆、池各存储一个
equals比较的是值 ,str==str2 比较的是地址
2.常用方法
- length() 返回字符串的 长度
- charAt(int index) 根据下表找对应位置的字符
- contains(String str) 判断是否包含某个子字符串
- toCharArray() 将字符串转为数组
- index of(String str) 查找str首次出现的下标 存在则返回下标 不存在 返回-1
- LastIndexOf(String str):查找字符串在当前字符串中最后一次出现得下标索引
- trim():去掉字符串前后的空格
- toUpperCase():把大写转成小写
- endWith(str) 是否以str结尾
- startWith(str):是否以str开头
- equals() 比较是否相同
- compareTo()从第一位往后逐个比较 位数相同对应位置求差 位数不同比长度
- split(“ ”)用空格将字符串分开
- replace()将字符串中得字符替换为目标字符,用该方法可以实现插入功能
六.可变字符串
1.StringBuffer
对象sb的重载方法
- append():追加
- insert(): 添加,可以控制添加的位置 传参(0,"我在最前面")
- replace() : 取代指定位置 传参(开始,结束,str)含头不含尾
- delete()
2.StringBuilder
用法与StringBuffer相同
共同特性:效率比String高 比String节省内存,比StringBuffer也高
速度比较举例:用String的拼接+=和StringBuilder的拼接99999,用时差异,比较出了速率
七.BigDecimal
1.问题举例
- double存的是近似值,精度要求不高,如0,9可能存储为0.8999999,bigdecimal可以更精确地处理浮点数
- double d1=0.9
- double d2=0.8
- d1-d2不等于0.1
2.bigdecimal
在需要精度要求比较高的时候,如银行类,则使用bigdecimal处理大的浮点数
3.具体应用
3.1
new BigDecimal(“1.0”)括号中需要传入字符串
3.2
方法 1.subtract:减法
2.add:加法
3.divide: 除法(除不尽的时候可能出现问题)可以在传参时候设置保留几位小数
4.multyple:乘法
八.Date类
方法
1.打印当前时间:Date类型的对象tostring方法
2.打印1970年到现在的毫秒数:getTime
3.比较之间前后:date.after(date1) date.before(date2)
4.比较毫秒值:date.compareTo(date2)
5.比较是否相等 date.equals()
九.Calendar类
方法
案例
十.SimpleDateFormat
1.方法
2.掌握
-
字符串转为日期
- 日期转为字符串
十一.System类
方法1:复制数组
- 将原数组按位置复制到目标数组:System.arraycopy(src,srcPos,dest,desPos,length)
-
// src 源数组 // srcPos 从哪个位置开始复制 // dest 目标数组 // desPos 目标数组的位置 // length 复制的长度
- Arrays.copyOf 用的就是System.arraycopy
举例
方法2:获取当前系统时间:
System.currentTimeMillis()
方法3:垃圾回收机制 System.gc();
- finalize() 垃圾回收时候执行的方法
方法4:退出jvm,不执行后续代码
十二:总结
静态内部类和匿名内部类较为常用