枚举
需求引入
商家卖馅饼
买家买馅饼
public class Pie {
String name;
double price;
public Pie() {
}
public Pie(String name, double price) {
this.name = name;
this.price = price;
}
}
// 客户类
Pie pie = new Pie("龙肉",10); // 去执行的 Pie 的有参构造方法
// 不能被自定义的创建对象
将构造方法私有化, 不允许外界创建对象
public class Pie {
/* 枚举的本质 */
public static final Pie pie1 = new Pie("牛肉",5);
public static final Pie pie2 = new Pie("里脊肉",4);
public static final Pie pie3 = new Pie("鸡肉",3);
public static final Pie pie4 = new Pie("韭菜鸡蛋",2);
String name;
double price;
private Pie() {
}
private Pie(String name, double price) {
this.name = name;
this.price = price;
}
}
把构造私有化 , 不允许外界创建对象, 在类的内部自己创建对象
外界可以调用类中已经创建好的对象, 仅仅是希望外界访问,但是不允许修改
最好把该类对象 创建为 public static final
星期, 人的性别
public class Gender {
public static final Gender MALE = new Gender("男");
public static final Gender FEMALE = new Gender("女");
String name; // 性别名称
private Gender() {
}
private Gender(String name) {
this.name = name;
}
}
public class Person {
String name;
int age;
// 给人设为固定性别
Gender gen;
}
星期
public class Week {
public static final Week MON = new Week("星期一");
public static final Week TUE = new Week("星期二");
public static final Week WED = new Week("星期三");
// ...
String name;
private Week(String name) {
this.name = name;
}
}
简化为
public Enum Week{
MON,TUE,WED // ,...
}
概念
由一组固定的常量组成的类型
比如 中国 34个省
一年有4 个季节, 12 个月份
一周有7 天
公司 中有一些领导者 一般也不会变动
案例
使用枚举输出每周 日程安排
public enum Week {
MON,TUE,WED,THU,FRI,SAT,SUN
//相当于
// public static final Week MON = new Week();
}
public class WeekDemo {
public static void main(String[] args) {
weekTest(Week.MON);
}
public static void weekTest(Week day){
switch(day){
// MON,TUE,WED,THU,FRI,SAT,SUN
case MON :
case TUE :
case WED :
case THU :
case FRI :
System.out.println("努力工作, 天天向上!");
break;
case SAT :
case SUN :
System.out.println("周末好好休息!");
break;
default:
System.out.println("填写错误!");
break;
}
}
}
优势
- 可以使代码更易维护, 有助于确保为变量指定的值, 是合法的, 期望的
- 枚举类型 是对一组常量类型的简化
- 代码更清晰, 允许使用描述性的名称来标识数据
拓展
枚举也可以拥有参数
public enum Pie {
P1("牛肉"),P2("猪肉");
String name;
private Pie() { }
private Pie(String name){
this.name = name;
}
}
API
全称 Java Application Programming Interface
java 应用 编程 接口
java 预先定义的运行库集合, 程序员可以直接使用这些打包好的类和接口
API 编程文档 帮助文档
包装类
java 是一门纯面向对象的语言 , 基本数据类型也是对象
在实际开发中, 对基本数据类型的操作非常多, 按照对象的方式操作, 很多的不方便的地方, 把基本数据类型从对象中抽取出来, 简化了书写方式, 以方便开发
基本数据类型所对应的对象 就是 该基本数据类型的包装类
基本数据类型 | 包装数据类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int i = 10; // 常量池中保存
Integer in = new Integer(10); // 堆中保存
包装类用途
用在泛型上
使用集合的时候, 集合只能存储引用数据类型 对象
List<int> list = new ArrayList<int>(); // 错误, 集合只能存储引用数据类型
list.add(10)
List<Integer> list = new ArrayList<Integer>(); // 正确, 集合只能存储引用数据类型
包装类 是一个对象, 对象有属性和方法
基本数据类型, 无法进行方法操作, 只有转换成为包装类型, 才可以调用方法
包装类和基本数据类型的转换
基本数据类型 ==> 包装类
int i = 10;
// 使用构造方法
Integer in = new Integer(i)
// 使用静态方法valueOf(int 类型)
Integer in = Integer.valueOf(i);
包装类==> 基本数据类型
Integer in = Integer.valueOf(100);
int i = in.intValue();
自动装箱, 自动拆箱
Integer in = Integer.valueOf(100);
int i = in;
int a = 100;
Integer b = a;
Math
工具类, 包含基本的数学运算和几何运算
方法名 | 说明 |
---|---|
abs() | 绝对值 |
ceil(3.14) | 返回大于或等于参数的最小 (最接近负无穷大) double 整数值 |
floor(3.14) | 返回小于或等于参数的最大 (最接近正无穷大) double 值,等于一个数学整数。 |
max/min(double a, double b) | 返回两个 double 值中的较大/较小值 |
pow(a,b) | a^b a的b次幂 |
random | 返回一个 0 - 1 之间的随机数 |
round | 四舍五入 |
Scanner
判断的方法
异常的问题
判断用户输入的内容是否是某种数据类型
在键盘录入数据的时候, 使用nextInt() 只能获取整数类型, 一旦输入非整数, 抛出异常
java.util.InputMismatchException
public class Demo1_Scanner {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] arr = new int [3];
// 使用增强型for 遍历数组
for(int i = 0 ; i < arr.length ; i++){
System.out.println("请输入:");
arr[i] = input.nextInt();
}
System.out.println(Arrays.toString(arr));
}
}
如何避免抛出该异常, 使用if 判断用户输入的是否是整数
boolean hasNestInt()
public class Demo1_Scanner {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] arr = new int [3];
// 使用增强型for 遍历数组
for(int i = 0 ; i < arr.length ; i++){
System.out.println("请输入:");
if(input.hasNextInt()){ // 用户输入的数据是否为整数
arr[i] = input.nextInt();
}else{
System.out.println("输入错误");
}
}
System.out.println(Arrays.toString(arr));
}
}
发现问题
如果用户在该数组的遍历过程中, 输入 10,20,a 结果是10,20 正常, a 无法添加到数组
但是先输入的是 “a” , 程序的运行结果为
请输入:
a
输入错误
请输入:
输入错误
请输入:
输入错误
[0, 0, 0]
hasNextInt() 只管判断, 没有其他操作 导致的结果 a 一直存在于输入区
需要操作的事情 是一旦发现一个数不是整数, 需要把该数移除
if(input.hasNextInt()){ // 用户输入的数据是否为整数
arr[i] = input.nextInt();
}else{
System.out.println("输入错误");
input.next(); // 无论用户输入的是什么, 都可以清理掉
}
next() 和 nextline() 的区别
public class Demo1_Scanner1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String username;
String password;
System.out.println("请输入用户名:");
username = input.next(); // 尼古拉斯 志强
System.out.println("请输入密码:");
password = input.next();
System.out.println(username + "\t"+password); // 尼古拉斯 志强
}
next() 会把空格前后 当成多次输入 来显示
nextLine(); 可以把空格当成字符串的一部分来显示
Random
构造() 构造(参数)区别
// 参数 种子,随机数要根据种子生成
Random ran1 = new Random();
Random ran2 = new Random();
for(int i = 0 ; i < 5 ; i++){
System.out.println("ran1: "+ran1.nextInt());
System.out.println("ran2: "+ran2.nextInt());
}
使用种子, 类似于使用方案, 两个随机数类, 如果种子相同, 方案相同, 依次的随机数也是相同的
nextInt() 和 nextInt(参数)
nextInt() int 的取值范围内 随机产生
nextInt(参数) 随机生成数字, 满足条件 0 <= 随机数 < 参数
System
属性
Sout ==>
System.out.println()
System.err.println()
方法
arrayCopy
int [] arr1 = {1,2,3,4,5};
int [] arr2 = new int[10];
System.arraycopy(arr1,3,arr2,0,2);
System.out.println(Arrays.toString(arr2));
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目的地数据中的起始位置。
length - 要复制的数组元素的数量。
currentTimeMillis()
返回当前时间(以毫秒为单位)。
在1970年1月1日UTC之间的当前时间和午夜之间的差异,以毫秒为单位。
long time = System.currentTimeMillis();
System.out.println(time/1000/60/60/24/365);
exit(int status)
终止当前运行的Java虚拟机。 该参数作为状态代码; 按照惯例,非零状态码表示异常终止。
gc()
运行垃圾回收器
程序而言 , 没有用的
堆内存中, 没有被变量指向的对象 就是垃圾对象
自动垃圾回收机制
getProperties()
System.out.println(System.getProperties());