学习java第12天
程序员文章站
2022-05-10 11:05:47
...
2020/8/10
1.权限修饰符(记住大小顺序)
-
四个权限修饰符
public>protected>空的>private
-
使用范围
本类中 本包中 不同包的子类中 不同包中 public √ √ √ √ protected √ √ √ 空的 √ √ private √ -
代码演示
package com.itheima_01; //本类中 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.itheima_02; 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 执行顺序演示
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的方法。
3.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()源码(按住crtl+鼠标左击)
public boolean equals(Object o) { //如果地址值相同,说明成员变量值肯定相同 if (this == o) { return true; } //判断两个对象是否是同种类型 if (o == null || getClass() != o.getClass()) { return false; } //向下转型 Student student = (Student) o; //判断年龄和姓名 return age == student.age && Objects.equals(name, student.name); }
1.2 Objects工具类
Objects是Object的一个工具类
-
Objects的equals(源码分析):
-
作用
- 判断两个引用对象的内容是否相同
-
源码
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
-
优点
- 效率
- 避免空指针异常
-
使用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)
-
示例代码
import java.util.Date; 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) 判断在某个时间之后 -
示例代码
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) 把字符串按照指定格式转成日期
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“的格式的字符串
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天!
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.日历Calender类
-
概述
- Calender日历类把和时间相关的所有值都变成了一个字段,可以方便操作各个字段。
- Date对时间的操作只能操作毫秒级
-
创建对象
- 方法一:直接new Calender的子类对象叫做GregorianCalendar
- 方法二:静态方法Calender.getInstance();
-
常用方法
方法 说明 int get(int field) 获取某个字段的值 void set(int field,int value) 设置某个字段的值 void add(int field,int amount) 偏移某个字段的值(在原有的基础上加减) setTime(Date date) 把Date对象的时间赋值给Calendar -
可以使用Calender中定义的常量来表示
-
示例代码
- get方法演示
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()方法演示
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(五个参数) | 数组内容拷贝 |
- 示例代码:
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) 除法运算 -
代码示例:
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代表保存方式
-
示例代码:
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数学异常 } }
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test {
public static void main(String[] args) {
String[] nums = {"3.22","8.1","7","2.5","3.1","7.77","8.0","9.21"};
BigDecimal sum = new BigDecimal("0");
for (int i = 0; i<nums.length ; i++) {
BigDecimal bd = new BigDecimal(nums[i]);
sum=sum.add(bd);
}
System.out.println(sum);
BigDecimal n =new BigDecimal(nums.length);
System.out.println(sum.divide(n,2,RoundingMode.HALF_UP));
}
}
上一篇: 第12天学习打卡
下一篇: 学习java第12天