java.lang
枚举
枚举的概念
我们很多现实中的对象,它们的属性其实是固定的.比如:一年里面有春/夏/秋/冬.再比如一年有多少节气?24个也是固定的.那么在我们Java就可以使用枚举来表示它.
定义一个枚举类(enum)
package day09.demo;
public enum WeekEnum { //关于一周的枚举类.
SUNDAY,MONDAY,TUESDAY,WENDESDAY,THRUSDAY,FRIDAY,SATURDAY;
}
package day09.demo;
public class TestWeekEnum {
public static void main(String[] args) {
System.out.println(WeekEnum.MONDAY);
}
}
enum 它和class/inteface这些同级的.
成员变量 成员方法和构造器
可以有成员变量/方法及类构造器.但构造器必须是私有的
package day09.demo;
public enum WeekEnum { // 关于一周的枚举类.
SUNDAY("周末"), MONDAY("周一"), TUESDAY("周二"), WENDESDAY("周三"),
THRUSDAY("周四"), FRIDAY("周五"), SATURDAY("周六");
private String date; // 枚举类中可以有成员变量
public String getDate() { // 可以有成员方法
return date;
}
public void setDate(String date) {
this.date = date;
}
private WeekEnum(String date) { // 枚举类的构造方法必须为私有的.
this.date = date;
}
}
package day09.demo;
public class TestWeekEnum { //调用测试
public static void main(String[] args) {
System.out.println(WeekEnum.MONDAY);
System.out.println(WeekEnum.FRIDAY);
WeekEnum.FRIDAY.setDate("星期五");
}
}
常用的方法
compareTo
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.MONDAY)); //比较 4
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY));//-1
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SUNDAY)); //根据定义的顺序 5
values
for(WeekEnum we:WeekEnum.values()) {
System.out.println(we);
}
@Override
public String toString() { //编写了toString()方法对values会有一定的变化.
return date;
}
ordinal
System.out.println(WeekEnum.SUNDAY.ordinal()); //顺序,0
System.out.println(WeekEnum.MONDAY.ordinal()); //1
System.out.println(WeekEnum.FRIDAY.ordinal()); //5
枚举和接口
枚举就是一个特别的类,所以类能够继承接口,枚举也可以.
package day09.demo;
public interface WEDescription {
public void info(); //提示信息接口
}
package day09.demo;
public enum WeekEnum implements WEDescription{ // 关于一周的枚举类.
SUNDAY("周末"), MONDAY("周一"), TUESDAY("周二"), WENDESDAY("周三"),
THRUSDAY("周四"), FRIDAY("周五"), SATURDAY("周六");
private String date; // 枚举类中可以有成员变量
public String getDate() { // 可以有成员方法
return date;
}
public void setDate(String date) {
this.date = date;
}
private WeekEnum(String date) { // 枚举类的构造方法必须为私有的.
this.date = date;
}
@Override
public String toString() { //编写了toString()方法对values会有一定的变化.
return date;
}
@Override
public void info() {
System.out.println("这是一个关于一周的枚举类");
}
}
//调用
WeekEnum.MONDAY.info();
WeekEnum.TUESDAY.info();
包含抽象方法的枚举类
package day09.demo;
public enum Operation {
PLUS {
@Override
public double calculate(double x, double y) {
return x+y;
}
},MINUS {
@Override
public double calculate(double x, double y) {
return x-y;
}
},MULTI {
@Override
public double calculate(double x, double y) {
return x*y;
}
},DIVIDE {
@Override
public double calculate(double x, double y) {
return x/y;
}
};
public abstract double calculate(double x,double y); //定义了一个计算的抽象接口
}
//测试
package day09.demo;
public class TestOperation {
public static void main(String[] args) {
System.out.println(Operation.PLUS.calculate(8, 5));
System.out.println(Operation.DIVIDE.calculate(8, 4));
}
}
作业
请同学根据节气,编写节气的枚举类,要求有info接口.要能够打印中文的节气名.
异常处理
异常的概念(Exception)
指我们程序运行时发生的不正确的事情.这种可以被我们的程序所处理.保证我们的程序可以一直运行下去.
比如
- 除以0
- 文件没有找到
- 类型不匹配
运行时异常
java.lang.RuntimeException
非检测异常,这些异常在编译的时候不检查,程序中可以选择处理也可以不处理.如果不处理的话,运行时会中断.但是编译没有问题.
非运行时异常
检测异常,必须进行处理的异常.不处理,发生编译期错误.
错误(Error)
程序没法处理的异常.发生错误以后,虚拟机就会选择终止程序的运行.比如虚拟机的内存溢出.
常见异常
NullPoniterException
public static void main(String[] args) {
String s=null;
System.out.println(s.length());
}
ArithmeticException
public static void main(String[] args) {
int i=0;
System.out.println(100/i);
}
IndexOutOfBoundsException
public static void main(String[] args) {
int[] a=new int[3];
System.out.println(a[a.length]);
String s="hello";
System.out.println(s.charAt(s.length()));
}
NumberFormatException
public static void main(String[] args) {
String s="abc";
System.out.println(Integer.parseInt(s)); //字符串转整形,会报错.
}
ClassCastException
public static void main(String[] args) {
Object o=new Object();
String s=(String)o;
}
捕捉异常
try{
//可能出错的语句
}catch(Exceptin e){
//捕捉对应的错误
}finally{ //不是必须写的.
//捕捉错误以后最后的处理语句
}
示例
public static void main(String[] args) {
int x = 100;
int y = 0;
Object o = new Object();
try {
System.out.println("x/y=" + x / y); //一旦出错了程序会跳转到catch中,并且在catch中执行完语句以后,不会再返回try
String s = (String) o;
System.out.println("try字段结束了"); //出错后,try字段中的语句不再执行.
} catch (ArithmeticException e) {
System.out.println("发生数学错误,不能除以0");
//System.out.println(e.getMessage());
//System.out.println(e.getLocalizedMessage());
e.printStackTrace();
} catch (ClassCastException e3) {
System.out.println("发生了类转换错误");
} catch (NullPointerException e1) {
System.out.println("空指针错误");
} catch (Exception e2) { // 捕捉错误有顺序.
System.out.println("出错了");
} finally { //捕捉对象后一定会被执行的语句.
System.out.println("这是finally语句");
}
System.out.println("错误执行完了."); //这句话在try的代码段外面,所以会继续执行.
}
作业:编写一个方法,返回一个整数.在该方法中,故意出错,在catch和finally返回不同的int值,看结果.
抛出错误
throws
声明抛出的错误让调用的程序段处理
public class ThrowDemo {
public static void main(String[] args) throws FileNotFoundException {
ThrowDemo throwDemo=new ThrowDemo();
throwDemo.doSomething();
}
public void doSomething() throws FileNotFoundException {
FileReader fr=new FileReader(new File("a.txt"));
}
}
throw
抛出错误
public static void main(String[] args) throws FileNotFoundException {
ThrowDemo throwDemo=new ThrowDemo();
if(throwDemo.i<18)
try {
throw new Exception("这是我自定义的错误");
} catch (Exception e) {
System.out.println(e.getMessage());
}
throwDemo.doSomething();
}
自定义错误
package day10;
public class NotTooOldException extends Exception{
public NotTooOldException() {
}
public NotTooOldException(String errorMessage) {
super(errorMessage);
}
}
try {
//throw new Exception("这是我自定义的错误");
throw new NotTooOldException("你不到18岁,不能参加非诚勿扰!");
} catch (NotTooOldException e) {
System.out.println(e.getMessage());
}
Log4J
作用
记录日志
使用
1. 下载Jar包
百度搜:maven log4j->下载对应jar
2. 添加到工程中
- 添加到自定义的用户库
- 直接拷贝复制,并添加到Build Path
3. 在src中创建配置属性文件
log4j.properties
4. 创建Logger对象
static Logger logger = Logger.getLogger(Log4JDemo.class.getName());
5. 记录日志
logger.error("除以0错误!");
logger.debug("除以0错误!");
logger.info("除以0错误!");
logger.warn("除以0错误!");
包装类
Java的基本类型:boolean/char/short/int/long/float/double/byte
对应的包装类
- Boolean
- Character
- Short
- Integer
- Long
- Float
- Double
- Byte
定义
Integer i1=new Integer(10);
常用的方法
parseXXX->字符串转换类型
String s="10";
int j=Integer.parseInt(s);
double k=Double.parseDouble(s);
toString->类型转字符串
String s1=i1.toString();
xxxValue()->包装类转成基本类型
Integer i1=new Integer(10);
int i2=i1.intValue();
Double d1=new Double(10);
double d2=d1.doubleValue();
装箱和拆箱
- 装箱:把基本类型封装包装类
- 拆箱:把包装变成基本类型
从JDK1.5开始,Java自动装箱和拆箱.
Integer i3=10; //装箱.
int i4=i3; //拆箱
面试题目
1. 自动装箱第一题
//创建了新的对象,引用不同.==符号回去判断引用的地址是否相同.所以不相等.
Integer i5=new Integer(300);
Integer i6=new Integer(300);
System.out.println(i5==i6); //false
Integer i7=new Integer(100);
Integer i8=new Integer(100);
System.out.println(i7==i8); //false
Integer i9=100; //自动装箱
Integer i10=100;
System.out.println(i9==i10); //true
// Integer.valueOf(100); 自动装箱的方法
Integer i11=300; //自动装箱
Integer i12=300;
System.out.println(i11==i12); //false
2. 面试题二
Double d3=100.0;
Double d4=100.0;
System.out.println(d3==d4); //false
//Double.valueOf(100.0); 自动装箱方法
3. 面试题三
package day10;
public class KengDemo {
public static void main(String[] args) {
Integer a=1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e=321;
Integer f=321;
Long g= 3L;
Long h= 2L;
System.out.println(a==b); //false
System.out.println(e==f); //false
System.out.println(c==(a+b)); //true,自动转成基础类型进行比对
System.out.println(c.equals(a+b)); //true
System.out.println(g==(a+b)); //true
System.out.println(g.equals(a+b)); //false equals会先比对类型,再比对值.
System.out.println(g.equals(a+h)); //true int+long=long
}
}
Math
常用的方法
1. abs
System.out.println(Math.abs(-1));
2. ceil
System.out.println(Math.ceil(4.7)); //比它大的最小的整数 5
3.floor
System.out.println(Math.floor(4.7)); //比它小的最大的整数 4
4. max
System.out.println(Math.max(4.7, 3.9)); //求最大值 4.7
5. min
System.out.println(Math.min(4.7, 3.9)); //求最小值 3.9
6. random
System.out.println(Math.random()); //随机数[0-1)之间
7. round
System.out.println(Math.round(4.7)); //四舍五入
8. pow
System.out.println(Math.pow(2, 3)); //2的3次方
String
定义
String s1="abcdefg";
String s2=new String("abcdefg");
常用的方法
1. charAt
System.out.println(s1.charAt(0)); //返回指定位置的字符
2.concat
System.out.println(s1.concat(s2)); //在末尾连接字符串
3. indexOf
System.out.println(s1.indexOf("bcd")); //查找bcd字符串在s1中出现的位置 答案1
System.out.println(s1.indexOf("abd")); //找不到,返回-1
4. length
System.out.println(s1.length()); //7
5. replace
System.out.println(s1.replace("bc", "cb"));//替换,第一个参数为旧的字符串,第二个参数为新的字符串
6. substring
System.out.println(s1.substring(3)); //截取字符串defg
System.out.println(s1.substring(3, 4)); //d
7. trim
String s3=" as a part ";
System.out.println(s3.trim()); //裁剪前后位置的空格
作业
要求定义一个字符串,比如”328103”,不适用Integer.parseInt的方法,将它转换为int.
提示:可以使用switch…case.