7.常用类
内部类
成员内部类、静态内部类、局部内部类、匿名内部类
什么是内部类
概念:在一个类的内部再定义一个完整的类
特点:1.编译之后可生成独立的字节码文件(Class文件)
2.内部类可直接访问外部类的私有(private)成员,而不破坏封装
3.可为外部类提供必要的内部功能组件
成员内部类
在类的内部定义,与实例变量、实例方法同级别的类
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
Outer out = new Outer();
Inner in = out.new Inner();
当外部类、内部类存在重名属性时,会优先访问内部类属性
内部类属性和外部类的属性名字相同,访问外部类的属性要使用Outer.this.
成员内部类不能定义静态成员,但可以定义静态常量(+final)
静态内部类
不依赖外部类对象,可以直接创建或通过类名访问,可声明静态成员
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
不能加任何访问修饰符(private等 )
局部变量需要设置为 final类型,jdk1.8自动设置
不能包含静态成员
private static int count = 2000;//报错
可以包含静态常量(+final)
private final static int count = 2000;
匿名内部类
没有类名的局部内部类(特征与局部内部类相同)
必须继承一个父类或者实现一个接口
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
优点:减少代码量
缺点:可读性较差
Object类
超类、基类,所有类的直接或间接父类,位于继承树的最顶层
任何类,如果没有书写extends显示继承某个类,都默认直接继承Objcet类,否则为间接继承
Objcet类中所定义的方法,是所有对象都具备的方法
Objcet类型可以存储任何对象:
1.作为参数,可以接受任何对象
2.作为返回值,可以返回任何对象
1.gatClass()方法
public final Class<?> getClass(){}
返回引用中存储的实际对象类型
应用:通常勇于判断两个引用中实际存储对象类型是否一致
2.hashCode()方法
public int hashCode(){}
返回该对象的哈希码值
哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值
一般情况下相同对象返回相同哈希码值
3.toString()方法
public String toString(){}
返回该对象的字符串表示(表现形式)
可以根据程序需求覆盖该方法,如:展示对象各个属性值
4.equals()方法
public boolean equals(Object obj){}
默认实现为(this == obj),比较两个对象地址是否相同
可进行覆盖,比较两个对象的内容是否相同
equals()方法覆盖步骤:
1.比较两个引用是否指向同一个对象
2.判断obj是否为null
3.判断两个引用指向的实际对象类型是否一致
4.强制类型转换
依次比较各个属性值是否相同
5.finalize()方法
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
垃圾对象:没有有效引用指向此对象时,为垃圾对象
垃圾回收:由GC销毁垃圾对象,释放数据存储空间
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
手动回收机制:使用System.gc();通知JVM执行垃圾回收
包装类
基本数据类型所对应的引用数据类型。
Object可统一所有数据,包装类的默认值是null。
| 基本数据类型 | 包装类型 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| boolean | Boolean |
| char | Character |
类型转换与装箱、拆箱
装箱:基本类型→引用类型(栈→堆)
拆箱:引用类型→基本类型(堆→栈)
8种包装类提供不同类型间的转换方式:
Number父类中提供的6个共性方法
parseXXX()静态方法:基本类型和字符串转换
valueOf()静态方法:引用类型→基本类型
注意:需保证类型兼容,否则抛出NumberFormatException异常
整数缓冲区
java预先创建了256个常用的整数包装类型对象
在实际应用中,对已经创建的对象进行复用
String
字符串是常量,创建之后不可以改变
字符串字面值存储在字符串池中,可以共享
String s = "Hello"; //产生一个对象,字符串池中存储
String s = new String("Hello"); //产生两个对象,堆、池各存储一个
String常用方法
public int length() :返回字符串长度
public char charAt(int index) :根据下标获取字符
public boolean contains(String str) :判断当前字符串中是否包含str
public char[] toCharArray() :将字符串转换成数组
public int indexOf(String str) :查找str首次出现的下标,存在,则返回该下标,不存在则返回-1
public int lastIndexOf(String str) :查找str在当前字符串中最后一次出现的下标
public String trim() :去掉字符串前后的空格
public String toUpperCase() :将小写转成大写
public boolean endWith(String str) :判断字符串是否以str结尾
public String replace(char oldChar,char newChar) :将旧字符串替换成新字符串
public String[] split(String str) :根据str做拆分
String案例演示
需求:
1.已知String str = "this is a text";
2.将str中的单词单独获取出来
3.将str中的text替换为practice
4.在text前面插入一个easy
5.将每个单词的首字母改为大写
public class Example {
public static void main(String[] args) {
String str = "this is a text";
// 2.将str中的单词单独获取出来
String[] arr = str.split(" ");
for (String s : arr){
System.out.println(s);
}
// 3.将str中的text替换为practice
String str2 = str.replace("text","practice");
System.out.println(str2);
// 4.在text前面插入一个easy
String str3 = str.replace("text","easy text");
System.out.println(str3);
// 5.将每个单词的首字母改为大写
for (int i = 0; i < arr.length; i++) {
char first = arr[i].charAt(0);
char upperfirst = Character.toUpperCase(first);
String news = upperfirst+arr[i].substring(1);//substring(1)从角标为1的位置截取
System.out.println(news);
}
}
}
可变字符串
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
StringBuilder:可变长字符串,JDK5.0提供,运行效率块,线程不安全
BigDecimal
位置:Java.math包中
作用:精确计算浮点数
创建方式:BigDecimal bd = new BigDecimal("1.0");
Date
Date表示特定的瞬间,精确到毫秒。
Date类中的大部分方法都已经被Calentar类中的方法所取代
时间单位:
1秒=1000毫秒
1毫秒=1000微秒
1微妙=1000纳秒
Calendar
Calendar提供了获取或设置各种日历字段的方法
构造方法:
protected Calendar() :由于修饰符似乎protected,所以无法直接创建该对象
其他方法:

import java.util.Calendar;
import java.util.Date;
public class Demo1 {
public static void main(String[] args) {
//1.创建Calendar对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
System.out.println(calendar.getTimeInMillis());
//2.获取时间信息
//获取年
int year = calendar.get(Calendar.YEAR);
//月
int month = calendar.get(Calendar.MONTH);
//日
int day = calendar.get(Calendar.DAY_OF_MONTH);//Date
//小时
int hour = calendar.get(Calendar.HOUR_OF_DAY);//HOUR12小时。HOUR_OF_DAY24小时
//分钟
int minute = calendar.get(Calendar.MINUTE);
//秒
int second = calendar.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour+":"+minute+":"+second);
//3.修改时间
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH,11);
System.out.println(calendar2.getTime().toLocaleString());
//4.add方法修改时间
calendar2.add(Calendar.HOUR_OF_DAY,1);//在现在时间基础上加1小时
System.out.println(calendar2.getTime().toLocaleString());
//5.补充方法
int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);//当前月最后一天
int min = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);//当前月第一天
System.out.println(max);
System.out.println(min);
}
}
SimpleDateFormat
SimpleDateFormat是一共以与语言环境有关的方式来格式化和解析日期的具体类
进行格式化(日期 - > 文本)、解析(文本 - > 日期)
常用的时间模式字母

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo1 {
public static void main(String[] args) throws ParseException {
//1.创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
//2.创建Date
Date date = new Date();
//格式化Date(把日期转成字符串)
String str = sdf.format(date);
System.out.println(str);
//解析(把字符串转成时间)
Date date1 = sdf.parse("1990年05月11日11:11:11");
System.out.println(date1);
}
}
System类
System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有

总结
内部类:在一个类的内部再定义一个完整的类
成员内部类、静态内部类、局部内部类、匿名内部类
Object类:所有成员的直接或间接父类,可存储任何对象
包装类:基本数据类型所对应的引用数据类型,可以使Object统一所有数据
String类:字符串是常量,创建后不可改变,字面值保存在字符串池中,可以共享
BigDecimal:可精确计算浮点数
Date:特定时间
Calendar:日历
SimpleDateFormat:格式化时间
System:系统类

浙公网安备 33010602011771号