主頁 > 後端開發 > 后端開發學習記錄(一)——Java語言的學習

后端開發學習記錄(一)——Java語言的學習

2022-04-25 06:24:52 後端開發

Java語法

準備階段

  • 先學會IDEA的基本除錯

  • 插件目前在用的是漢化版,在熟悉后盡量使用英文版(現已改成英文版)

  • 調節字體大小,行間距,注釋的顏色要會

注釋

  1. 單行注釋 //
  2. 多行注釋 /**/
  3. 檔案注釋 /** */

Java的基本語法

一、入門的科普
  • 關于位元組
  • 強制轉換
  1. 強制轉換的計算
package com.Ji.base;

public class Lesson4溢位問題 {
    public static void main(String[] args) {
        //當操作比較大的時候,注意溢位問題
        //JDK7 的新操作,數字之間可以用下劃線區分
        int number = 10_0000_0000;
        int b = 30;
        int m = number*b; //-64771072
        long m2 =  number*b; //-64771072
        long m3 = number*((long)b); //30000000000  將一個數轉化為另一個型別,好算

        System.out.println(m);
        System.out.println(m2);
        System.out.println(m3);
    }
}

2.強制轉換的注意點

注意點:
        1.不能對布林值進行轉換
        2.不能把物件的型別轉換為不相干的型別 (如上)
        3.在把高容量轉換為低容量的時候,強制轉換
        4.轉換的時候可能存在記憶體溢位的問題
  • 型別轉換
    { 自動型別轉換(高-->底)| 強制型別轉換(低-->高) }
  低------------------------------------------------->高      
  byte -> short -> char -> int -> long -> float -> double
  運算中,不同的型別的資料先轉化為同一資訊,然后進行運算
  • 常用的不同型別的定義方法
package com.Ji.base;

public class Lesson5常用定義方法 {
    public static void main(String[] args) {
        //int a,b,c
        //int a=1,b=2,c=3;
        String name="yuanhui";
        char a='A';
        double pi = 3.141;
    }
}
  • 變數的型別以及初始化變數

變數的定義

type varName [=value] [{,varName[=value]}];
資料型別   變數名 = 值 ;可以使用逗號隔開來宣告多個同型別的變數
    public static void main(String[] args) {
        //區域變數;必須宣告和初始化值
        int i = 10;
        System.out.println(i);

        //變數型別 :new  Lesson6()
        Lesson6變數的所有型別 lesson6 = new  Lesson6變數的所有型別();
        System.out.println(new  Lesson6變數的所有型別().age);
        System.out.println(new  Lesson6變數的所有型別().name);

        System.out.println(salary);
    }
二、Java的資料型別
//整數型別  十進制   二進制0b  八進制0  十六進制0x
        int i = 10;
        int i2 = 010;//八進制0
        int i3 = 0x10;//十六進制0x   0~9  A~F 16

Java的資料型別分為兩大類

-基本型別
  1. 數值型別:
       整數型別:
                1. byte(占1個位元組)
                2. short(占2個位元組)
                3. int(占4個位元組)
                4. long(占8個位元組)
       浮點型別:
                1. float(占4個位元組)
                2. double(占8個位元組)
  2. 字符型別:
                char(占2個位元組)
2. boolean型別

eg float x = 100; 輸出x的值,為100.0,如果時double 則為100.00
 參考型別
   1. 類
   2. 介面
   3. 陣列
三、 Java的運算子
  • 運算子
    算數運算子:+  -  *  /  %  ++  --
    賦值運算子:=
    關系運算子:>  <  >=  <=  ==  !=instanceof
    邏輯運算子:&&  ||  !
    位運算子:&  |  ^  ~  >>  <<  
    條件運算子:? :
    擴展賦值運算子: +=  -=  *=  /=
package com.Ji.operator;//包 的定義

public class Lesson1運算子 {
    public static void main(String[] args) {
        //ctrl+D 復制當前的代碼行
        long a = 1234567891L;//long 型別要加L float型別要加f
        int b = 456;
        short c = 10;
        byte d = 7;

        System.out.println(a+b+c+d);//long 有long 轉為long型,默認是int型
        System.out.println(b+c+d);//int
        System.out.println(c+d);//int

        int x = 10;
        int y = 20 ;
        int z =  41 ;
        System.out.println(x==y);
        System.out.println(x>=y);
        System.out.println(x<=y);
        System.out.println(z%y);
        //默認關系運算子的結果是布林值,取余和C語言不一樣,不需要寫等號
    }
  • 自增和自減
  package com.Ji.operator;

public class Lesson2自增和自減 {
    public static void main(String[] args) {
        int a = 5;
        int b = a++;//a = a + 1
        // a++ 后 a = 6 ,但是b的值為a++之前的值,輸出為5
        int c = ++a;//c = a+1 先自增 再給c 賦值

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        //冪運算我們要用類來進行 計算2*2*2=8
        double pow = Math.pow(2,3);
        System.out.println(pow);
    }
}
  • 關系運算子
package com.Ji.operator;

public class Lesson3關系運算子 {
    public static void main(String[] args) {
        /*
        A = 0011 1100
        B = 0000 1101

        A&B = 0000 1100 (如果二者都為1,則都取1)
        A|B = 0011 1101 (如果二至其中有一個是1,則取1)
        A^B = 0011 0001 (異或 如果相同則為0 不同則為1)
        ~B = 1111 0010
         */

        //問: 如何計算2*8最快
        //按位來運算
        /*
        二進制
        0000 0001  1
        0000 0010  2
        0000 0011  3
        0000 0100  4
        0000 1000  8
        0001 0000  16
        */
        System.out.println(2<<3);
    }
}
  • 邏輯運算
        //短路運算
        int c = 5;
        boolean d = (c<4)&&(c++<4);//在遇到第一個false時,說明c沒有進行自增
        System.out.println(d);
        System.out.println(c);
  • 簡化運算
package com.Ji.operator;

public class lesson5簡化運算 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        a+=b;//a = a+b
        a-=b;//a = a-b

        System.out.println(a);
        //字串連接符 + ,string型別   **********
        System.out.println(""+a+b);// 前面加空字串的時候就是拼接字符 1020
        System.out.println(a+b+"");// 在后面的話會進行運算   30
    }
}
  • 三目運算子
public class Lesson6三目運算子 {
    public static void main(String[] args) {
        //三元運算子
        // x==true, 結果為y,否則結果為z
        int n = 80;
        String type = n <100 ? "1":"2";  
        System.out.println(type);
    }
}
四、 Java的關鍵字,識別符號和作用域
  • 關鍵字

    與C語言關鍵字類似,可以看圖片

  • 識別符號
    1. 所有的識別符號都應該以字母(A-Z 或 a-z), 美元符($),下劃線開始(_)

    ? 2. 首字符之后的字符可以是字母(A-Z 或 a-z),美元符($),下劃線(_)或是數字的任何字符組合

    ? 3. 注意:不能使用關鍵字作文變數名或方法名
    ?

    ? 4. 可以使用中文名來命名,但不推薦

  • 作用域

    • 類變數
    • 實體變數
    • 區域變數
    public class Variable{
      static int allClicks = 0;//類變數
      String str = "hello world";//實體變數
      
      public void method(){
        int i = 0;//區域變數
      }
    }
    
五、 Java的包機制

包陳述句的語法格式為:

package pkg1[. pkg2[. pkg3...]];

一般是利用公司域名倒置作為包名;

匯入包的陳述句

import package1[. package2...].(classname|*);
六、 Java生成的doc檔案

Javadoc的作用是針對整個方法或者整個類做一個簡要的概述的,使得別人不通過看具體方法代碼就能知道某個方法或者某個類的作用和功能,寫了Javadoc的在別人使用到類時,將滑鼠懸停到類上或者方法上,javadoc會以提示資訊顯示出來,這樣開發者在跳進源代碼中就能知道類或者方法的作用,

Java的流程控制

一、 Java輸入流Scanner

獲取用戶的輸入:Scanner

    Scanner  s = new Scanner(System.in);

通過Scanner類的next()與nextLine()方法獲取輸入的字串,在讀取前我們一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的資料,

package com.Ji.Scanner;

import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        // 創建一個掃描器物件,用于接收鍵盤資料
        Scanner scanner=new Scanner(System.in);
        System.out.println("請輸入資料:");

        //判斷用戶有無輸入字串
        if(scanner.hasNext()){
            //使用next方式接受
            String str =scanner.next();
            System.out.println("輸出的內容為:"+str);

            scanner.close();//凡是屬于IO(輸入輸出流)流類的,不用的話關掉,節省資源
        }
    }
}

hasNext()與hasNextLine()的區別

  • next()
    1. 讀取到有效字符后才可以結束輸入
    2. 對輸入有效字符前的空白,next()方法會自動將其去掉

      eg:Hello world 只輸出Hello 123 456 只輸出 123
    3. 只有輸入有效的字符后才將其后面輸入的空白作為分隔符或者結束符
    4. next()不能得到帶有空格的字串
  • nextLine()
    1. 以Enter為結束符,nextLine()方法回傳的是輸入回車之前的所有字符
    2. 可以獲得空白

      eg: 123 456 輸出123 456

hasNext()與hasNextLine()的衍生


hasNextInt 判斷緩沖是否有整數 有整數就回傳 true 否則 false,

hasNextInt 緩沖區沒有資料的時候就會等待,直到緩沖區有資料,

同:hasNextLine(), nextInt() ,nextByte(), nextShort() , nextLong() , nextFloat(), nextDouble()
9

二、 Switch case 陳述句
//case 具有穿透作用,如果不進行break的話會繼續輸出下一個case
package com.Ji.Scanner;

public class Demo5 {
    public static void main(String[] args) {
        String name = "遠輝";

        //JDK7的新特性,運算式結果可以為字串
        //字符的本質時數字

        //反編譯   java---class (位元組碼檔案)---反編譯IDEA  Ctrl+shift+S+Alt可以打開專案結構
        switch (name){
            case "遠輝"  :
                System.out.println("遠輝");
                break;
            case "狂神" :
                System.out.println("狂神");
                break;
            default:
                System.out.println("無");
        }
    }
}

生成的.class檔案(反編譯)

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.Ji.Scanner;

public class Demo5 {
    public Demo5() {
    }

    public static void main(String[] args) {
        String name = "遠輝";
        byte var3 = -1;
        switch(name.hashCode()) {
        case 941788:
            if (name.equals("狂神")) {
                var3 = 1;
            }
            break;
        case 1178413:
            if (name.equals("遠輝")) {
                var3 = 0;
            }
        }

        switch(var3) {
        case 0:
            System.out.println("遠輝");
            break;
        case 1:
            System.out.println("狂神");
            break;
        default:
            System.out.println("無");
        }

    }
}
三、 For回圈

for回圈的簡寫版

package com.Ji.Scanner;

public class For回圈增強版 {
    public static void main(String[] args) {
        int [] numbers = {10,20,30,40,50,60};
        //遍歷陣列的元素
        for (int x:numbers){
            System.out.println(x);
        }
    }
}

Java的方法

一、方法的定義和呼叫
  • 定義
    • 方法是解決一類問題的步驟的有序組合

    • 方法包含于類或物件中

    • 方法在程式中被創建,在其他地方被參考



      一個方法只完成一個功能 ,一個專案有且只有一個main方法,其余均通過呼叫來完成函式功能,類似于C語言的子函式

    • 方法的定義

    修飾符  回傳值型別  方法名 (引數型別 引數名){
        ...
         方法體
        ...
        return 回傳值;
    }
    
    方法的實體:
package com.Ji.Method;

public class Demo2 {
    public static void main(String[] args) {
        int m = max(20,30);
        System.out.println(m);
    }
    //類似于C語言的子函式
    public static int  max(int a ,int b) {
        int result = 0;
        if(a==b){
            System.out.println("a==b");
            return 0;
        }
        if(a>b){
            result = a;
        }
        else {
            result = b;
        }
        return result;//記得加上回傳值,因為這是一個可以回傳的型別
    }

}
   public  String sayHello(){
       return "hello,world";
   }


    public  void print(){
        return;//回傳一個空方法
    }

    public int max(int a,int b){
       return a>b? a : b; //三元運算子
    }
  • 方法的呼叫
    1. 呼叫方法:物件名.方法名(實參串列)
    2. Java支持兩種呼叫方法的方式,根據方法是否回傳值來選擇
    3. 當方法回傳一個值的時候,方法呼叫通常被當做一個值,
      int larger =  max (30,40)
      
    4. 如果方法回傳值時void,方法呼叫一定時一條陳述句
      System.out,println("Hello world");
      

靜態方法與非靜態方法的呼叫

package com.Ji.oop;

public class Demo2方法 {
    // 靜態方法 static  呼叫相同的類可以立刻輸出,注意類的名字
//    public static void main(String[] args) {
//        Demo3student.say();
//    }


    // 非靜態方法 實體化類
    // 物件型別   物件名 = 物件值
    public static void main(String[] args) {
        Demo3student student = new Demo3student();
        student.say();
    }

}

package com.Ji.oop;
// 學生類
public class Demo3student {
    // 非靜態方法
    public  void say() {
        System.out.println("學生說話啦!!!");
    }
}
  • 引數型別
    1. 形式引數:在方法被呼叫時用于接收外界輸入時的資料
    2. 實參:呼叫方法時實際傳給方法的資料
package com.Ji.Method;

public class Demo1 {
    //main方法  a和b時實際引數
    public static void main(String[] args) {
            int sum = add(1,2);
            System.out.println(sum);
    }
    //此處的a和b時形式引數
    public static int add(int a,int b){
        return a+b;
    }
}
二、方法的多載
  • 多載的定義:在一個類中,有相同函式名稱,但形參不同的函式

    方法多載的規則:

    1. 方法名稱必須相同
    2. 引數串列必須不同(個體不同,或型別不同,引數排列順序不同等)
    3. 方法的回傳型別可以相同也可以不相同
    4. 僅僅回傳型別不同不足以成為方法的多載
       package com.Ji.Method;
    
     public class Demo3 {
     public static void main(String[] args) {
         int m = max(20,20,40);
         System.out.println(m);
     }
    
     //類似于C語言的子函式(通過改變max的型別,可以使得實參改變時適應于以下的函式)
     //1
     public static int  max(int a ,int b) {
         int result = 0;
         if(a==b){
             System.out.println("a==b");
             return 0;
         }
         if(a>b){
             result = a;
         }
         else {
             result = b;
         }
         return result;//記得加上回傳值,因為這是一個可以回傳的型別
     }
    
     //2.
     public static int  max(double a ,double b) {
         int result = 0;
         if(a==b){
             System.out.println("a==b");
             return 0;
         }
         if(a>b){
             result =(int) a;
         }
         else {
             result =(int) b;
         }
         return result;//記得加上回傳值,因為這是一個可以回傳的型別
     }
    
     //3.
     public static int  max(int a ,int b,int c) {
         int result = 0;
         if(a==b){
             System.out.println("a==b");
             result = c;
         }
         if(a>b){
             result = a;
         }
         else {
             result = b;
         }
         return result;//記得加上回傳值,因為這是一個可以回傳的型別
     }
     }
    
    
三、可變引數和遞回
  1. 可變引數
    定義:
  • JDK1.5開始,Java支持傳遞同型別的可變引數給一個方法
  • 在方法宣告中,在指定引數型別后加一個省略號(...)
  • 一個方法中只能指定一個可變引數,它必須是方法的最后一個引數,任何普通的引數必須在它之前宣告,
package com.Ji.Method;

public class Demo4 {
    public static void main(String[] args) {
    Demo4 demo4 = new Demo4();
    demo4.text(1,3,2,5,7);
    }

    public void text (int...i) //可變引數必須放在最后一個,在它之前的必須都進行宣告,且可變引數的型別都應該與main方法相同
    {
        System.out.println(i[0]);
        System.out.println(i[1]);
        System.out.println(i[2]);
        System.out.println(i[3]);
        System.out.println(i[4]);
        System.out.println(i[5]);
    }
}
  1. 遞回的寫法
package com.Ji.Method;

public class Demo5 {
    public static void main(String[] args) {
        int i = 5;
        System.out.println(i + "的階乘是" + f(5));
    }
    // 遞回計算5!
     public static int f(int n){
        if(n == 1 || n == 0){
            return 1;
        }
        else{
            return n*f(n-1);
        }
     }
}
四、值傳遞和參考傳遞
  1. 值傳遞
package com.Ji.oop;

public class Demo4值傳遞 {
    public static void main(String[] args) {
        int a = 1;
        System.out.println(a);//值為1 實參的值是不變的

        Demo4值傳遞.change(a);
    }

    public static void change(int a){
        a = 10;  //傳遞的是形參的地址,最后回傳值為空,值仍未1
    }
}
  1. 參考傳遞
package com.Ji.oop;

//參考傳遞,物件,本質還是值傳遞
public class Demo5參考傳遞 {
    public static void main(String[] args) {
        Person preson = new Person();
        System.out.println(preson.name);//null

        Demo5參考傳遞.change(preson);

        System.out.println(preson.name);//遠輝
    }

    public static void change(Person person){
        //person是一個物件;指向  Person person = new Person();這是一個具體的人
        person.name = "遠輝";
    }

//    定義了一個person類,有一個屬性:name
static class Person{
        String name;//null
}
}

Java的陣列

一、陣列的宣告和創建
  1. 陣列的定義
    首先必須宣告陣列變數,才能在程式中使用陣列
   dataType[]  arrayRefvar;  //首選的方法
   dataType  arrayRefvar[];  //效果相同,但不是首選方法

Java語言使用new創建陣列

 dataType[] arrayRefVar = new dataType[arraySize];

陣列從零開始,獲取陣列的長度 arrays.length

  1. 陣列的初始化
    三種初始化
  • 靜態初始化
int [] a = {1,2,3};
Man[] mans = {new Man(1,1) , new Man(2,2);} 
  • 動態初始化
int [] a = new int [2];
a[0]=1;
a[1]=2;
package com.Ji.Array;

public class 陣列的初始化 {
    public static void main(String[] args) {
        //靜態初始化 創建 + 賦值
        int[] a = {1,2,3,4,5,6,7};
        System.out.println(a[0]);

        //動態初始化:包含默認初始化,int型的默認值是0 string型別的值為none
        int b [];
        b= new int[10];
        b[0] = 1;
        b[2] = 10;
        b[6] = 100;
        System.out.println(b[0]);
        System.out.println(b[1]);
        System.out.println(b[2]);
        System.out.println(b[3]);
        System.out.println(b[6]);
    }
}
  1. 陣列的宣告
package com.Ji.Array;

public class 陣列的宣告 {
    // 變數的型別  變數的名字 = 變數的值
    //陣列的型別
    public static void main(String[] args) {
      int[] n;//     定義

        /*
       int n1[];//      與C/C++語法相同,便于向Java過度
       * */

        // 簡化的代碼還可以寫為   int[] n = new int[10];
        n =new int[10];

        n[0] = 1;
        n[1] = 2;
        n[2] = 3;
        n[3] = 4;
        n[4] = 5;
        n[5] = 6;
        n[6] = 7;
        n[7] = 8;
        n[8] = 9;
        n[9] = 10;
        //計算陣列的長度 陣列的長度用 array.length來表示
        int sum = 0;
        for (int i = 0;i < n.length;i++){
            sum = sum + n[i];
        }
        System.out.println("總和為" + sum);
    }
}
二、陣列的增強
package com.Ji.Array;

public class 陣列的增強 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};
        //JDK 1.5 沒有下表 只限于輸出遍歷的陣列
//        for (int array : arrays){
//            System.out.println(array); }

        // printArray方法
        printArray(arrays);
        }

    public static void printArray(int [] arrays){
        for (int i = 0; i < arrays.length;i++)
        {
            System.out.println(arrays[i]+"");
        }
    }
}
三、陣列的類

API中提供了一個工具類Arrays供我們使用,具有以下常用功能:

  • 給陣列賦值:通過fill方法,
  • 對陣列排序:通過sort,按升序,
  • 比較陣列:通過equals方法比較陣列中元素是否相等,
  • 查找陣列元素:通過binarySearch方法能對排序好的陣列進行二分查找法操作,
package com.Ji.Array;

import com.sun.org.apache.xpath.internal.res.XPATHErrorResources_sv;

import java.lang.reflect.Array;
import java.util.Arrays;

public class 陣列的類 {
    public static void main(String[] args) {
        int[] a = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21};
        System.out.println(a); //[I@1b6d3586
        //列印陣列的元素  toString(arrays)
        System.out.println("================================");
        System.out.println(Arrays.toString(a));
        printArray(a);
        /*
        *   陣列類的本質,是人寫的  有int類 short類 char類
        *   public static String toString(int[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }
        *
        * */
    }
    public static void printArray(int[] a) {
        for (int i = 0; i < a.length; i++) {
            if (i == 0) {
                System.out.print("[");
                if (i == a.length - 1) {
                    System.out.println(a[i] + "]");
                } else {
                    System.out.println(a[i] + ",");
                }
            }
                                            }
    }
}
四、冒泡排序
package com.Ji.Array;

import java.util.Arrays;

public class 冒泡排序 {
    public static void main(String[] args) {
        int [] array = {1,3,5,51,63,20,7,9,12,17,23};

        int [] sort;//呼叫自己寫的排序的方法
        sort = sort(array);

        System.out.println(Arrays.toString(sort));
    }

    public static  int[] sort(int [] array) {
        int tem ;//臨時變數
        //外回圈
        for (int i = 0; i < array.length - 1; i++) {
            boolean flag = false;//優化冒泡排序 如果陣列已有部分排好序,則無需再進行排序

            for (int j = 0; j <= array.length -1-i; j++) {
                if (array[j + 1] < array[j]) {
                    tem = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tem;
                    flag = true;
                }
            }
            if (flag) {
                break;
            }
        }
        return array;
    }
}
五、二維陣列
  int a[][] = new int [2][5];

Java的面向物件

一、類與物件的創建
  1. 類的定義:類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但是并不能代表一個具體的事物,
  2. 物件是抽象概念的具體實體
  • 能夠體現出特點,展現出功能的是具體的實體
  • eg:張三是人的一個具體實體,張三家的旺財是狗的一個具體實體,
二、什么是面向物件
  • 面向物件編程(Object-Oriented Programming,OOP)
  • 面向物件的本質:以類的方式組織代碼,以物件的組織封裝資料
三、創建與初始化物件

使用關鍵字new來創建物件

  • 使用new關鍵字創建的時候,除了分配記憶體空間之外,還會給 創建好的物件 進行默認的初始化以及 對類中構造器的呼叫,
  • 類中的構造器也稱為構造方法,是在進行創建物件的時候必須要呼叫的,有如下兩個特點:


    1.必須和類的名字相同

    2.必須沒有回傳型別,也不能寫void
四、構造器
package com.Ji.oop;

public class Demo6構造器 {
    //一個類即使什么都不寫,它 也會存在一個方法
    //顯示的定義一個構造器    構造器特點: 1. 必須和類的名字相同   2.沒有回傳值,且沒有void
    String name;

    // 1. 使用new關鍵字,本質實在使用構造器,new出來默認產生一個構造器
    // 2.用來初始化值

    // 構造器
    public  Demo6構造器(){
//            這是無參構造
    }
    // 有參構造:一旦定義了有參構造,則無參就必須顯示定義
    public  Demo6構造器(String name){
        this.name = name;//引數傳遞下來的name
        //左邊:物件本身的name (String name;)
    }
//    快捷鍵 alt + insert
}

this.一般代表當前類的值,后面=一般是引數傳進來的

package com.Ji.oop;

public class Demo6構造器1 {
//
public static void main(String[] args) {
//
    Demo6構造器 Demo6構造器 = new Demo6構造器("yuanhui");
    System.out.println(Demo6構造器.name);
}
}
五、小結
  1. 記憶體分析

2.小結

  1. 類與物件
    類是一個模板,抽象,物件是一個具體的實體
  2. 方法
    定義,呼叫 !
  3. 對應的參考
    參考型別: 基本型別(8)
    物件是通過參考來操作的:堆疊-->堆
  4. 屬性
    • 默認初始化:數字 0 0.0
    • char :u0000
    • boolean :false
    • 參考:null


      修飾符 屬性型別 屬性名 = 屬性值!
  5. 物件的創建和使用
    • 必須使用new 關鍵字創造物件 ,構造器 Person p1 = new Person();
    • 物件的屬性 p1.name
    • 物件的方法 p1.sleep

  6. 靜態的屬性 屬性
    動態的行為 方法

Java的特性

一、封裝
  1. 封裝的定義:
  • 類的內部資料操作細節自己完成,不允許外部干涉
  • 經暴露少量的方法給外部的類
  • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過介面來訪問,這稱為資訊隱藏
  1. 屬性私有,get/set
  2. Student類
    package com.Ji.oop.封裝;

public class Student {
    //屬性私有 private
    private String name; //名字
    private int id;       //學號
    private char sex;     //性別
    private int Age;

//    提供一些可以操作的這個屬性的方法
//    提供一些public的get,set的方法

    //  get 獲得這個資料
    public String getName() {
        return this.name;
    }

    //set 給這個資料設定值
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        if (age > 120 || age < 0) {
            this.Age = 0;
        } else {
            this.Age = age;
        }
    }
}

Application類

package com.Ji.oop.封裝;

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();

        s1.setName("遠輝");

        System.out.println(s1.getName());

        s1.setAge(-1);//不合法的
        System.out.println(s1.getAge());
    }
}

二、繼承
  1. 繼承的定義:繼承的本質是對某一批類的抽象,從而實作對現實世界更好的建模
  2. extands 子類是父類的擴展
  3. Java中只有單繼承,沒有多繼承!
  4. 繼承是類與類之間的一種關系,此外,類與類之間的關系還有以來、組合和聚合等,
  5. 繼承關系的兩大類,一個為子類(派生類),()一個為父類(基類)

子類可以繼承父類的所有方法


Application類

package com.Ji.oop.繼承;

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();
        System.out.println(student.money);
    }
}

Person類

package com.Ji.oop.繼承;

public class Person {
    //public
    //protected
    //default
    //private
        int money = 10_0000_0000;

    public void say(){
        System.out.println("學生說了一句話");
//        ctrl + H 找到繼承的類
//        在Java中,所有的專案都繼承Java的object的類
     }
}

Student類

package com.Ji.oop.繼承;
// 學生 is 人:派生類,子類
// 子類繼承了父類,就會擁有父類的所有方法!
public class Student extends Person{

}
  1. super

    super注意點
    1. super呼叫父類的構造方法,必須在構造方法的第一個
    2. super 必須只能出現在子類的方法或者構造方法中!
    3. super和this 不能同時呼叫構造方法

      與this的對比
    4. this 本身呼叫者這個物件
    5. super 代表父類物件的應用


      前提
    6. this 沒有繼承也可以使用
    7. super 只能在繼承條件下使用


      構造方法
    8. this()本類的構造
    9. super()父類的構造
public void text(String name){
System.out.println(name);student.text(name:"")中的name
System.out.println(this.name);子類中的name
System.out.println(super.name);父類中的name
}

Application類

package com.Ji.oop.繼承.super詳解;

import com.Ji.oop.繼承.Student;

public class Application {
    public static void main(String[] args)     {
        Student student = new Student();
    }
}

Student類

package com.Ji.oop.繼承.super詳解;

import com.Ji.oop.繼承.Person;

public class Student extends Person {

    public Student() {
        //    隱藏代碼,呼叫了父類的無參構造
        super(); //呼叫父類構造器必須在子類構造器的第一行
//        子類呼叫父類的有參,如果 super() 那么是呼叫不了父類的有參,它默認呼叫的是父類的無參;
//        故如果要呼叫父類的有參的話,就得在子類中加如引數的名字super(name:"name")
        System.out.println("Student無參執行了!");
    }
}

Person類

package com.Ji.oop.繼承.super詳解;

public class Person {
    public Person(){
        System.out.println("Person無參執行了!");
    }
}
  1. 方法的重寫
  • 重寫:需要有繼承的關系,子類重寫父類的方法
    1. 方法名必須相同
    2. 引數串列必須相同
    3. 修飾符:可以擴大但不能縮小:public->proteced->Default->private
    4. 拋出的例外,可以擴大但不能縮小
  • 為啥需要重寫?
    父類的功能,子類不一定需要、不一定滿足
    快捷鍵 Alt + insert; override
    A
package com.Ji.oop.方法重寫.靜態方法;

//子類
public class A extends B{
//    @Override 重寫
    @Override //注釋,有功能的
    public void text(){
        System.out.println("A->text");
    }
}

B

package com.Ji.oop.方法重寫.靜態方法;

public class B {
    public void text(){
        System.out.println("B->text");
    }
}

Application

package com.Ji.oop.方法重寫.靜態方法;

public class Application {
//    方法的呼叫只和這個專案、定義的資料型別有關
public static void main(String[] args) {
    A a = new A();
    a.text();//  A

//    父類的參考指向子類
    B b = new A();  //子類重寫了父類的方法
    b.text();// A

    /*
    public void text()
    非靜態方法下的輸出均為A
    public void text()
    靜態方法下的輸出一個是A,一個是B
    */


    /*
    * b 是 A new出來的物件,因此呼叫了A的方法
    * static是靜態的方法,即是類的方法,而非靜態是物件的方法
    * 有static時,b呼叫了B類的方法,b是有B類定義的
    * 無static時,b呼叫的物件的方法,b是由A new的
    * */
}
}

輸出結果

A->text
A->text
三、多型
  1. 定義:同一方法可以根據發送物件的不同而采取多種不同的方式
    (即一個物件的實際型別是確定的,但是可以指向物件的參考型別有很多)
  2. 多型存在的條件
    • 有繼承關系
    • 子類重寫父類的方法
    • 父類參考指向子類物件


      Application
package com.Ji.oop.多型;

public class Application {
    public static void main(String[] args) {
        //一個物件的實際型別是確定的
        //new Student();
        //new Person();

        //可以指向的型別就不確定了:父類的參考指向子類

        //student 能呼叫的方法就是自己的或者繼承父類的
        Student s1 = new Student();

        // person 父型別,可以指向子類,但是不能呼叫子類獨有的部分
        Person s2 = new Student();
        Object s3 = new Student();
        //

        /*s2.run();//子類繼承了父類的全部方法*/
        s1.eat();//子類方法的重寫,執行子類的方法
        ((Student) s2).eat();//子類重寫了父類的方法,強制轉化后執行子類的方法
    }
}

Person

package com.Ji.oop.多型;

public class Person {

    public void run(){
        System.out.println("run");
    }
}
/*
* 多型的注意事項
* 1. 多型使方法的基礎
* 2. 父類和子類,有聯系,型別轉換例外! ClassCastException!
* 3. 存在條件:繼承關系,方法需要重寫,父類參考指向子類物件
*
*   1. static 方法,屬于類,不屬于實體
*   2. final 常量
*   3. private 方法,是私有的,不能重寫
* */

Student

package com.Ji.oop.多型;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }
    public void eat(){
        System.out.println("eat");
    }
}
  1. instanceof詳解

Application

package com.Ji.oop.instancof;

import com.Ji.oop.多型.Student;

public class Application {
    public static void main(String[] args) {
        //Object > String
        //object > Person > Teacher
        //object > Person > Student
        Object object = new Student();

        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof  Object);//true
        System.out.println(object instanceof Teacher);//False
        System.out.println(object instanceof String);//False
        System.out.println("=================================================");

        Person person = new Student();
        System.out.println(person instanceof Student);//true
        System.out.println(person instanceof Person);//true
        System.out.println(person instanceof  Object);//true
        System.out.println(person instanceof Teacher);//False
//        System.out.println(person instanceof String);//False  編譯報錯,person和String是同級的

        Student student = new Student();
        System.out.println(student instanceof Student);//true
        System.out.println(student instanceof Person);//true
        System.out.println(student instanceof  Object);//true
//        System.out.println(student instanceof Teacher);//False
//        System.out.println(student instanceof String);//False

Person

package com.Ji.oop.instancof;

public class Person {
}

Student

package com.Ji.oop.instancof;

import com.Ji.oop.多型.Person;

public class Student extends Person {

}
  • instanceof能否編譯通過
 System.out.println(X instanceof  Y);判斷x所指向的型別是不是y所指向的型別
  1. 多型小結
    1. 父類指向參考的物件
    2. 把子類轉換為父類,向上轉型
    3. 把父類轉換為子類,向下轉型,強制轉換,可能會有方法的丟失
四、static關鍵字詳解

1.變數

package com.Ji.oop.Static小結;

public class Student {
    private static int age;//靜態的變數
    private double score;//非靜態的變數

    public static void main(String[] args) {
        Student s1 = new Student();


        System.out.println(Student.age);//靜態輸出
        System.out.println(s1.score);
        System.out.println(s1.age);
    }
}
  1. 方法
    非靜態方法可以呼叫靜態方法中的所有東西,靜態方法呼叫不了非靜態方法,

  2. 代碼塊

package com.Ji.oop.Static小結;

public class Person {
    {
        System.out.println("匿名代碼塊");
    }
    static{
        System.out.println("靜態代碼塊");
    }
    public Person(){
        System.out.println("構造方法");
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println("===================================");
        Person p2 = new Person();
    }
}

靜態代碼塊值執行一次,并且最先輸出!!!

輸出結果:
靜態代碼塊
匿名代碼塊
構造方法
===================================
匿名代碼塊
構造方法
  1. 匯入包

Java的抽象類

抽象類的特點

  1. 不能new這個抽象類,只能靠子類來約束
  2. 抽象類可以寫普通的方法
  3. 抽象的方法必須在抽象類中
package com.Ji.oop.抽象類;

public abstract class A {
    public abstract void doing();//abstract,只有方法名字,沒有方法的實作
}

Java的介面

  • 介面的本質是契約 比如我們規定好了某種東西:如果你是汽車,你就能開
  • 介面的作用
    1. 約束
    2. 定義一些方法
    3. public abstract
    4. 常量 public static final
    5. 介面不能被實體化,介面中沒有構造方法
    6. implements可以實作多個介面
    7. 必須重寫介面中的方法
package com.Ji.oop.介面;

//interface 定義的關鍵字,介面都需要有實作類
//如果要在介面里面實作所有的定義,必須在類中重寫方法
public interface UserService {
   //常量 public static final
   int age = 99;
   // 介面中定義的方法都是抽象的 public abstrac
   void add(String name);
   void delete(String name);
   void update(String name);
   void query(String name);
}

Java的內部類

內部類

  1. 成員內部類
  2. 靜態內部類
  3. 區域內部類
  4. 匿名內部類

Java的報錯型別總結

  1. Error 和 Exception
  • 檢查性例外:eg:打開一個空檔案,寫函式呼叫函式陷入死回圈等
  • 運行時例外:運行的時候才報出例外
  • 錯誤: 堆疊溢位
    Exception
    1. 運行時例外
    2. 陣列下標越界
    3. 空指標例外
    4. 算數例外
    5. 丟失資源
    6. 找不到類
  1. 捕獲和拋出的例外
  2. 自定義例外和小結

小結

  • 剛剛開始入門學習后端開發,從最基礎的Java語法開始學起,具體學習路線參照狂神說Java來學習的
  • 后期學習還有些地方沒有完善,還會繼續努力的!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463445.html

標籤:Java

上一篇:自己寫的第一個java專案!

下一篇:尤娜故事-迷霧-springboot扮酷小技巧

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more