学习java第12天

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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值