【Java】Day1-基礎基礎

Part1

一.Java基礎介紹

  • Java是一門後臺開發語言,使用的是大型Web系統開發,APP後臺服務器首選開發語言。
  • Java語言特點:跨平臺,安全性高
  • 特點:面向對象
  • 編譯性解釋語言:編譯後會新建一個out文件

1.配置環境變量

JDK

JDK=Java Development Kit(Java開發工具)
提供了很多Java命令,像執行,編譯等,並且JDK內置了JRE(Java運行環境),提供了豐富的類庫供我們調用去完成程序開發
Javac 編譯chengcheng.lass
java 執行

配置環境變量

基礎,跳過

編碼格式改變成UTF-8
JRE配置

選擇jdk環境裏面的jre以便於以後可以直接看到源代碼

2.編程準備

新建一個java project
新建一個package
新建一個class,第一個字母要大些

.HelloWorld示例
package test.lemmon;

public class HelloWorld {  //新建一個類
	
	/**主方法,程序執行的main,這裏是程序自動執行的
	 * @param args
	 */
	 
	// 公開的任何人都可以調用,靜態的,返回數據爲空,main函數名稱
	public static void main(String[] args){
		System.out.println("HelloWorld");		
	}
}
java文件設置

相比於py中一個文件可以存放多個類,java中也可以,但是:

  • java文件中可以有多個類
  • java文件中如果有一個public類,則這個public類必須和文件同名,且有且只有一個public類。也就是可以有其他私有類
  • java中的類必須有一個main函數,類似於C中的main函數作爲程序運行的起點。
  • 推薦是一個文件一個類,類名和文件名一致
  • 類名使用駝峯命名
編譯和運行
  • 1.javac工具把java程序編譯成class程序
  • 2.java虛擬機把class程序執行

src目錄:存放源代碼

IDEA的快捷鍵
保存:Ctrl + S
刪除:Ctrl + D
撤回:Ctrl + Z
撤銷:Ctrl + Y(恢復上一步操作,與CTRL+Z作用相反)
提示:alt + /   
註釋:ctrl+/ ctrl+shift+/   command+ctrl+/
取消註釋:ctrl+/  ctrl+shift+ \
查找:ctrl+f   
搜索:ctrl+h
代碼行位置交換:alt+↓  alt+↑
下一行插入空行:Shift+Enter
代碼格式化:ctrl+shift+f	
批量編輯:shift+alt+a
顯示打開面板:alt+shift+w
搜文件名:Ctrl+shift+R
顯示類結構:Ctrl+O
顯示繼承結構:Ctrl+T
代碼格式化:Ctrl+Shift+F

3.分隔符

註釋

單行註釋

//
ctrl+/:增加註釋
ctrl+/:取消註釋

多行註釋

	/*
	 *
	 */
ctrl+shift+/:增加註釋
ctrl+shift+\:取消註釋
	 

二.開始編程

1.Java基本類型

[外鏈圖片轉存失敗(img-HLLgno2B-1566289224474)(DA8F2C45F37B453AADA2CDF6A947DF69)]

編譯性的語言

2.編碼規範

在命名文件的時候一般選擇小駝峯命名方式,在命名類的時候一般選擇大駝峯命名方式

3.引用數據類型

引用數據類型存儲的是一個變量的地址,類似於指針
涉及的數據類型是:

  • 接口
  • 枚舉
數組
  • 一維數組
     //創建一維數組
        int[] arr1  = new int[4];
        int[] arr2 = {1,2,3,4};
    //這種可讀性高
        arr1[i]= i;
    

有new的意思是開闢內存,長度是4個。一個數組的類型在初始的時候必須被定義,但是數組的長度可以不確定

  • 當不確定數組長度的時候
// 數據類型 數組名稱[] =null;(聲明)
 String[] name2 = null;
  • 然後實例化數組
//賦予長度
name2 = new String[3];

//賦值
name2[1] = "Wendy";


  • 二維數組

創建二維數組

	//創建二維數組
		int [][] ary1 = new int [4][4];
		int [][] ary2 = {{1,2},{2},{3,6},{4,7}};	

4.運算符分類

基本分類

算術運算符
[外鏈圖片轉存失敗(img-SIExohJG-1566289224476)(9886F28033F149D581F6E6CEAF1D1973)]

比較運算符
[外鏈圖片轉存失敗(img-QQr0hrZm-1566289224477)(678C1F72F77048CB88C8FA15F8CABA2C)]

賦值運算符
[外鏈圖片轉存失敗(img-DjMf7r5N-1566289224477)(BC1FEDACB634410DA4DC0880D4B515AE)]

邏輯運算符
[外鏈圖片轉存失敗(img-Cxck8O3S-1566289224478)(8FA65C0E9D3040979304A45D8AF5F7BE)]

條件預算符
  • A?B:C
  • 如果A成立則執行B,否則執行C
運算順序
  1. ++
  2. 括號
  3. /,%(從左到右)
  4. +,-(從左到右)

三.循環

1.for循環

  • 普通的for循環
public class forfor {
	public static void main(String[] args){
		for (int i=0;i<5;i++){
			//換行輸出
			System.out.println(i);
		}			
		for (int j=0;j<5;j++){
			//不換行輸出
			System.out.print(j);
		}
		
		//普通for循環
		int[] arr={10,20,30};
		for (int i=0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
	}
}
  • 增強for循環(jdk1.5)
public static void main(String[] args){
        String[][] name = {
                {"Ben","Tom","Jack","seven1"},
                {"Ben","Tom","Jack","seven2"},
                {"Ben","Tom","Jack","seven3"}
        };

        for (String[] i:name){
            for (String j:i){
                System.out.println(j);
            }
            System.out.println("--------------");
        }
        /**
        *for(數組類型[] i:數組名稱){
            
        }
        *把每次遍歷的數組存放到i中
        *蕾西與python中的for i in Arry:
        */
    }

2.while循環

  • do…while
		do{
			b=b+a;
		}
		while(a>0);
  • while
		while(a>0){
			b=b+a;
			
		}

3.continue和break

  • 跳出本次循環(忽略本次循環)continue
  • 跳出整個循環(結束整個循環)break

4.if語句

  • if…else if
int sixAge = 20;
		int shadowAge = 20;
		if (sixAge > shadowAge) {
			System.out.println("1:six是shadow的大哥");
		}else if (sixAge < shadowAge) {
			System.out.println("2:shadow是six的大哥");
		}else if (sixAge == shadowAge) {
			System.out.println("3:six的年齡和shadow的一樣大");
		}

5.switch語句

switch(){
    case a:
    break;
    case b:
    break;
    
    default:
    break;
}

  • 舉個例子
int day = 8;
		switch (day) {
		case 1:
			System.out.println("這是星期一");
			break;
		case 2:
			System.out.println("這是星期二");
			break;
		case 3:
			System.out.println("這是星期三");
			break;
		case 4:
			System.out.println("這是星期四");
			break;
		case 5:
			System.out.println("這是星期五");
			break;
		case 6:
			System.out.println("這是星期六");
			break;
		case 7:
			System.out.println("這是星期天");
			break;
		default:
			System.out.println("非法的值");
			break;
		}

這裏如果沒有break,就會繼續運行case

int day = 5;
		switch (day) {
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			System.out.println("這是工作日");
			break;
		case 6:
		case 7:
			System.out.println("這是週末,大家可以去浪了");
			break;
		default:
			System.out.println("非法的值");
			break;
		}

default用於執行其他非case裏面的場景

6.三段式

int sixAge = 22;
int shadowAge = 20;
String result = sixAge > shadowAge ? "six是shadow的大哥" : "six不是shadow的大哥";

類似於:if_else場景

if (sixAge > shadowAge) { // 如果條件滿足纔會進入這個分支,否則不會進入
			System.out.println("six是shadow的大哥");
		} else {
			System.out.println("six不是shadow的大哥");
		}

四.變量

局部變量&全局變量

局部變量:

  • 1:必要要初始化
  • 2:沒有修飾符
String name = "six";

全局變量:

  • 1:可以不用初始化,不初始化就爲對應數據類型的默認值(缺省值null)
  • 2: 有修飾符
  • 3:但是注意當未空指針的時候訪問它的屬性或者方法回報錯NullPointerException
private static int aInt = 10;

五.函數定義

在java中,定義函數需要三個部分:修飾符,類方法,返回值

修飾符

  • public
  • private
  • protected

類方法

  • static

返回值類型

這裏就是java的基本數據類型

舉個例子


修改符  static 返回值類型  方法名(形參類型  形參名,形參類型  形參名..)
{
//函數在這裏
}

六.運算

和python不同的是,在java中字符串類型的比較使用的是equls,int類型的數據使用==比較。

Part 2

一.函數

1.函數的定義

    public static int add(int a,int b){
        return a+b;
    }
  • 修飾符:public,protected,private,默認修飾符,從左往右權限逐漸降低。
訪問權限 子類 其他包
public v v v v
protected v v v x
default v v x x
private v x x x

2.函數參數的不定項

多餘輸入參數不定的場景,這裏需要一個多參數的輸入值。

  • 給定一個容器([] args)用於存儲所有的參數,然後使用for循環把參數取出來。
public static int plus(int[] args){
        int sum = 0;
        for (int i=0;i<args.length;i++){
            sum += args[i];
        }
        return sum;
    }
  • 另一種表示
  • 這是JDK1.5的新特性可變參數

/**使用方法:
* public static 返回值類型 方法名稱 {數組類型...參數名稱}
*/

public static int plus(int...args){
        int sum = 0;
        for (int i=0;i<args.length;i++){
            sum += args[i];
        }
        return sum;
    }

3.函數的static

static靜態函數,也就是類函數,當這個類沒有被加載出來也可以調用的全局函數,參考例子1。

  • 例子1
public class Test {
    public static void main(String[] args) {
		int result = plus(1, 2);
		int result2 = Test.plus(1, 2);
		System.out.println(result);
		System.out.println(result2);
    }

    public static int plus(int a, int b) {
        return a + b;
    }
}
  • 但是,當沒有加上static的時候,這個方法就是對象方法,需要實例這個類纔可以使用
/**創建對象語法:
* 類名  對象名  = new 類名();
*/

public class Test {
    public static void main(String[] args) {
        Test tester = new Test();//創建一個對象
        System.out.println(tester.plus(11, 2));
    }
    
    public int plus(int a, int b) {
        return a + b;
    }
}

二.類與對象

類和對象是java的基礎,

1.創建一個類

java本身就是以類爲基礎創建的

public class newMember {

    // 手機號
    public String phone;
    // 密碼
    public String password;
    // 註冊名
    public String regName;
    // 餘額
    public double amount;

    // 1:註冊
    public void register(String mobilePhone, String pwd) {
        if (mobilePhone.length() == 11 && pwd.length() == 6) {
            System.out.println("註冊成功");
        } else {
            System.out.println("信息有誤");
        }
    }

    // 2:登錄
    public void login(String mobilePhone, String pwd) {
        if (mobilePhone.length() == 11 && pwd.length() == 6) {
            System.out.println("登錄成功");
        } else {
            System.out.println("賬號或者密碼錯誤");
        }
    }
}

2.對象的使用

這裏假設已經擁有一個已知的Member類,實例化一個對象叫shadow

// 類名稱 對象名稱 = new 類名稱();
Member shadow = new Member();
  • 或者是:
// 類名稱 對象名稱 = null; 
Member shadow = null;
// 對象名稱 = new 類名稱(); //實例化對象
shadow = new Member();
  • 調用對象
public class newTester {
    public static void main(String[] args) {
        newMember shadow = new newMember();
        shadow.phone="13754000125";
        shadow.password ="123456";
        shadow.login(shadow.phone,shadow.password);
    }
}

3.構造函數

構造函數是存在於類中一個和類名相同的函數,在創建對象並初始化的時候會自動調用這個函數。

  • python
    def __init__(self,uid):
        self.uid = uid
        self.date = GetTime()
  • java
 public newMember(){
        System.out.println("這是個無參數的構造函數");
    }
  • 然後需要輸入參數時,需要使用this方法對輸入的參數實例化
    public newMember(String phone) {
        this.phone = phone;
    }

三.內存地址(疑惑)

1.棧內存

理論比較複雜,通俗說的話棧內存是已經確定好大小的

  • 同一個字符串,不同命名但是位置是相同的
String str1 = "hello";//字面值--》字符串池
System.out.println(System.identityHashCode(str1));//1531448569

String str0 = "hi";//字面值--》字符串池
System.out.println(System.identityHashCode(str0));//1867083167

String str2 = "hello";
System.out.println(System.identityHashCode(str2));//1531448569

2.堆內存

堆內存是針對對象來分配的,每次new的時候都會創建一個新的內存空間

String str3 = new String("hello");//通過new創建的--》堆內存
System.out.println(System.identityHashCode(str3));//284720968

String str4 = new String("hello");
System.out.println(System.identityHashCode(str4));//189568618

四.包裝類

把基本數據類型封裝成一個類,可以調用數據類型的方法進行數據處理。

Integer

  • Integer.MAX_VALUE
  • Integer.MIN_VALUE
    獲取最大長度;獲取最小長度
  • Integer.parseInt(str)
    將字符串轉爲整型
int i = Integer.parseInt(str);
		System.out.println(i);

獲取類型

public static String getType(Object test) {
		return test.getClass().getName();
	}

五.面向對象三大特徵

1.封裝

  • public和protect和private
    在之前創建了一個Member類,擁有姓名手機這些屬性
public class Member {
    public String phone;
    public String password;
    public String regName;
    public double amount;

}

但是這樣的話屬性是可以直接使用的

 public static void main(String[] args){
        Member june = new Member();
        june.phone = "1388888";
        System.out.println(june.phone);
    }

所以需要對屬性的權限進行設置,換成private,在通過對外的函數來修改屬性,這裏增加setPhone和getPhone方法

public class Member {

    private String phone;
    private String password;
    private String regName;
    private double amount;

    public void setPhone(String phone){
	 	if (phone.length()==11) {
	 		this.phone = phone;
	 	}
	 	else
	 	    System.out.println("設置失敗");
    }

    public String getPhone(){
        return phone;
    }
}

這樣設置之後Tester就不可以直接對phone屬性操作

public static void main(String[] args){
        Member june = new Member();
        june.setPhone("13838000238");
        System.out.println(june.getPhone());

    }
封裝總結
  • 將對象內部的屬性封裝起來,只提供操作對象屬性的公共方法
  • 通過公開方法訪問數據,可以從方法里加入邏輯控制,避免不合理的訪問可進行數據檢查,保證數據完整性,防止不希望的交互和非法的訪問便於後期修改,提高代碼的可維護性封裝的實現
  • 主要表現:
  • 1:屬性私有化:隱藏對象的屬性和實現細節,不允許外部直接訪問
  • 2:使用公開的方法操作和訪問屬性

2.繼承

使用extends繼承,用於繼承父類的方法。

public class Borrower extends Member {}
重寫

子類可以重新定義父類的方法,重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!

3.多態

當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。

多態的好處:

  • 可以使程序有良好的擴展,並可以對所有類的對象進行通用處理

多態的實現方式:

  • 方式一:重寫:
  • 方式二:接口
  • 方式三:抽象類和抽象方法
重載

可以在同一個類中存在多個函數,函數名稱相同但參數列表不同。這就是函數的重載(overlording)。這是類的多態性表現之一。

  • 特徵:
  • 函數名和返回值類型完全一致。
  • 參數的數量不同、或數量相同而類型和次序不同,以方便JVM區分到底調用哪個函數。

六.String類型

1.方法

  • startsWith & endWith :判斷是否以指定字符串開頭或結尾
String str = "Hello World";
System.out.println(str.startsWith("H"));
System.out.println(str.endsWith("B"));
  • substring:字符串截取
  • 2:end 以及 2:5
String str2 = str.substring(2);
System.out.println(str2);
String str3 = str.substring(2, 5);
System.out.println(str3);
  • split:字符串拆分
 String str4 = "He:llo:Wor:ld";
        String[] arry = str4.split(":");
        for (String i: arry) {
            System.out.println(i);
        }
        System.out.println(str4);
  • indexOf:lastIndexOf: contains:字符串查找
 String str5 = "Hello World";
        //index:返回找到字符的首個位置,沒有找到返回-1
        System.out.println(str5.indexOf("l"));
        //用於判斷字符串中是否包含這個字符
        System.out.println(str5.contains("World"));
        //lastIndexOf() 方法可返回一個指定的字符串值最後出現的位置
        System.out.println(str5.lastIndexOf("l"));

  • 字符串比較 equals : equalsIgnoreCase
    String str6 = "Hello World";
        String str7 = "hello world";
        //equals 用於判斷兩個字符串是否相同,區分大小寫
        System.out.println(str6.equals(str7));
        //equalsIgnoreCase 用於判斷兩個字符串是否相同,不區分大小寫
        System.out.println(str6.equalsIgnoreCase(str7));
  • 字符串拼接 concat
      String str8 = "Hello";
        System.out.println(str8.concat("World"));
  • 判空 isEmpty
        String str9 = "";
        System.out.println(str9.isEmpty());
  • 替換 replace replaceFirst replaceAll
String str13 = "Hello World";
        //replace:替換這個字符串中的所有l成k
        System.out.println(str13.replace("l","k"));
        //replaceFirst:替換此字符串匹配給定的正則表達式的第一個子字符串,只換一個
        System.out.println(str13.replaceFirst("l","k"));
        //replaceAll:替換此字符串所有匹配給定的正則表達式的子字符串。
        System.out.println(str13.replaceAll("l","k"));

  • valueOf:字符串描述
//返回給定參數的原生 Number 對象值;參數可以是原生數據類型, String等
        Integer a =Integer.valueOf(9);
        Double b = Double.valueOf(5);
        Float c = Float.valueOf("80");

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

Part 3

一.容器類

1.可變數組ArrayList

java已經封裝好的類,但是這樣的話並且通過<>括號設定這個數組的類型,也稱爲泛型

  • 創建Array對象
import java.util.ArrayList;
ArrayList <String> arylist = new ArrayList();
  • 添加數據 list.add(…);
  • 但是添加其他類型的數據會報錯
        arylist.add("Hello");
        arylist.add("Six");
        arylist.add("Five");
        arylist.add("Four");
        arylist.add("Three");


  • 取出數據 list.get(index);
        String name = arylist.get(0);
		System.out.println(name);
  • 移除數據:remove(…)
arylist.remove(1);
System.out.println(arylist.get(1));
  • 獲取list集合的大小:size()
int size = arylist.size();
System.out.println(size);
  • isEmpty(…),判空函數
boolean flag = arylist.isEmpty();
System.out.println(flag);
  • contains(…),判斷是否包含某數據
System.out.println(arylist.contains("Happy"));
  • set(…),修改某個位置上的數據
        arylist.set(1, "Tom");
        System.out.println(arylist.get(1));
  • 增強for循環
ArrayList<String> names = new ArrayList();
		names.add("Shadow");
		names.add("Six");
		names.add("Edsion");
		names.add("Edsion");

for (String name : names) {
			System.out.println(name);
		}
  • 迭代器
  • 當有下一個元素的時候就自動獲取下一個元素
for (Iterator iterator = names.iterator(); iterator.hasNext();) {
			String name = (String) iterator.next();//獲得下一個元素
			System.out.println(name);
		}

另一種寫法

while(iterator.hasNext()){
			String string = (String) iterator.next();
			System.out.println(string);
		}

2.HashSet

java已經封裝好的類,特點:

  • 數據排列是無序的
  • 數據不可以重複
        HashSet<String> haset = new HashSet<String>();
  • 添加數據
        haset.add("Shadow");
        haset.add("six");
        haset.add("six");
        haset.add("Edsion");
        System.out.println(haset);
        //[Edsion, six, Shadow]
  • size() 獲取集合的大小
  • 移除數據:remove(…)
  • contains(…),判斷是否包含某數據
  • clear(), 將集合裏的所有數據清空
        haset.clear();
     	System.out.println(haset.size());
  • toArray(),將集合轉化成爲對應數據類型的數組
//獲取haset裏面的元素形成一個數組
Object[] objects = haset.toArray();
		for (Object object : objects) {
		//把數組裏面的數據取出,轉換成對應的字符串
			String str = (String) object;
			System.out.println(str);
		}

3.HashMap

以鍵值對的形式來保存數據,鍵不可以重複,類似於字典

HashMap<String, String> haMap = new HashMap<>();
  • 存放數 據put(…,…)
hamap.put("regName", "Shadow");
hamap.put("Hello", "World");
hamap.put("age", "20");
hamap.put("gender", "男");
System.out.println(hamap);
//{Hello=World, regName=Shadow}
  • 取數據 get(…)
String name = hamap.get("regName");
System.out.println(name);
//Shadow
  • 移除:remove(…)
hamap.remove("age");
System.out.println(hamap.get("age"));
//null
  • 獲取所有的鍵:keySet(…)
  • 使用此方法可以獲所有鍵值對的集合,set類型
  • hashset是set的一個子類,所以會擁有set集合的所有方法
Set<String> set = hamap.keySet();
		for (String key : set) {
			System.out.println(key);
		}
  • 獲取或有的值:values(…)
  • 和key不同的是value可以的話重複的,但是key是唯一的
Collection<String> values = hamap.values();
		for (String value : values) {
			System.out.println(value);
		}
  • size()
  • containsKey(…)
  • containsValue(…)
  • 遍歷
//獲得map的所有的key 的集合(固定api,獲取所有的key的集合)
		Set<String> keySet = map.keySet();
		//遍歷這個key的集合,把所有的值都遍歷出來
		for (String key : keySet) {
			System.out.println(key + "-->" + map.get(key));
		}

//藉助Entry模塊
        for (Map.Entry entry : hamap.entrySet()) {
            System.out.println(entry.getKey()+":"+entry.getValue());

        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章