Java
内部类
-
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)
-
public class People{ //内部类 public class Heart{ } }
使用场景,作用
- 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的王正结构可以选择使用内部类来设计
- 内部类通常可以方便访问外部类的成员,包括私有的成员.
- 内部类提高了更好的封装性,内部类本身就可以用private , protected等等修饰,封装性可以做更多控制
heart 心
静态内部类
-
有static修饰,属于外部类本身
-
它的特点和使用与普通类是完全一样的,,另类有的成分它都有,只是位置在别人里面而已
-
public class Outer{ //静态成员内部类 public static class Inner{ } }
-
静态内部类创建对象的格式
-
外部类名.内部类名 对象名 = new 外部类名.内部类构造器; Outer.Inner in = new Outer.Inner();
-
可以直接访问外部类的静态成岩,不能直接访问外部类的实例成员
-
注意:开放中实际上用的还是比较少
成员内部类
-
无static修饰,属于外部类的对象
-
JDK16之前,成员内部类中不能定义静态成员变量,JDK16开始也可以定义静态成员了.
-
public class Outer{ //成员内部类 public class Inner{ } }
-
静态内部类创建对象的格式
-
外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器; Outer.Inner in = new Outer().new Inner();
-
可以直接访问外部类的静态成岩,实例方法中也可以直接访问外部类的实例成员
-
注意:在成员内部类中访问所在外部类对象,格式:外部类名.this
局部内部类(鸡肋语法,了解即可)
- 局部内部类放在方法,代码块,构造器等执行体中
- 局部内部类的类名文件名为:外部类$N内部类.class
匿名代码类
- 本质上是一个没有名字的局部内部类,定义在方法中,代码块中等,
- 作用 : 方便创建子类对象,最终目的为了简化代码编写
格式:
new 类|抽象类名|接口名{
重写方法
}
Employee a = new Employee(){
public void work{
}
};
a.work();
anonymous 匿名的
特点总结
- 匿名内部类是一个没有名字的内部类
- 匿名内部类写出来就会产生一个匿名内部类的对象
- 匿名内部类的对象类型相当于是当前new的那个的类型的子类类型
API
Object
作用
- 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类
- Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法
常用方法
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public Boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
toString()方法
直接输出对象可以不写.toString()方法意思一样
存在意义是为了被子类重写,以便返回对象发内容详细,而不是地址信息!!!
equals()方法
- 默认是与另一个对象比较地址是否一样
- 让子类重写,以便比较2个子类对象的内容是否相同
Objects
- Objects类与Object类还是继承关系,Object类是从JDK1.7开始之后才有的
- Objects的equals方法比较的结果是一样的,但是更安全
方法名 | 说明 |
---|---|
public static boolean equals(Object a,Object b) | 比较两个对象的,底层会先金兴非空判断,从而可以避免空指针异常,在进行equals比较 |
public static boolean isNull(Object obj) | 判断变量是否为NULL,为NULL返回true,反之 |
equals()方法
//源码
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
StringBuilder
- StringBuilder 是一个可变的字符串类,我们可以把他看成是一个对象容器
- 作用:提高字符串的操作效率,如拼接,修改等
构造器
名称 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
常用方法
方法名称 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int lenght() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
math
- 包含执行基本数字运算的方法,Math类没有提供公开的构造器
- 如何使用Math类中方法
- 看类的成员是否都是静态的,如果是,通过类名就可以直接调用
常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) | 获取参数绝对值 |
public static double(double a) | 向上取整 |
public static double(double a) | 向下取整 |
public static int round(float a) | 四舍五入 |
public static int max(int a,int b) | 获取两个int值中的较大值 |
public static double pow(double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的随机数,范围[0.0,1.0).包前不报后 |
System
- System的功能是通用的,都是直接用类明调用即可,所以System不能被实例化
常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的Java虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式 |
public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) | 数组拷贝 |
时间毫秒值
- 计算机任务时间是有起点的,起始时间:1970年1月1日 00:00:00
- 时间毫秒值:指的是从1970年1月1日 00:00:00 走到此刻的总的毫秒数,应该是很大的.1s=1000ms
- 197年1月1日算C语言的生日
BigDecima
使用步骤
- 创建对象BigDecimal封装浮点型数据,(最好的方式是调用方法)
常用API
方法名 | 说明 |
---|---|
public BigDecimal add(BigDecimal b) | 加法 |
public BigDecimal subtract(BigDecimal b) | 减法 |
public BigDecimal multiply(BigDecimal b) | 乘法 |
public BigDecimal divide(BigDecimal b) | 除法 |
public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式) | 除法 |
Data
- Data类的对象在Java中代表当前所在系统的此刻日期时间
构造器
名称 | 说明 |
---|---|
public Date() | 创建一个Date对象,代表是系统当前此刻日期时间 |
常用方法
名称 | 方法 |
---|---|
public long getTime() | 获取时间对象毫秒值 |
时间毫秒值转成日期对象
构造器 | 说明 |
---|---|
public Date(long time) | 把时间毫秒值转成Data日期对象 |
Data方法 | 说明 |
---|---|
public void setTime(long time) | 设置日期对象的时间为当前毫秒值对应的时间 |
案例
计算出当前时间往后走1小时121秒之后的时间是多少
package com.yu.SingleInstance;
import java.util.Date;
/**
* 计算出当前时间往后走1小时121秒之后的时间是多少
*/
public class DateTest {
public static void main(String[] args) {
//显示当前时间
Date start = new Date();
System.out.println(start);
//计算1小时121秒是多少毫秒
long time =(60*62+1)*1000;
//计算当前时间的毫秒值
long start1 = System.currentTimeMillis();
//计算当前时间往后走1小时121秒之后的时间
Date endtime = new Date(time+start1);
//显示当前时间往后走1小时121秒之后的时间
System.out.println(endtime);
}
}
SimpleDateFormat
- 可以对Date对象或手机毫秒值格式化成我们喜欢的时间形式
- 也可以把字符串的时间形式解析成日期对象
SimpleDateFormat 的构造器
构造器 | 说明 |
---|---|
public SimpleDateFormat() | 构造一个SimpleDateFormat,使用默认格式 |
public SimpleDateFormat(String pattem) | 构造一个SimpleDateFormat,使用指定的格式 |
SimpleDateFormat 的常用方法
格式化方法 | 说明 |
---|---|
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public final String format(Object time) | 将时间毫秒值格式化成日期/时间字符串 |
- y 年
- M 月
- d 日
- H 时
- m 分
- s 秒
package com.yu.SingleInstance;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 请计算出2021年08月06日11点11分11秒,往后走2天14小时49分06秒的时间是多少
*/
public class mianshiti {
public static void main(String[] args) {
//创建格式,计算出出2021年08月06日11点11分11秒时间毫秒值
String time = "2021年08月06日11点11分11秒";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH点mm分ss秒");
try {
//转换成Date对象值
Date start = sdf.parse(time);
System.out.println(sdf.format(start.getTime()));
//计算出2天14小时49分06秒毫秒值,加个L防止数字过大超过long类型数据
long out = (2L*24*60*60+14*60*60+49*60+6)*1000;
//两者相加,计算往后走2天14小时49分06秒的时间是多少
start.setTime(out+start.getTime());
//格式化输出
System.out.println(sdf.format(start));
//默认格式输出
System.out.println(start);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Egg tart 蛋挞
package com.yu.SingleInstance;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class EggTart {
public static void main(String[] args) {
//设计时间标准输入格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//开始时间
String start = "2020年11月11日 00:00:00";
try {
//开始时间转为Date类型
Date starttime = simpleDateFormat.parse(start);
//结束时间
Date endtime = new Date();
//忘记转换为毫秒值
long ten = 10*60*1000;
// 计算出结束时间
endtime.setTime(starttime.getTime()+ten);
//小贾购买优惠劵时间
Date xiaoj = simpleDateFormat.parse("2020年11月11日 00:03:47");
//小皮购买优惠劵时间
Date xiaop = simpleDateFormat.parse("2020年11月11日 00:10:11");
// System.out.println(simpleDateFormat.format(starttime));
// System.out.println(simpleDateFormat.format(endtime));
// System.out.println(simpleDateFormat.format(xiaoj));
// System.out.println(simpleDateFormat.format(xiaop));
if(xiaoj.getTime()>=starttime.getTime() && xiaoj.getTime()<=endtime.getTime()){
// System.out.println(xiaoj.getTime()+" "+starttime.getTime()+" "+endtime.getTime()+(xiaoj.getTime()>=starttime.getTime() && xiaoj.getTime()<=endtime.getTime()));
System.out.println("小贾参加了秒杀活动!");
}else{
// System.out.println(xiaoj.getTime()+" "+starttime.getTime()+" "+endtime.getTime()+(xiaoj.getTime()>=starttime.getTime() && xiaoj.getTime()<=endtime.getTime()));
System.out.println("小贾没有参加了秒杀活动!");
}
if(xiaop.getTime()>=starttime.getTime()&&xiaop.getTime()<=endtime.getTime()){
System.out.println("小皮参加了秒杀活动!");
}else{
// System.out.println(xiaop.getTime()+" "+starttime.getTime()+" "+endtime.getTime()+(xiaop.getTime()>=starttime.getTime() && xiaop.getTime()<=endtime.getTime()));
System.out.println("小皮没有参加了秒杀活动!");
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
after 之前
before 之后
Calendar
Calendar日历类
- Calendar代表了系统此刻日期的日历对象
- Calendar是一个抽象类,不能直接创建对象
创建日历对象的方法
方法名 | 说明 |
---|---|
public static Calendar getInstance() | 获取当前日历对象 |
常用方法
方法名 | 说明 |
---|---|
public int get(int field) | 取日期中的某个字段信息 |
public void set(int field,int value) | 修改日历某个字段信息 |
public void add(int field,int amount) | 为某个字段增加/减少指定值 |
public final Date getTime() | 拿到此刻日期对象 |
public long getTimeInMillis() | 拿到此刻时间毫秒值 |
注意
calendar 是可变日期对象,一旦秀爱后其对象本身表示的时间将产生变化