枚举是一类常量的集合。枚举属于一种特殊的类,里面只包含一组有限的特定对象。
将构造器私有化,防止直接new->去掉setXxx方法,防止属性被修改->在类内部直接创建固定对象。
1.不需要提供setXxx方法,因为枚举对象值通常为只读。
2.对枚举对象/属性使用 final+static 共同修饰,实现底层优化。
3.枚举对象名通常使用全部大写,常量的命名规范。
4.枚举对象根据需要,也可以有多个属性。
enum替代class -> 直接使用 常量名(实参列表) -> 如果有多个常量,使用”,“间隔即可。
如果使用enum 来实现枚举类,要求将常量对象写在最前面。
1. 当我们使用enum 关键字开发一个枚举类时,默认继承 Enum类。并且是final类。
2.如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略。
3.当有多个枚举对象时,使用,间隔。最后有一个分号结尾。
4.枚举对象啊你给i必须放在枚举类的行首。
values 返回枚举类的数组,含有定义的所有枚举对象。
1.使用enum关键字后,就不再继承其他类了,因为enum会隐式继承Enum,而java是单继承机制。
2.enum实现的枚举类,仍然是一个类,所以还是可以实现接口的。
使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素。
三个基本的注解(1)@Override:限定某个方法,是重写父类方法,该注解只能用于方法。(2)@ Deprecated:用于表示某个程序元素(类,方法等)已过时。(3)@SuppressWarnings:抑制编译器警告。
注:@interface不是注解,代表一个注解类。
1.如果没有写@Override方法代表仍重写了父类的方法。
2.如果写了@Override的注解,编译器就会去检查该方法是否真的重写了父类的方法。如果重写则编译通过,如果没有构成重写,则编译错误。
3.@Override只能修饰方法,不能修饰其他类,包,属性等。
4.@Target是修饰注解的注解,称为元注解。
1.@Deprecated修饰某个元素,代表该元素已经过时。
2.@Deprecated修饰的不推荐使用,但是仍然可以使用。
3.可以修饰类,方法,包,参数等。
4.@Deprecated的作用可以做到新旧版本的兼容和过渡。
1.当不希望看到一些警告时,可以使用@SuppressWarnings注解来抑制警告信息。
2.用法:@SuppressWarnings({" "})。“ ”里面可以添加警告类型。
警告类型:
4.关于@SuppressWarnings作用范围和放置的位置有关。
用于修饰其他注解。
java中,将程序执行中发生的不正常情况称为“异常”。 (开发过程中的语法错误和逻辑错误不是异常。)
如果认为一段代码可能出现异常,可以使用try-catch异常处理机制来处理。处理之后即使出现异常,程序也可以继续执行。
1.Error(错误):java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError【栈溢出】和OOM(out of memory),Error是严重错误,程序会崩溃。
2.Exception(异常):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问,试图读取不存在的文件,网络连接中断等,Exception分为两大类:运行时异常[程序运行时发生的异常]和编译时异常[编译程序时,编译器检测出的异常]。(运行时异常可以不做处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响)(编译时异常是编译器要求必须处理的异常)
1.NullPointerException 空指针异常:当应用程序试图在需要对象的地方使用null时,抛出该异常。
2.ArithmeticException 数学运算异常:当出现异常的运算条件时,抛出异常。例如:一个整数“除以零”时。
3.ArrayIndexOutOfBoundsException 数组下标越界异常:用非法索引访问数组时抛出的异常。
4.ClassCastException 类型转换异常:当试图将对象强制转换为不是实例的子类时,抛出该异常。
5.NumberFormatException 数组格式不正确异常:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时。
异常处理两种方式
1.try-catch-finally :程序员在代码中捕获发生的异常,自行处理。
2.throws :将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
try{
可能有异常的代码;
}catch(Exception e){
捕获到异常;//1.异常发生时系统将异常封装给Exception 对象e,传递给catch
// 得到异常处理后,程序员自己处理。
//如果没有发生异常catch代码块不执行
}finally{
// 不管try代码块是否有异常发生,始终要执行finally。
//所以通常将释放资源的代码,放在finally。
}
1.如果异常发生了,则异常后面发生的代码不会执行,直接进入到catch块。
2.如果异常没有发生,则顺序执行try的代码块,不会进入到catch。
3.如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally{}。
4.可以有多个catch异常,捕获不同的异常类型。要求子类异常写在前面,父类异常写在后面。
5.可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉。(应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑)
1.对于运行时异常,程序中如果没有处理,默认是throws。
2.父类重写子类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的子类型。
3.在thorws过程中,如果有方法try-catch ,就相当于异常处理,就可以不必throws。
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
定义类:自定义异常类名,继承Exception或RuntimeException。
如果继承Exception,属于编译异常。
如果继承RuntimeException,属于运行异常。(一般来说继承RuntimeException)
//自定义AgeException异常,输入年龄不属于18-80时,抛出异常
public class Test {
public static void main(String[] args) {
int age = 90;
if(!(age>=18 && age<=80)){
throw new AgeException("年龄需要在18~80之间!");
//这里可以通过构造器,设置信息
}
System.out.println("你的输入正确,年龄为:"+age);
}
}
class AgeException extends RuntimeException{
public AgeException(String message) {
super(message);
}
}
针对八种基本数据类型定义相应的引用类型--包装类。有了类的特点,就可以调用类中的方法。
虚线表示实现接口,实线代表继承。
jdk5前的手动装箱和拆箱方式。装箱:基本类型->包装类型。拆箱:反之。 jdk5之后(含)自动装箱和拆箱。
//手动装箱 int -> Interget
int n1 = 100;
Integer integer = new Integer(n1);
//或者
Interger integer1 = Integer.valueOf(n1);
//手动拆箱 Integer -> int
int i = integer.intValue();
//自动装箱
Integer integer2 = n1; //底层使用的还是 Integer.valueOf(n2)
//自动拆箱
int n3 = integer2; //底层仍然使用的是intValue()方法。
String对象用于保存字符串,也就是一组字符序列。字符串常量对象是用双引号括起来的字符序列。字符串的字符只用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
String实现了Serializable ,说明String可以串行化(可以在网络传输)。
String实现了Comparable接口,说明String对象可以比较。
1.String类有很多构造器,构造器的重载。
2. String是final类,不能被其他的类继承。
3.String有属性 private final char value[]; 用于存放字符串内容。
一定要注意:value 是一个final类型,不可以修改。(指的是value不能指向新的地 址,但是单个字符内容可以变化)
4.
方式一:直接赋值 String s = "aaa";
方式二:调用构造器 String s2 = new String("aaa");
1.方式一:先从常量池中查看是否有“aaa”数据空间,如果有,直接指向;没有则创建,然后指向。s最终指向的是常量池的空间地址。
2.方式二:先在堆中创建空间,里面维护了value属性,指向常量池的aaa空间。如果常量池没有“aaa",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
例如:
如果两个常量相加 (String c = "a" + "b";)看的是池。 (String c1 = a + b;)变量相加,是在堆中。
String name = "hello,world"; name.substring(0,5);//截取name0到4的元素"hell"。
toUpperCase将字符串变成大写。toLowerCase将字符串变成小写。concat拼接字符串。
s11 = s.replace("a","b"):将s中a全部替换成b(这里只有返回值s11被替换,原来的s不变化)。
conpareTo 如果前者大,则返回正数。后者大,返回负数。相等,返回0。
String -> StringBuffer
方式一:使用构造器
String str = "hello,world";
SringBuffer stringBuffer = new StringBuffer(str);//注意对str本身没有影响。
方式二:使用append方法
StringBuffer stringBuffer = new StringBuffer();
stringBuffer = stringBuffer.append(str);
StringBuffer -> String
方式一:使用StringBuffer提供的toString方法
StringBuffer stringBuffer = new StringBuffer("hello,world");
String s = stringBuffer.toString();
方式二:使用构造器
String s = new String(stringBuffer);
一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类。因为在大多数实现中,它比stringBuffer更快。
random返回的是[0,1)之间的一个double数。所以(int)(a+Math.random()*(a-b+1))。返回的是a,b之间的。
binarySearch如果查找的数不存在,则返回 -(low+1);
Arrays.copy:如果拷贝的长度大于arr.length就在新数组的后面加null。如果arr.length<0就抛出异常。
fill:表示用99去替换所有元素。
BigInteger适合保存比较大的整型。
BigDecimal适合保存精度更高的浮点型(小数)。
在对 BigInteger类 进行加减乘除时,不能直接使用+-*/。要使用相对的方法。
add:加
subtract:减
multiply:乘
divide:除
对 BigDecimal类 进行进行加减乘除时,不能直接使用+-*/。要使用相对的方法。
add:加
subtract:减
multiply:乘
divide:除 //此方法可能会抛出异常,通过指定精度BigDecimal.ROUND_CEILING 。如果有无限循环小数,就会自动保留分子的精度。
第一代日期类。精确到秒,代表特定的瞬间。
SimpleDateFormat:格式和解析日期的类。它允许进行格式化(日期->文本)解析(文本->日期)和规范化。
1.Date date = new Date();
System.out.println(date); // 可以输出当前日期,日期格式是国外方式。
2.这里的Date是在java.util包。
3.对格式进行转换(换成国内格式)。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss E");// 参数列表终的字母是固定的,不能随便写。
String format = sdf.format(date); // format:将日期转换成指定格式的字符串
System.out.println(format); //可以按照当前国内格式日期输出
4.可以把一个格式化的String 转换成对应的Date。
String s = "相应格式的日期";
Date parse = sdf.parse(s);
System.out.println(sdf.format(parse)); // 这里的sdf格式需要和给的String格式一样。
第二代日期类,主要就是Calendar类(日历)。
1.Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等,日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
1.使用now()来返回当前日期。
LocalDateTime ldt = LocalDateTime.now(); // 获取 年月日时分秒
LocalDate ld = LocalDate.now(); // 获取 年月日
LocalTime ld = LocalTime.now(); // 获取 时分秒
2.使用 DateTimeFormatter 格式日期类,类似于SimpleDateFormat
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(上面的格式);
String format = drf.format(ldt); // 可以输出格式化的日期
3.Instant时间戳