欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习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));
    }
}
相关标签: java