主頁 > 後端開發 > Java練手專案(尚硅谷的),不涉及框架,資料庫等。

Java練手專案(尚硅谷的),不涉及框架,資料庫等。

2023-05-05 08:12:43 後端開發

軟體:idea
我是先建立了一個空白的專案,自己創建的src包和其下面的包,
問題一:建立包之后發現格式為src.com.tjp.bean 沒辦法建立其他與bean同級的service test utils view 等,只允許繼續建立bean的子包,
解決: 這是因為idea自動會折疊空白包,(不同版本的idea可能和我的位置不太一樣,但是都在那個齒輪里,第一步都先點擊那個齒輪,看看里面有沒有提到fold empty等詞匯,如果有,又打了對勾,那就取消一下試試嘛,反正大不了記住位置,一會兒再勾回來嘛,)
image


把壓縮空的中間軟體包取消勾選,就可以看到可以正常建立空白包的子包了,
專案結構如下圖:

  • 看以下代碼須知:本人是個菜鳥,才學完Java的語法知識和面向物件相關的知識,掌握的也不是很好,下面代碼中的注釋,都是我根據自己的理解,添加的注釋,如果有錯的或者不恰當的地方,希望各位大佬可以不吝賜教,謝謝!
  • 里面的代碼是尚硅谷的代碼,因為尚硅谷的代碼是用eclipse寫的,我本來嘗試了一下eclipse代碼包轉idea專案,但是失敗了,不過好在這個專案還不涉及框架和資料庫什么的,因此我就仿照尚硅谷的代碼結構,建立了包,和類,把他的代碼復制粘貼到我的類中,運行起來沒有任何問題,反正這次的目的主要是研究,以及熟練掌握一下代碼語法,多練,多動手嘛!
  • 正常應該先看bean下的customer類,但是我覺得代碼太多了,我喜歡從代碼少的開始看,你們就隨意啦!
//Test類代碼:
package src.com.tjp.test;
//先宣告本類所在的位置,嘿我在這里!
import src.com.tjp.view.CustomerView;
//匯入view包下的CustomerView類,因為下面要創建它的物件,呼叫它的方法,所以需要把這個類先匯入到這個類里面,
public class Test {
//Test類開始
    public Test(){
    }
//Test無參構造器,

    public static void main(String[] args) {
// Test類入口,主函式,
        CustomerView view = new CustomerView();
// 創建了CustomerView類的物件view.
        view.menu();
// 用創建的物件view,呼叫CustomerView類的方法menu().
    }
}

附圖:
image

//Customer類代碼:
package src.com.tjp.bean;
//先寫明本類所在的位置.講個好玩的:你是誰啊?我爸爸是bean,爺爺是tjp,太爺爺是com,太太爺爺是src.我是這一支的人,現在你知道我是誰了吧?
public class Customer {
//本類開始,
    private String name;
//一般標準bean都是把屬性,定義為私有的,然后其他類想要這個屬性的值,就通過set get方法獲得,
// 私有化屬性name String型別的.
    private char gender;
// gender:性別的意思,
    private int age;
// 屬性,成員變數,實體欄位是一個意思.
// 欄位是屬于類的,它是會用public、private等關鍵字修飾的,
    private String phone;
    private String email;
    public Customer(){
// 創建一個Customer無參構造器,
    }
    public Customer(String name, char gender, int age, String phone, String email){
//  創建一個Customer有參構造器,形參是name,gender,age,phone,email.
        this.name = name;
//  this.name 為構造器外面,本類最開始定義的成員變數,
//  構造器又可以叫做構造方法,構造器可以被看做是一種特殊的方法,構造器用于構造該類的實體,也就是物件,
//  構造器格式:[修飾符] 類名 (形參串列){//n條陳述句}
//  ##構造器與方法的區別:
//  1.構造器的名字必須與定義它的類名完全相同,沒有回傳型別,甚至連void也沒有,
//  2.構造器的呼叫是在創建一個物件時使用new操作進行的,構造方法的作用是初始化物件,
//  3.不能被static、final、synchronized、abstract和native修飾,構造方法不能被子類繼承,
//  4.構造方法可以被多載,沒有引數的構造方法稱為默認構造方法,與一般的方法一樣,構造方法可以進行任何活動,但是經常將他設計為進行各種初始化活動,比如初始化物件的屬性,
//  5.每個類可以有一個以上的構造器.
//  6.構造器可以有0個,1個,或多個引數.
//  7.構造器總是伴隨著new運算子一起呼叫.
//  8.構造器與其他方法有一個重要的不同.構造器總是結合new運算子來呼叫.不能對一個已經存在的物件呼叫構造器來達到重新設定實體欄位的目的.
//  例子:jams.Employee("James Bond",250000,1950,1,1)//ERROR
//  例子: new Employee("Jams Bond",100000,1950,1,1)//CORRECT
//  #方法:
//  1.方法包含于類或物件中,方法在程式中被創建,在其他地方被參考.
//  2.命名規則:方法的名字的第一個單詞應以小寫字母作為開頭,后面的單詞則用大寫字母開頭寫,不使用連接符,例如:addPerson,
//  3.命名規則:下劃線可能出現在 JUnit 測驗方法名稱中用以分隔名稱的邏輯組件,一個典型的模式是:test<MethodUnderTest>_<state>,例如 testPop_emptyStack,
//  4.修飾符 回傳值型別 方法名(引數型別 引數名){方法體 return 回傳值;}沒有回傳值的時候,用void,而不可以像構造器那樣,不去寫.
//  5.呼叫一個方法時候需要提供引數,你必須按照引數串列指定的順序提供,
//  *******************************************
//  成員變數和區域變數的區別:
//  1.在類中位置不同:成員變數:在類中方法外,區域變數:在方法定義中或者方法宣告上,
//  2.在記憶體中的位置不同:成員變數:在堆記憶體,  區域變數:在堆疊記憶體,
//  3.生命周期不同:成員變數:隨著物件的創建而存在,隨著物件的消失而消失, 區域變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失,
//  4.初始化值不同:成員變數:有默認值初始化,區域變數:沒有默認值初始化,必須定義,賦值,然后才能使用,
//  5.注意事項:區域變數名稱可以和成員變數名稱一樣(用this區分),在方法中使用的時候,采用的是就近原則,
//  用this修飾的變數,為成員變數,沒有用this修飾的變數,根據就近原則,為區域變數,即構造器里宣告的變數,成員變數和區域變數名字可以不同,
//  但是都用的相同的名字,一方面可能是見名知意思,另一方面可能是比較懶,不想起其他名字,防止混亂?僅僅只是我自己的理解,不知對不對,
        this.gender = gender;
        this.age = age;
        this.phone = phone;
        this.email = email;
    }
//  以下是set get方法.用ALT+Insert快捷鍵快速生成set, get方法.也可以滑鼠右鍵->點擊生成->getter Setter
//  如果按了快捷鍵發現沒有彈窗,你的電腦又恰好是聯想小新,可以試試,Fn+Esc.按下去發現Esc鍵亮起,說明上面一排從F1~F12~Insert, PrtSc都恢復了正常功能.
//  如果你還指望用F3調節音量大小,那我建議你,記得寫完代碼后,再按Fn+Esc,讓Esc的燈光再次熄滅.
//  這回可以再試試剛才的快捷鍵了,如果還是不行,那就百度一下吧.

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public char getGender(){
        return this.gender;
    }
    public void setGender(char gender){
        this.gender = gender;
    }
    public int getAge(){

        return this.age;
    }
    public void setAge(int age){

        this.age = age;
    }
    public String getPhone(){

        return this.phone;
    }
    public void setPhone(String phone){

        this.phone = phone;
    }
    public String getEmail(){

        return this.email;
    }
    public void setEmail(String email){
        this.email = email;
    }
//  CustomerView類中list方法會呼叫這個getInfo方法,用于輸出.
    public String getInfo(){
        return this.name + "\t" + this.gender + "\t" + this.age + "\t" + this.email;
    }
}

image
image
image
image
image

//CustomerService代碼:
package src.com.tjp.service;
//宣告本類所在的位置,
import src.com.tjp.bean.Customer;
//匯入Customer類,
import java.util.Arrays;
//匯入Java自帶的util包下的Arrays類,如果不匯入這個類,下面用arrays的時候,就會報錯,
public class CustomerService {
//  本類開始,
    private Customer[] all;
//  這個我也不太確定,應該是私有化定義一個Customer型別別的陣列,all.
    private int total;
//  私有化定義一個int型別的成員變數total
    public CustomerService() {
        this.all = new Customer[2];
    }
//  本類的無參構造器,創造一個Customer型別別的兩個長度的陣列,并把這個陣列地址賦值給ALL陣列,(陣列是參考型別,應該是地址傳遞)
    public CustomerService(int initSize) {
        this.all = new Customer[initSize];
    }
//  本類的有一個形參的構造器,initSize是規定幾個可以輸入的,例如編號,性別,等的最小輸入范圍,但是為什么這么寫,不太清楚,這里不太理解,
    public void addCustomer(Customer c) {
//  本類的一個無回傳值的公有的addCustomer方法,形參有一個Customer型別的 c.
        if (this.total >= this.all.length) {
            System.out.println("陣列已滿");
        } else {
            this.all[this.total++] = c;
        }
    }

    public Customer[] getAll() {
        return (Customer[]) Arrays.copyOf(this.all, this.total);
    }
//  回傳值型別是Customer[]的方法?應該是這個意思?
    public void removeById(int id) {
//  公有的,沒有回傳值的,一個形參的removeById方法,
//  從CustomerView類中,洗掉用戶方法中,呼叫此方法,從輸入控制臺傳入要洗掉的id號,
//  把id-1為了讓它和陣列下標對應,并查找擁有該陣列下標的,是否存在,
//  該死的,用這么多方法,頭大,

        int index = id - 1;
        if (index >= 0 && index < this.total) {
            System.arraycopy(this.all, index + 1, this.all, index, this.total - index - 1);
//                           原陣列,    源陣列要復制的起始位置,目的陣列,目的陣列放置的起始位置,復制的長度,
            this.all[--this.total] = null;
//  居然還可以這樣寫,妙啊,
        } else {
            System.out.println(id + "對應的客戶不存在");
        }
    }

//  查看輸入的id,是否存在對應的客戶,
    public Customer getById(int id) {
        int index = id - 1;
        if (index >= 0 && index < this.total) {
            return this.all[index];
        } else {
            System.out.println(id + "客戶不存在");
            return null;
        }
    }
//  修改用戶,查看需要修改的用戶是否存在,
    public void replace(int id, Customer newCustomer) {
        int index = id - 1;
        if (index >= 0 && index < this.total) {
            this.all[index] = newCustomer;
        } else {
            System.out.println(id + "客戶不存在");
        }
    }
}

image
image
image

//CustomerView類的代碼:
package src.com.tjp.view;

import src.com.tjp.bean.Customer;
import src.com.tjp.service.CustomerService;
import src.com.tjp.utils.CMUtility;
public class CustomerView {
    private CustomerService cs = new CustomerService();
//    這個私有化創建物件的做法值得深思,
    public CustomerView(){
    }
    public void menu(){
        while(true) {
            System.out.println("----------客戶資訊管理軟體----------");
            System.out.println("\t\t\t1. 添加客戶");
            System.out.println("\t\t\t2. 修改客戶");
            System.out.println("\t\t\t3. 洗掉客戶");
            System.out.println("\t\t\t4. 客戶串列");
            System.out.println("\t\t\t5. 退   出");
            System.out.println("----------請選擇(1~5):");
            char select = CMUtility.readMenuSelection();

            switch(select){
                case '1':
                    this.add();
                    break;
                case '2':
                    this.update();
                    break;
                case '3':
                    this.delete();
                    break;
                case '4':
                    this.list();
                    break;
                case '5':
                    System.out.println("確認退出嘛?Y/N");
                    char confirm = CMUtility.readConfirmSelection();

                    if (confirm == 'Y') {
                        return;
                    }
            }
        }
    }
    private void list(){
        Customer[] all = this.cs.getAll();
        System.out.println("-------------客戶串列--------------");
        System.out.println("編號\t姓名\t性別\t年齡\t電話\t郵箱");
        for(int i = 0;i < all.length; ++i) {
            System.out.println((i + 1) + "\t" + all[i].getInfo());
        }
        System.out.println("-------------客戶串列完成----------");
    }
    private void delete(){
        System.out.println("-------------洗掉客戶--------------");
        System.out.println("請選擇待洗掉客戶編號(-1退出):");
        int id = CMUtility.readInt();
        if (id != -1) {
            System.out.println("確認是否洗掉(Y/N):");
            char confirm = CMUtility.readConfirmSelection();
            if (confirm != 'N'){
                this.cs.removeById(id);
                System.out.println("-------------洗掉完成-----------");
            }
        }

    }
    private void update(){
        System.out.println("--------------修改客戶------------");
        System.out.println("請選擇待修改客戶編號(-1退出):");
        int id = CMUtility.readInt();
        if(id != -1) {
            Customer old = this.cs.getById(id);
            System.out.println("姓名(" + old.getName() + "): ");
            String name = CMUtility.readString(20, old.getName());
            System.out.println("性別(" + old.getGender() + "): ");
            char gender = CMUtility.readChar(old.getGender());
            System.out.println("年齡(" + old.getAge() + "): ");
            int age = CMUtility.readInt(old.getAge());
            System.out.println("電話(" + old.getPhone() + "): ");
            String phone = CMUtility.readString(11, old.getPhone());
            System.out.println("郵箱(" + old.getEmail() + "): ");
            String email = CMUtility.readString(32, old.getEmail());
            Customer newCustomer = new Customer(name, gender, age, phone, email);
            this.cs.replace(id, newCustomer);
            System.out.println("--------------修改完成------------");
        }

    }
    private void add(){
        System.out.println("--------------添加客戶-----------");
        System.out.println("姓名: ");
        String name = CMUtility.readString(20);
        System.out.println("性別: ");
        char gender = CMUtility.readChar();
        System.out.println("年齡: ");
        int age = CMUtility.readInt();
        System.out.println("電話: ");
        String phone = CMUtility.readString(11);
        System.out.println("郵箱: ");
        String email = CMUtility.readString(32);
        Customer c = new Customer(name, gender, age, phone, email);
        this.cs.addCustomer(c);
        System.out.println("--------------添加完成-----------");
    }
}

image
image
image
image

//CMUtility類的代碼:
package src.com.tjp.utils;

import java.util.Scanner;
public class CMUtility {
    private static Scanner scanner;
    static {
        scanner = new Scanner(System.in);
    }
    public CMUtility() {
    }
    public static char readMenuSelection() {
        while(true) {
            String str = readKeyBoard(1, false);
            char c = str.charAt(0);
            if (c == '1' || c == '2' || c == '3' || c == '4' || c == '5') {
                return c;
            }

            System.out.print("選擇錯誤,請重新輸入:");
        }
    }
    public static char readChar() {
        String str = readKeyBoard(1, false);
        return str.charAt(0);
    }

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);
        return str.length() == 0 ? defaultValue : str.charAt(0);
    }

    public static int readInt() {
        while(true) {
            String str = readKeyBoard(2, false);

            try {
                int n = Integer.parseInt(str);
                return n;
            } catch (NumberFormatException var3) {
                System.out.print("數字輸入錯誤,請重新輸入:");
            }
        }
    }

    public static int readInt(int defaultValue) {
        while(true) {
            String str = readKeyBoard(2, true);
            if (str.equals("")) {
                return defaultValue;
            }

            try {
                int n = Integer.parseInt(str);
                return n;
            } catch (NumberFormatException var4) {
                System.out.print("數字輸入錯誤,請重新輸入:");
            }
        }
    }

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("") ? defaultValue : str;
    }

    public static char readConfirmSelection() {
        while(true) {
            String str = readKeyBoard(1, false).toUpperCase();
            char c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                return c;
            }

            System.out.print("選擇錯誤,請重新輸入:");
        }
    }

    private static String readKeyBoard(int limit, boolean blankReturn) {
        String line = "";

        while(scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (line.length() == 0) {
                if (blankReturn) {
                    return line;
                }
            } else {
                if (line.length() >= 1 && line.length() <= limit) {
                    break;
                }

                System.out.print("輸入長度(不大于" + limit + ")錯誤,請重新輸入:");
            }
        }

        return line;
    }
}

image
image
image
image

#########################################################################
(明天,后天,大后天的任務是把這個專案從頭徹底的自己寫出來,徹底理解,)
末尾:(和這個專案無關的代碼,僅僅為了展示構造器的一些性質,值得深思,還是沒讀懂Java核心技術卷一第11版中文版P108頁的警告)

原書內容:警告:請注意,不要再構造器中定義與實體欄位同名的區域變數,例如下面的構造器將不會設定salary,
public Employee(String n,double s,...){
String name = n;//ERROR
double salary = s;//ERROR
}
這個構造器宣告了區域變數name和salary,這些變數只能在構造器內部訪問,這些變數會遮蔽(shadow)同名的實體欄位,有些程式員偶爾會不假思索地寫出這類代碼,因為他們的手指會不自覺地增加資料型別,這種錯誤很難檢查出來,因此,必須注意在所有的方法中都不要使用與實體欄位同名的變數,

他到底是什么意思呢?是在說構造器內的變數,具有區域性,出了這個構造器,這個變數就不被承認?
實體欄位不就指的是成員變數嗎?
他是在說我下面圖片中演示的測驗1,2那樣?
好奇怪啊,是這個版本的翻譯不行嗎?有機會找來原著看看,現在不都把名字和實體欄位設定成一樣的嗎?然后用this區分哪個是實體欄位,哪個是區域欄位嘛?為什么書中說不建議?好奇怪?
image

  • 關于構造器,還不太清楚的可以看以下的文章,(其他人寫的,我覺得初學者應該了解構造器的具體用處,下面的都是參考其他人的文章,希望會對你的理解有點幫助,)
    https://www.jb51.net/article/266354.htm
  • 關于陣列是值傳遞還是參考傳遞的問題: 答案是參考傳遞,即是賦值的時候,其實是地址傳遞過去了,image
  • 關于this.all = new Customer[2];這里不懂的,可以參考這個鏈接:
    https://blog.csdn.net/qq_46423166/article/details/128588295
  • 關于Arrays.copyOf(this.all, this.total)
    image
  • 關于System.arraycopy的使用方法詳解:
    https://blog.csdn.net/wenzhi20102321/article/details/78444158
  • 學習各種語言的寶藏網站:菜鳥教程,鏈接如下:
    https://www.runoob.com/

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

標籤:其他

上一篇:Python教程_編程入門自學教程_菜鳥教程-免費教程分享

下一篇:返回列表

標籤雲
其他(158397) Python(38117) JavaScript(25399) Java(18012) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7157) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1931) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(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
最新发布
  • Java練手專案(尚硅谷的),不涉及框架,資料庫等。

    軟體:idea 我是先建立了一個空白的專案,自己創建的src包和其下面的包。 **問題一:**建立包之后發現格式為src.com.tjp.bean 沒辦法建立其他與bean同級的service test utils view 等。只允許繼續建立bean的子包。 解決: 這是因為idea自動會折疊空白 ......

    uj5u.com 2023-05-05 08:12:43 more
  • Python教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Python由荷蘭數學和計算機科學研究學會的吉多·范羅蘇姆于1990年代初設計,作為一門叫做ABC語言的替代品。 Python提供了高效的高級資料結構,還能簡單有效地面向物件編程。Python語法和動態型別,以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的編程語言, [2] ......

    uj5u.com 2023-05-05 08:06:50 more
  • JUC并發編程原理精講(原始碼分析)

    并發編程是指在程式中使用多執行緒技術來實作并行處理的能力。多執行緒機制使得程式可以分解成互不干擾的任務,從而提高了程式執行的效率。并發編程可以通過對執行緒的創建,管理和協作進行控制,以實作更加高效的并發執行。并發編程的優點包括:① 提高程式執行效率:通過多執行緒并行處理,程式的處理速度可以顯著提高。② 增強... ......

    uj5u.com 2023-05-05 08:00:35 more
  • 【pandas基礎】--資料讀取

    資料讀取是第一步,只有成功加載資料之后,后續的操作才有可能。 pandas可以讀取和匯入各種資料格式的資料,如CSV,Excel,JSON,SQL,HTML等,不需要手動撰寫復雜的讀取代碼。 1. 各類資料源 pandas提供了匯入各類常用檔案格式資料的介面,這里介紹3種最常用的加載資料的介面。 1 ......

    uj5u.com 2023-05-05 07:53:23 more
  • 一文吃透Tomcat核心知識點

    架構 首先,看一下整個架構圖。最全面的Java面試網站 接下來簡單解釋一下。 Server:服務器。Tomcat 就是一個 Server 服務器。 Service:在服務器中可以有多個 Service,只不過在我們常用的這套 Catalina 容器的Tomcat 中只包含一個 Service,在 S ......

    uj5u.com 2023-05-05 07:52:47 more
  • SpringBoot匯出Word檔案的三種方式

    SpringBoot匯出Word檔案的三種方式 一、匯出方案 1、直接在Java代碼里創建Word檔案,設定格式樣式等,然后匯出。(略) 需要的見:https://blog.csdn.net/qq_42682745/article/details/120867432 2、富文本轉換后的HTML下載為 ......

    uj5u.com 2023-05-05 07:52:09 more
  • golang推薦的命名規范

    二 golang推薦的命名規范 很少見人總結一些命名規范,也可能是筆者孤陋寡聞, 作為一個兩年的golang 開發者, 我根據很多知名的專案,如 moby, kubernetess 等總結了一些常見的命名規范。 命名規范可以使得代碼更容易與閱讀, 更少的出現錯誤。 檔案命名規范 由于檔案跟包無任何關 ......

    uj5u.com 2023-05-05 07:51:51 more
  • golang基礎知識

    一 golang基礎知識 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種計算機編程語言語言。 設計初衷 Go語言是谷歌推出的一種的編程語言,可以在不損失應用程式性能的情況下降低代碼的復雜性。谷歌首席軟體工程 ......

    uj5u.com 2023-05-05 07:51:41 more
  • 工匠回憶(二)

    接上文 4、條件分支控制流 避免分支嵌套,例外放在代碼片段最前面 4.1、歸約函式 4.2、條件運算式的封裝避免過長而導致可讀性下降 4.3、德摩根定律 4.4、and、or優先級 4.5、or短路效應 4.6、消失的分支 4.6.1、二分查找演算法 4.6.2、字典演算法 5、例外錯誤處理 無需多言 ......

    uj5u.com 2023-05-05 07:51:35 more
  • python 匿名函式(lambda函式)

    Python中的匿名函式是指沒有命名識別符號的函式,通常被稱為lambda函式。與普通函式不同,它們是一種更加簡潔的方式來撰寫小型臨時函式。在Python中,匿名函式使用關鍵字lambda來定義,其語法如下: lambda arguments: expression 其中,arguments表示函式參 ......

    uj5u.com 2023-05-05 07:51:31 more