Java&day03

2020-08-12 20:20:02

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數學異常
      }
  }