1.权限修饰符【记住大小顺序】
-
四个权限修饰符
public > protected > 空的 > private
-
使用范围
本类中 | 本包中 | 不同包的子类中 | 不同包中 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
空的 | √ | √ | ||
private | √ |
- 代码演示
package com.a;
public class AAA {
//public
public void method1(){
}
//protected
protected void method2(){
}
//空的
void method3(){
}
//private
private void method4(){
}
public void method(){
method1();
method2();
method3();
method4();
}
}
public class BBB {
public void method(){
//创建对象
AAA a = new AAA();
a.method1();
a.method2();
a.method3();
//a.method4(); //private不能用
}
}
package com.a;
import com.itheima_01.AAA;
public class CCC extends AAA {
public void method(){
method1();
method2();
//method3(); //空的
//method4(); //private
}
}
public class DDD {
public void method(){
//创建对象
AAA a = new AAA();
a.method1();
//a.method2(); //protected
//a.method3(); //空的
//a.method4(); //private
}
}
2.代码块
代码块就是一对儿大括号,不用调用能自动执行。
2.1静态代码块【重点】
-
格式:
类中方法外: static{ 静态代码块; }
-
执行时机:
- 在当前类第一次被使用时会自动执行,并且是第一个执行,只执行一次
-
使用场景:
- 有一些需要在整个类的最开始执行的代码就可以放在静态代码块中。
2.2构造代码块
-
格式:
类中方法外: { 构造代码块; }
-
执行时机:
- 在每个构造方法执行之前先执行一次构造代码块;
-
使用场景:
- 如果所有的构造方法都有相同的代码,就可以提取到构造代码块中,减少代码重复。
2.3局部代码块
-
格式:
在方法中: { 局部代码块; }
-
作用:
- 减小变量的作用域,为了节约内存。但是现在完全没用。
2.4执行顺序演示
package com.a;
public class Student {
String name;
int age;
static String country = "中国";
//静态代码块
static{
System.out.println("静态代码块");
}
//构造代码块
{
System.out.println("构造代码块");
}
//空参构造
public Student(){
System.out.println("空参构造");
}
//有参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造");
}
}
public class Test01 {
public static void main(String[] args) {
Student s = new Student();
Student s2 = new Student("张洒",23);
System.out.println(Student.country);
}
}
/*
静态代码块
构造代码块
空参构造
构造代码块
有参构造
中国
*/
3.Object类
Object是所有类的父类,所以类都继承了Object的方法。
1.1 equals()方法【重点】
-
作用:
- 判断两个对象是否相同。
-
回顾==号:
int a = 10; int b = 10; String c = new String("abc"); String d = new String("abc"); System.out.println(a == b); //true System.out.println(c == d); //false ==比较基本类型时,比较的是值是否相同 ==比较引用类型时,比较的是地址值是否相同
-
查看equals()源码:
public boolean equals(Object obj) { return (this == obj); } Object中的equals方法判断的也是地址值。
-
idea重写equals()方法的解析:
public boolean equals(Object o) { //如果地址值相同,说明成员变量值肯定相同 if (this == o) { return true; } //判断两个对象是否是同种类型 if (o == null || this.getClass() != o.getClass()) { return false; } //向下转型 Student s = (Student) o; //判断年龄和姓名 return this.age == s.age && Objects.equals(this.name, s.name); //this.name.equals(s.name); }
1.2Objects工具类
Objects是Object的一个工具类
-
Objects的equals()源码解析:
-
作用:
- 判断两个引用类型对象的内容是否相同
-
源码:
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
-
优点:
- 效率较高
- 避免空指针异常
-
1.3 toString()方法【重点】
-
作用:
- 把引用类型变成一个字符串
-
输出语句:
- 在输出语句中,在打印对象时,会默认调用类的toString()方法。
-
查看源码:
public String toString() { // 包名 + 类名 + "@" + 地址值的十六进制形式 return this.getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
使用idea完成方法重写:
public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }
1.4 native方法
被native所修饰的方法叫本地方法。
这些方法的底层用到了一些别的语言,比如说C语言,源码无法在java中显示,所以这些方法不能查看源码。
4.日期Date类【重点】
- 概述:
- java.util.Date
- Date在java中表示时间,表示时间的单位是毫秒。
- 构造方法:
方法 | 说明 |
---|---|
public Date() | 用当前时间创建时间对象 |
public Date(long date) | 用毫秒值创建时间对象,毫秒值代表距离基准时间的差值时间 |
标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)
-
示例代码:
public class Test01 { public static void main(String[] args) { //Date的构造方法 //new Date():代表当前时间 Date d = new Date(); System.out.println(d); //new Date(long date):代表距离基准时间的差值时间 //1970年1月1日8点0分1秒 Date d2 = new Date(1000); System.out.println(d2); //1970年1月1日9点0分0秒 Date d3 = new Date(1000*60*60); System.out.println(d3); } }
-
常用方法:
方法 | 说明 |
---|---|
getTime() | 获取时间的毫秒值 |
setTime(long time) | 设置时间的毫秒值 |
before(Date date) | 判断在某个时间之前 |
after(Date date) | 判断在某个时间之后 |
- 示例代码:
package com.a;
import java.util.Date;
public class Test02 {
public static void main(String[] args) {
//创建对象
Date d = new Date();
Date d2 = new Date();
//getTime()
//获取时间的毫秒值
long time = d.getTime();
System.out.println(time); //1597027887127 1970年1月1日到现在的毫秒值差值
//setTime(long time)
//设置时间的毫秒值
d.setTime(235252352377L);
System.out.println(d);
//判断
System.out.println(d.after(d2)); //1977是否在2020之后 false
System.out.println(d.before(d2)); //1977是否在2020之前 true
}
}
5.日期格式化DateFormat类【重点】
-
概述:
- DateFormat是日期格式化类,能够把日期转成不同格式的字符串,方便阅读。
-
创建对象:
- 因为DateFormat是一个抽象类,所以我们要创建的是他的子类对象叫SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("日期格式"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); 格式: y 年 M 月 d 日 H 时 m 分 s 秒
-
DateFormat常用方法:
方法 | 说明 |
---|---|
String format(Date date) | 把日期按照指定格式转成字符串 |
Date parse(String s) | 把字符串按照指定格式转成日期 |
- 代码演示
package com.a;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test03 {
public static void main(String[] args) throws ParseException {
//SimpleDateFormat构造方法
// 2020年08月10日 11时07分24秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
Date d = new Date();
System.out.println(d);
//String format(Date date)
//把日期按照指定格式转成字符串
String s = sdf.format(d);
System.out.println(s);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
//Date parse(String s)
//把字符串按照指定格式转成日期
String str = "2000/07/04";
//parse()这个方法会报错,叫异常。解决办法:在方法上按alt+enter enter
Date d2 = sdf2.parse(str);
System.out.println(d2);
//ParseException 解析异常,如果格式不匹配会出现
}
}
练习一:字符串日期的格式转化
有一个字符串“2000年01月01日”,要转成“2000/01/01“的格式的字符串
package com.a;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test04 {
//练习一
public static void main(String[] args) throws ParseException {
//字符串
String s1 = "2000年07月08日";
//日期格式化
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf1.parse(s1);
//日期格式化
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
String s2 = sdf2.format(date);
//要转成"2000/01/01"
System.out.println(s2);
}
}
练习二:求你来到这个世界多少天?
键盘输入一个字符串类型的时间,打印来到世界多少天。
比如:
请输入你的出生日期:
2000/01/01
你来到这个世界7300天!
package com.a;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Test05 {
public static void main(String[] args) throws ParseException {
//键盘输入一个字符串生日
Scanner sc = new Scanner(System.in);
System.out.println("请输入出生日期:(格式:xxxx/xx/xx)");
String s = sc.nextLine();
//转成Date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Date birthDate = sdf.parse(s);
//现在时间
Date nowDate = new Date();
//获取毫秒值
long time1 = birthDate.getTime();
long time2 = nowDate.getTime();
//计算
System.out.println("你来到这个世界"+ (time2-time1)/1000/60/60/24 +"天啦!");
}
}
6.日历Calendar类【重点】
- 概述:
- Calendar日历类把和时间相关的所有的值都变成了一个字段,可以方便的操作各个字段。
- Date对时间的操作只能操作毫秒值。
- 创建对象:
- 方式一:直接new Calendar的子类对象叫GregorianCalendar
- 方式二:静态方法Calendar.getInstance();[上课用]
- 常用方法:
方法 | 说明 |
---|---|
int get(int field) | 获取某个字段的值 |
void set(int field,int value) | 设置某个字段的值 |
void add(int field,int amount) | 偏移某个字段的值(在原有的基础上加减) |
setTime(Date date) | 把Date对象的时间赋值给Calendar |
-
可以使用Calender中定义的常量来表示:
-
示例代码:
- get方法演示
package com.a;
import java.util.Calendar;
public class Test06 {
//创建Calendar对象
public static void main(String[] args) {
//创建对象
Calendar c = Calendar.getInstance(); //默认代表当前时间
//get()
//获取年 1 = YEAR
System.out.println(c.get(Calendar.YEAR)); //2020
//获取月
System.out.println(c.get(Calendar.MONTH)+1); //8 特殊:Calendar类中月份保存的是0-11
//获取日
System.out.println(c.get(Calendar.DAY_OF_MONTH)); //10
//小时
System.out.println(c.get(Calendar.HOUR_OF_DAY));
//分钟
System.out.println(c.get(Calendar.MINUTE));
//秒
System.out.println(c.get(Calendar.SECOND));
//星期
int n = c.get(Calendar.DAY_OF_WEEK);
System.out.println(week(n)); //星期一 出来的是2 特殊:美国周日是一周的第一天
// 1代表周日 2代表周一
}
//把数字转成对应的星期
public static String week(int n){
String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[n];
}
}
- set()和add()方法演示
package com.a;
import java.util.Calendar;
public class Test07 {
public static void main(String[] args) {
//创建对象
Calendar c = Calendar.getInstance();
//set() :设置某个字段的值
//把年设置为2021年
c.set(Calendar.YEAR,2021);
//把月设置为5月
c.set(Calendar.MONTH,4);
//把日设置成20日
c.set(Calendar.DAY_OF_MONTH,20);
//把年减10年
c.add(Calendar.YEAR,-10);
//把日加20天
c.add(Calendar.DAY_OF_MONTH,20);
//获取
System.out.println(c.get(Calendar.YEAR) +"年"+(c.get(Calendar.MONTH)+1) + "月" + c.get(Calendar.DAY_OF_MONTH) + "日");
}
}
- setTime(Date date)方法演示
public class Test08 {
public static void main(String[] args) throws ParseException {
String str = "2000/07/04";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
//Date parse(String s)
//把字符串按照指定格式转成日期
Date d2 = sdf2.parse(str); //parse()这个方法会报错,叫异常。解决办法:在方法上按alt+enter enter
Calendar c = Calendar.getInstance();
//setTime(Date date) :把Date的时间设置给日历对象
c.setTime(d2);
//c他就代表了2000年7月4日
}
}
7.Math类
- 概述:
- Math代表数学类,和数学运算相关的方法都在这个类中。这个类的所有成员都是静态成员。
- 这个类不能创建对象。
- 常用方法:
方法 | 说明 |
---|---|
static int abs(int a) | 绝对值 |
static double ceil(double a) | 向上取整 |
static double floor(double a) | 向下取整 |
static double pow(double a, double b) | a的b次方 |
static long round(double a) | 四舍五入 |
- 示例代码:
public class Test01_Math {
public static void main(String[] args) {
//圆周率
System.out.println(Math.PI);
//static int abs(int a)
//绝对值
System.out.println(Math.abs(-4)); //4
//static double ceil(double a)
//向上取整
System.out.println(Math.ceil(3.2)); //4.0
//static double floor(double a)
//向下取整
System.out.println(Math.floor(3.8)); //3.0
//static double pow(double a, double b)
//a的b次方
System.out.println(Math.pow(2,3)); //8.0
//static long round(double a)
//四舍五入
System.out.println(Math.round(4.45)); //4
}
}
8.System类【重点】
- 概述:
- System类保存了一些系统相关的方法。所有的方法也都是静态的。
- 也不能创建对象。
- 常用方法:
方法 | 说明 |
---|---|
static void exit(int status) | 退出虚拟机 |
static long currentTimeMillis() | 获取当前时间毫秒值 |
static void arrayCopy(五个参数) | 数组内容拷贝 |
- 示例代码:
package com.a;
import java.util.Date;
public class Test02_System {
public static void main(String[] args) {
//static void exit(int status)
//退出虚拟机
//0代表正常退出 其他数字代表不正常退出
//System.exit(0);
//static long currentTimeMillis()
//获取当前时间毫秒值
long time2 = new Date().getTime();
System.out.println(time2);
long time = System.currentTimeMillis();
System.out.println(time);
//static void arrayCopy(五个参数)
//数组内容拷贝
int[] arr = {11,22,33,44,55,66};
int[] brr = new int[6];
/*
Object src 代表源数组
int srcPos 代表源数组要复制的起始索引
Object dest 代表目标数组
int destPos 代表目标数组的起始索引
int length 代表要复制的元素个数
*/
//把arr数组中22 33 44元素复制到brr数组的前三个位置
System.arraycopy(arr,1,brr,0,3);
//把brr数组的33 44复制到brr的最后
System.arraycopy(brr,1,brr,4,2);
//打印
for (int i = 0; i < brr.length; i++) {
System.out.print(brr[i]+" ");
}
//22 33 44 0 33 44
}
}
9.BigInteger类
-
概述:
- BigInteger叫大整数,可以代表无限大的整数,是一种引用类型。引用类型无法使用运算符,需要用方法来完成数学运算。
-
构造方法:
方法 说明 BigInteger(String value) 可以把字符串整数变成对象 -
常用方法:
方法 说明 add(BigInteger value) 加法运算 subtract(BigInteger value) 减法运算 multiply(BigInteger value) 乘法运算 divide(BigInteger value) 除法运算 -
代码示例:
package com.a;
import java.math.BigInteger;
public class Test03_BigInteger {
public static void main(String[] args) {
//创建对象
BigInteger b1 = new BigInteger("1000000000000000000000000");
BigInteger b2 = new BigInteger("100000000000000000000000");
//加法
System.out.println(b1.add(b2));
//减法
System.out.println(b1.subtract(b2));
//乘法
System.out.println(b1.multiply(b2));
//除法
System.out.println(b1.divide(b2));
}
}
10.BigDecimal类
- 概述:
- BigDecimal类表示大小数。可以表示一个无限大无限精确的小数。
- 可以做精确的计算。
- 构造方法:
方法 | 说明 |
---|---|
BigDecimal(double val) | 把小数数值变成BigDecimal对象 |
BigDecimal(String val) | 把字符串值变成BigDecimal对象 |
- 常用方法:
方法 | 说明 |
---|---|
BigDecimal add(BigDecimal value) | 加法运算 |
BigDecimal subtract(BigDecimal value) | 减法运算 |
BigDecimal multiply(BigDecimal value) | 乘法运算 |
BigDecimal divide(BigDecimal value) | 除法运算 |
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) | 除法运算 |
scale代表保留小数点后位数,roundingMode代表保存方式
- 示例代码:
package com.a;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test04_BigDecimal {
public static void main(String[] args) {
//double不精确
//double d1 = 0.09;
//double d2 = 0.01;
//System.out.println(d1+d2); //0.09999999999999999 基本类型的小数底层存储不精确
//创建对象
BigDecimal b1 = new BigDecimal("0.09");
BigDecimal b2 = new BigDecimal("0.01");
//加
System.out.println(b1.add(b2)); //0.10
//减
System.out.println(b1.subtract(b2));//0.08
//乘
System.out.println(b1.multiply(b2));//0.0009
//除
System.out.println(b1.divide(b2)); //9
System.out.println(10/3); //3
System.out.println(10/3.0); //3.3333333333333335
BigDecimal d3 = new BigDecimal("10.0");
BigDecimal d4 = new BigDecimal("3.0");
//除法
//第二个参数表示小数点后保存位数,第三个参数表示省略方式
System.out.println(d3.divide(d4,2, RoundingMode.HALF_UP)); //ArithmeticException数学异常
}
}