No_16_0307 Java基础学习第十四天

时间:2022-10-02 15:42:56
文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.03.08 lutianfei none

正则表达式

概述及基本使用

  • 正则表达式:是指用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

  • QQ号判断:

public static boolean checkQQ(String qq) {
// String regex ="[1-9][0-9]{4,14}";
// //public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式
// boolean flag = qq.matches(regex);
// return flag;

//return qq.matches("[1-9][0-9]{4,14}");

return qq.matches("[1-9]\\d{4,14}");
}

正则表达式的组成规则

  • 规则字符在java.util.regex Pattern类中
常见组成规则
  • 字符
    • x 字符 x。举例:’a’表示字符a
    • \\ 反斜线字符。
    • \n 新行(换行)符 (‘\u000A’)
    • \r 回车符 (‘\u000D’)
    • \t 制表符 (‘\u0009’)
  • 字符类
    • [abc] a、b 或 c(简单类)
    • [^abc] 任何字符,除了 a、b 或 c(否定)
    • [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
    • [0-9] 0到9的字符都包括
  • 预定义字符类
    • . 任何字符。’.’字符本身,用 \.表示。输入的时候为\\.
    • \d 数字:[0-9]
    • \D 非数字,[^0-9]
    • \w 单词字符:[a-zA-Z_0-9]
      • 在正则表达式里面组成单词的东西必须有这些东西组成
    • \W 非单词字符:[^\w]
  • 边界匹配器
    • ^ 行的开头
    • $ 行的结尾
    • \b 单词边界
      • 就是不是单词字符的地方。
      • 举例:hellospaceworld?haha;xixi
  • 数量词
    • X? X,一次或一次也没有
    • X* X,零次或多次
    • X+ X,一次或多次
    • X{n} X,恰好 n 次
    • X{n,} X,至少 n 次
    • X{n,m} X,至少 n 次,但是不超过 m 次

正则表达式的应用

判断功能(String 类)
  • public boolean matches(String regex)
  • 手机号码练习:
public class PhoneNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Pleas input you phonenumber:");
String phone = sc.nextLine();

String regex = "1[38]\\d{9}";
boolean flag = phone.matches(regex);
System.out.println("The Phone Number is:"+flag);
}
}


  • 邮箱验证:
public class RegexTest {
public static void main(String[] args) {
//键盘录入邮箱
Scanner sc = new Scanner(System.in);
System.out.println("请输入邮箱:");
String email = sc.nextLine();

//定义邮箱的规则
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";

//调用功能,判断即可
boolean flag = email.matches(regex);

//输出结果
System.out.println("flag:"+flag);
}
}


分割功能(String 类)
  • public String[] split(String regex)

  • 练习1:

public class RegexDemo {
public static void main(String[] args) {
//定义一个年龄搜索范围
String ages = "18-24";

//定义规则
String regex = "-";

//调用方法
String[] strArray = ages.split(regex);

//如何得到int类型的呢?
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);

//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();

if(age>=startAge && age<=endAge) {
System.out.println("你就是我想找的");
}else {
System.out.println("不符合我的要求,gun");
}
}
}


  • 练习2:
public class RegexDemo2 {
public static void main(String[] args) {
// 定义一个字符串
String s1 = "aa,bb,cc";
// 直接分割
String[] str1Array = s1.split(",");
for (int x = 0; x < str1Array.length; x++) {
System.out.println(str1Array[x]);
}
System.out.println("---------------------");

String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for (int x = 0; x < str2Array.length; x++) {
System.out.println(str2Array[x]);
}
System.out.println("---------------------");

String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");
for (int x = 0; x < str3Array.length; x++) {
System.out.println(str3Array[x]);
}
System.out.println("---------------------");

//硬盘上的路径,我们应该用\\替代\
String s4 = "E:\\JavaSE\\day14\\avi";
String[] str4Array = s4.split("\\\\");
for (int x = 0; x < str4Array.length; x++) {
System.out.println(str4Array[x]);
}
System.out.println("---------------------");
}
}


  • 练习3:
/*
* 我有如下一个字符串:"91 27 46 38 50"
* 请写代码实现最终输出结果是:"27 38 46 50 91"
*
* 分析:
* A:定义一个字符串
* B:把字符串进行分割,得到一个字符串数组
* C:把字符串数组变换成int数组
* D:对int数组排序
* E:把排序后的int数组在组装成一个字符串
* F:输出字符串
*/

public class RegexTest {
public static void main(String[] args) {
// 定义一个字符串
String s = "91 27 46 38 50";

// 把字符串进行分割,得到一个字符串数组
String[] strArray = s.split(" ");

// 把字符串数组变换成int数组
int[] arr = new int[strArray.length];

for (int x = 0; x < arr.length; x++) {
arr[x] = Integer.parseInt(strArray[x]);
}

// 对int数组排序
Arrays.sort(arr);

// 把排序后的int数组在组装成一个字符串
StringBuilder sb = new StringBuilder();
for (int x = 0; x < arr.length; x++) {
sb.append(arr[x]).append(" ");
}
//转化为字符串
String result = sb.toString().trim();

//输出字符串
System.out.println("result:"+result);
}
}


替换功能(String 类)
  • public String replaceAll(String regex,String replacement)
public class RegexDemo {
public static void main(String[] args) {
// 定义一个字符串
String s = "helloqq12345worldkh622112345678java";

// 我要去除所有的数字,用*给替换掉
// String regex = "\\d+";
// String regex = "\\d";
//String ss = "*";


// 直接把数字干掉
String regex = "\\d+";
String ss = "";

String result = s.replaceAll(regex, ss);
System.out.println(result);
}
}


获取功能(Pattern和Matcher类的使用)
  • Pattern和Matcher类的使用
  • 模式和匹配器的基本使用顺序

    • step1: 把正则表达式编译成模式对象
      • Pattern p = Pattern.compile(“a*b”);
    • step2: 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
      • Matcher m = p.matcher(“aaaaab”);
    • step3: 调用匹配器对象的功能
      • boolean b = m.matches();
  • find():查找存不存在

  • group():获取刚才查找过的数据
public class RegexDemo {
public static void main(String[] args) {
// 模式和匹配器的典型调用顺序

//step1: 把正则表达式编译成模式对象
Pattern p = Pattern.compile("a*b");

//step2: 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
Matcher m = p.matcher("aaaaab");

//step3: 调用匹配器对象的功能
boolean b = m.matches();
System.out.println(b);

//这个是判断功能,但是如果做判断,这样做就有点麻烦了,我们直接用字符串的方法做
String s = "aaaaab";
String regex = "a*b";
boolean bb = s.matches(regex);
System.out.println(bb);
}
}


  • 获取下面这个字符串中由三个字符组成的单词
/*
* 获取功能:
* 获取下面这个字符串中由三个字符组成的单词
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
*/

public class RegexDemo2 {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 规则
String regex = "\\b\\w{3}\\b";

// 把规则编译成模式对象
Pattern p = Pattern.compile(regex);
// 通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
// 调用匹配器对象的功能
// 通过find方法就是查找有没有满足条件的子串
// public boolean find()
// boolean flag = m.find();
// System.out.println(flag);
// // 如何得到值呢?
// // public String group()
// String ss = m.group();
// System.out.println(ss);

while (m.find()) {
System.out.println(m.group());
}

// 注意:一定要先find(),然后才能group()
// IllegalStateException: No match found
// String ss = m.group();
// System.out.println(ss);
}
}



Math类

Math类概述

  • Math 类包含用于执行基本数学运算的方法,如初等指数对数平方根三角函数

成员变量:

  • public static final double PI
  • public static final double E

成员方法

  • public static int abs(int a) //求绝对值
  • public static double ceil(double a)//向上取整
  • public static double floor(double a)//向下取整
  • public static int max(int a,int b) //取最大值 min自学
  • public static double pow(double a,double b)// a的b次幂
  • public static double random() //随机数[0.0,1.0)
  • public static int round(float a) //四舍五入(参数为double的自学)
  • public static double sqrt(double a)//正平方根
public class MathDemo {
public static void main(String[] args) {
// public static final double PI
System.out.println("PI:" + Math.PI);
// public static final double E
System.out.println("E:" + Math.E);
System.out.println("--------------");

// public static int abs(int a):绝对值
System.out.println("abs:" + Math.abs(10));
System.out.println("abs:" + Math.abs(-10));
System.out.println("--------------");

// public static double ceil(double a):向上取整
System.out.println("ceil:" + Math.ceil(12.34));
System.out.println("ceil:" + Math.ceil(12.56));
System.out.println("--------------");

// public static double floor(double a):向下取整
System.out.println("floor:" + Math.floor(12.34));
System.out.println("floor:" + Math.floor(12.56));
System.out.println("--------------");

// public static int max(int a,int b):最大值
System.out.println("max:" + Math.max(12, 23));
// 需求:我要获取三个数据中的最大值
// 方法的嵌套调用
System.out.println("max:" + Math.max(Math.max(12, 23), 18));
// 需求:我要获取四个数据中的最大值
System.out.println("max:"
+ Math.max(Math.max(12, 78), Math.max(34, 56)));
System.out.println("--------------");

// public static double pow(double a,double b):a的b次幂
System.out.println("pow:" + Math.pow(2, 3));
System.out.println("--------------");

// public static double random():随机数 [0.0,1.0)
System.out.println("random:" + Math.random());
// 获取一个1-100之间的随机数
System.out.println("random:" + ((int) (Math.random() * 100) + 1));
System.out.println("--------------");

// public static int round(float a) 四舍五入(参数为double的自学)
System.out.println("round:" + Math.round(12.34f));
System.out.println("round:" + Math.round(12.56f));
System.out.println("--------------");

//public static double sqrt(double a):正平方根
System.out.println("sqrt:"+Math.sqrt(4));
}
}
/*
PI:3.141592653589793
E:2.718281828459045
--------------
abs:10
abs:10
--------------
ceil:13.0
ceil:13.0
--------------
floor:12.0
floor:12.0
--------------
max:23
max:23
max:78
--------------
pow:8.0
--------------
random:0.6894494820506414
random:75
--------------
round:12
round:13
--------------
sqrt:2.0
*/


Random类

Random类概述

  • 此类用于产生随机数
  • 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。

构造方法

  • public Random(): 创建一个新的随机数生成器。用的是默认种子(当前时间的毫秒值)。
  • public Random(long seed):使用单个long种子创建一个新的随机数生成器。
    • 对于一个给定的种子,每次产生的值是一样的。

Random类成员方法

  • public int nextInt(): 返回Int范围内的随机数
  • public int nextInt(int n):返回的是[0,n)范围内的随机数。
public class RandomDemo {
public static void main(String[] args) {
// 创建对象
// Random r = new Random();
Random r = new Random(1111);

for (int x = 0; x < 10; x++) {
// int num = r.nextInt();
int num = r.nextInt(100) + 1;
System.out.println(num);
}
}
}


System类

System类概述

  • System 类包含一些有用的类字段和方法。它不能被实例化。

成员方法

  • public static void gc():运行垃圾回收器

    • System.gc()可用于垃圾回收。当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。
    • finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现
    • 从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源
    • 但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好
  • public static void exit(int status):终止当前正在运行的Java虚拟机。参数用作状态码;根据惯例,非0的状态码表示异常终止

  • public static long currentTimeMillis():返回一毫秒为单位的当前时间

    • 统计程序运行时间:
      public class SystemDemo {
      public static void main(String[] args) {
      // System.out.println("我们喜欢林青霞(东方不败)");
      // System.exit(0); //0表示正常退出。
      // System.out.println("我们也喜欢赵雅芝(白娘子)");

      // System.out.println(System.currentTimeMillis());

      long start = System.currentTimeMillis();
      for (int x = 0; x < 100000; x++) {
      System.out.println("hello" + x);
      }
      long end = System.currentTimeMillis();
      System.out.println("共耗时:" + (end - start) + "毫秒");
      }
      }


  • public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

    • 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组指定位置结束。
    • src - 源数组。
    • srcPos - 源数组中的起始位置。
    • dest - 目标数组。
    • destPos - 目标数据中的起始位置。
    • length - 要复制的数组元素的数量。
public class SystemDemo {
public static void main(String[] args) {
// 定义数组
int[] arr = { 11, 22, 33, 44, 55 };
int[] arr2 = { 6, 7, 8, 9, 10 };

System.arraycopy(arr, 1, arr2, 2, 2);

System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2)); //6,7,22,33,10
}
}


BigInteger类

BigInteger类概述

  • 可以让超过Integer范围内的数据进行运算

构造方法

  • public BigInteger(String val)

BigInteger类成员方法

  • public BigInteger add(BigInteger val)
  • public BigInteger subtract(BigInteger val)
  • public BigInteger multiply(BigInteger val)
  • public BigInteger divide(BigInteger val)
  • public BigInteger[] divideAndRemainder(BigInteger val) //返回余数的数组。

  • 练习:

public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bi1 = new BigInteger("100");
BigInteger bi2 = new BigInteger("50");

// public BigInteger add(BigInteger val):加
System.out.println("add:" + bi1.add(bi2));
// public BigInteger subtract(BigInteger val):加
System.out.println("subtract:" + bi1.subtract(bi2));
// public BigInteger multiply(BigInteger val):加
System.out.println("multiply:" + bi1.multiply(bi2));
// public BigInteger divide(BigInteger val):加
System.out.println("divide:" + bi1.divide(bi2));

// public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
BigInteger[] bis = bi1.divideAndRemainder(bi2);
System.out.println("商:" + bis[0]);
System.out.println("余数:" + bis[1]);
}
}


BigDecimal类

  • 由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal

BigDecimal类概述

  • 不可变的、任意精度有符号 十进制数。

构造方法

  • public BigDecimal(String val)

BigDecimal类成员方法

  • public BigDecimal add(BigDecimal augend)
  • public BigDecimal subtract(BigDecimal subtrahend)
  • public BigDecimal multiply(BigDecimal multiplicand)
  • public BigDecimal divide(BigDecimal divisor)
  • public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)
    • divisor:除数
    • scale:要返回的BigDecimal商的标度
    • roundingMode:如何舍去的模式,一般都用ROUND_HALF_UP模式
public class BigDecimalDemo {
public static void main(String[] args) {
// System.out.println(0.09 + 0.01);
// System.out.println(1.0 - 0.32);
// System.out.println(1.015 * 100);
// System.out.println(1.301 / 100);

BigDecimal bd1 = new BigDecimal("0.09");
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println("add:" + bd1.add(bd2));
System.out.println("-------------------");

BigDecimal bd3 = new BigDecimal("1.0");
BigDecimal bd4 = new BigDecimal("0.32");
System.out.println("subtract:" + bd3.subtract(bd4));
System.out.println("-------------------");

BigDecimal bd5 = new BigDecimal("1.015");
BigDecimal bd6 = new BigDecimal("100");
System.out.println("multiply:" + bd5.multiply(bd6));
System.out.println("-------------------");

BigDecimal bd7 = new BigDecimal("1.301");
BigDecimal bd8 = new BigDecimal("100");
System.out.println("divide:" + bd7.divide(bd8));
System.out.println("divide:"
+ bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP));
System.out.println("divide:"
+ bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP));
//一般都用ROUND_HALF_UP模式
}
}


Date类

Date类概述

  • 类 Date 表示特定的瞬间,精确到毫秒

构造方法

  • public Date():根据当前的默认毫秒值创建日期对象。
  • public Date(long date):根据给定的毫秒值创建日期对象。
public class DateDemo {
public static void main(String[] args) {
// 创建对象
Date d = new Date();
System.out.println("d:" + d);

// 创建对象
// long time = System.currentTimeMillis();
long time = 1000 * 60 * 60; // 1小时
Date d2 = new Date(time);
System.out.println("d2:" + d2);
//d2:Thu Jan 01 09:00:00 CST 1970
//东方时区8+1H
}
}

成员方法

  • public long getTime():获取时间,以毫秒为单位。
  • public void setTime(long time):设置时间。
public class DateDemo {
public static void main(String[] args) {
// 创建对象
Date d = new Date();

// 获取时间
long time = d.getTime();
System.out.println(time);
// System.out.println(System.currentTimeMillis());

System.out.println("d:" + d);
// 设置时间
d.setTime(1000); //单位ms
System.out.println("d:" + d);
}
}


DateFormat类

DateFormat类概述

  • DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间
  • 因为是抽象类,所以使用其子类SimpleDateFormat
    • 格式化:Data –> String
    • 解析:String –> Data

SimpleDateFormat构造方法

  • public SimpleDateFormat()
  • public SimpleDateFormat(String pattern)
    • pattern参数:
      No_16_0307 Java基础学习第十四天

成员方法

  • public final String format(Date date) :格式化:Data –> String
  • public Date parse(String source):解析:String –> Data
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
// Date -- String
// 创建日期对象
Date d = new Date();
// 创建格式化对象
// SimpleDateFormat sdf = new SimpleDateFormat();
// 给定模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// public final String format(Date date)
String s = sdf.format(d);
System.out.println(s);


//String -- Date
String str = "2008-08-08 12:12:12";
//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(str);
System.out.println(dd);
}
}

/*
运行结果:
2016年03月09日 23:29:35
Fri Aug 08 12:12:12 CST 2008
*/


Date类及DateFormat类练习

  • 制作一个工具类。DateUtil
    • DataUtil
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* 这是日期和字符串相互转换的工具类
*
* @author 风清扬
*/

public class DateUtil {
private DateUtil() {
}

/**
* 这个方法的作用就是把日期转成一个字符串
*
* @param d
* 被转换的日期对象
* @param format
* 传递过来的要被转换的格式
* @return 格式化后的字符串
*/

public static String dateToString(Date d, String format) {
// SimpleDateFormat sdf = new SimpleDateFormat(format);
// return sdf.format(d);
return new SimpleDateFormat(format).format(d);
}

/**
* 这个方法的作用就是把一个字符串解析成一个日期对象
*
* @param s
* 被解析的字符串
* @param format
* 传递过来的要被转换的格式
* @return 解析后的日期对象
* @throws ParseException
*/

public static Date stringToDate(String s, String format)
throws ParseException {
return new SimpleDateFormat(format).parse(s);
}
}
  • DataUtilDemo
import java.text.ParseException;
import java.util.Date;

/*
* 工具类的测试
*/

public class DateUtilDemo {
public static void main(String[] args) throws ParseException {
Date d = new Date();
// yyyy-MM-dd HH:mm:ss
String s = DateUtil.dateToString(d, "yyyy年MM月dd日 HH:mm:ss");
System.out.println(s);

String s2 = DateUtil.dateToString(d, "yyyy年MM月dd日");
System.out.println(s2);

String s3 = DateUtil.dateToString(d, "HH:mm:ss");
System.out.println(s3);

String str = "2014-10-14";
Date dd = DateUtil.stringToDate(str, "yyyy-MM-dd");
System.out.println(dd);
}
}


  • 算一下你来到这个世界多少天?
/*
* 算一下你来到这个世界多少天?
*
* 分析:
* A:键盘录入你的出生的年月日
* B:把该字符串转换为一个日期
* C:通过该日期得到一个毫秒值
* D:获取当前时间的毫秒值
* E:用D-C得到一个毫秒值
* F:把E的毫秒值转换为年
* /1000/60/60/24
*/

public class MyYearOldDemo {
public static void main(String[] args) throws ParseException {
// 键盘录入你的出生的年月日
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的出生年月日:");
String line = sc.nextLine();

// 把该字符串转换为一个日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(line);

// 通过该日期得到一个毫秒值
long myTime = d.getTime();

// 获取当前时间的毫秒值
long nowTime = System.currentTimeMillis();

// 用D-C得到一个毫秒值
long time = nowTime - myTime;

// 把E的毫秒值转换为年
long day = time / 1000 / 60 / 60 / 24;

System.out.println("你来到这个世界:" + day + "天");
}
}


Calendar类

Calendar类概述

  • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

成员方法

  • public static Calendar getInstance():获得一个日历对象
  • public int get(int field):根据日历字段得到对应的值。
    • 返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。
  • public void add(int field,int amount)
    • 根据日历字段和一个正负数确定是添加还是减去对应日历字段的值。
  • public final void set(int year,int month,int date)
    • 设置日历对象的年月日
import java.util.Calendar;

/*
* Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
*
* public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。
*/


public class CalendarDemo {
public static void main(String[] args) {
// 其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance(); // 子类对象//多态用法。

// 获取年
int year = rightNow.get(Calendar.YEAR);
// 获取月
int month = rightNow.get(Calendar.MONTH);
// 获取日
int date = rightNow.get(Calendar.DATE);

System.out.println(year + "年" + (month + 1) + "月" + date + "日"); //month从0开始
}
}

/*
* abstract class Person { public static Person getPerson() { return new
* Student(); } }
*
* class Student extends Person {
*
* }
*/


import java.util.Calendar;

/*
* public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
* public final void set(int year,int month,int date):设置当前日历的年月日
*/

public class CalendarDemo {
public static void main(String[] args) {
// 获取当前的日历时间
Calendar c = Calendar.getInstance();

// 获取年
int year = c.get(Calendar.YEAR);
// 获取月
int month = c.get(Calendar.MONTH);
// 获取日
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");

// // 三年前的今天
// c.add(Calendar.YEAR, -3);
// // 获取年
// year = c.get(Calendar.YEAR);
// // 获取月
// month = c.get(Calendar.MONTH);
// // 获取日
// date = c.get(Calendar.DATE);
// System.out.println(year + "年" + (month + 1) + "月" + date + "日");

// 5年后的10天前
c.add(Calendar.YEAR, 5);
c.add(Calendar.DATE, -10);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
System.out.println("--------------");

c.set(2011, 11, 11);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
}
}


Calendar类练习

  • 算一下你来到这个世界多少天?
  • 获取任意一年的二月有多少天
import java.util.Calendar;
import java.util.Scanner;

/*
* 获取任意一年的二月有多少天
*
* 分析:
* A:键盘录入任意的年份
* B:设置日历对象的年月日
* 年就是A输入的数据
* 月是2
* 日是1
* C:把时间往前推一天,就是2月的最后一天
* D:获取这一天输出即可
*/

public class CalendarTest {
public static void main(String[] args) {
// 键盘录入任意的年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();

// 设置日历对象的年月日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1); // 其实是这一年的3月1日
// 把时间往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);

// 获取这一天输出即可
System.out.println(c.get(Calendar.DATE));
}
}