当前位置: 首页>行业 >

Java练手项目(尚硅谷的),不涉及框架,数据库等。

来源: 博客园 | 时间: 2023-05-04 20:33:13 |


【资料图】

软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。问题一:建立包之后发现格式为src.com.tjp.bean 没办法建立其他与bean同级的service test utils view 等。只允许继续建立bean的子包。解决:这是因为idea自动会折叠空白包。(不同版本的idea可能和我的位置不太一样,但是都在那个齿轮里,第一步都先点击那个齿轮,看看里面有没有提到fold empty等词汇,如果有,又打了对勾,那就取消一下试试嘛,反正大不了记住位置,一会儿再勾回来嘛。)

把压缩空的中间软件包取消勾选,就可以看到可以正常建立空白包的子包了。项目结构如下图:

  • 看以下代码须知:本人是个菜鸟,才学完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().    }}

附图:

//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_,例如 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;    }}
//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 + "客户不存在");        }    }}
//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("--------------添加完成-----------");    }}
//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;    }}

#########################################################################(明天,后天,大后天的任务是把这个项目从头彻底的自己写出来,彻底理解。)末尾:(和这个项目无关的代码,仅仅为了展示构造器的一些性质,值得深思。还是没读懂Java核心技术卷一第11版中文版P108页的警告)

原书内容:警告:请注意,不要再构造器中定义与实例字段同名的局部变量。例如下面的构造器将不会设置salary。public Employee(String n,double s,...){String name = n;//ERRORdouble salary = s;//ERROR}这个构造器声明了局部变量name和salary。这些变量只能在构造器内部访问。这些变量会遮蔽(shadow)同名的实例字段。有些程序员偶尔会不假思索地写出这类代码,因为他们的手指会不自觉地增加数据类型。这种错误很难检查出来,因此,必须注意在所有的方法中都不要使用与实例字段同名的变量。

他到底是什么意思呢?是在说构造器内的变量,具有局部性,出了这个构造器,这个变量就不被承认?实例字段不就指的是成员变量吗?他是在说我下面图片中演示的测试1,2那样?好奇怪啊,是这个版本的翻译不行吗?有机会找来原著看看,现在不都把名字和实例字段设置成一样的吗?然后用this区分哪个是实例字段,哪个是局部字段嘛?为什么书中说不建议?好奇怪?

  • 关于构造器,还不太清楚的可以看以下的文章。(其他人写的,我觉得初学者应该了解构造器的具体用处。下面的都是引用其他人的文章,希望会对你的理解有点帮助。)https://www.jb51.net/article/266354.htm
  • 关于数组是值传递还是引用传递的问题: 答案是引用传递,即是赋值的时候,其实是地址传递过去了。
  • 关于this.all = new Customer[2];这里不懂的,可以参考这个链接:https://blog.csdn.net/qq_46423166/article/details/128588295
  • 关于Arrays.copyOf(this.all, this.total)
  • 关于System.arraycopy的使用方法详解:https://blog.csdn.net/wenzhi20102321/article/details/78444158
  • 学习各种语言的宝藏网站:菜鸟教程,链接如下:https://www.runoob.com/

关键词:

 

热文推荐

Java练手项目(尚硅谷的),不涉及框架,数据库等。

软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。**问题一:**建立包之后发现格式为s

2023-05-04

热门:共建共享数字化发展成果 宁波市2023年数字素养与技能提升月启动

4日,宁波市2023年数字素养与技能提升月在北仑区正式启动,今年的主题是“提升全民数字素养与技能,共建共

2023-05-04

预言家在哪?梅西会加盟哪队?巴萨?利雅得新月?迈阿密国际?_滚动

你认为梅西会加盟哪家球队?巴萨?利雅得新月?迈阿密国际?…

2023-05-04

津市市开展文化市场专项检查

红网时刻常德5月1日讯(通讯员杜椰)为切实加强“五一”假日期间文化市场安全生产工作,确保全市文化市场安

2023-05-04

每1.9小时新开一家门店,瑞幸咖啡的扩张步伐还在加速 环球快播

出品 壹览商业作者 布林过去三年,由于疫情的影响,我国消费市场整体经历了较大波折,其中线下业态遭遇的冲

2023-05-04

海越能源:董监高人员拟合计以415万元-705万元增持股份

上证报中国证券网讯(记者孔子元)海越能源公告,公司董事、监事及高级管理人员计划自2023年5月8日起6个月

2023-05-04

你好,租房前肉眼看不到的地方房子漏水,作为租客并不知情,在入住期间才知道产生了额外的水费

你好,租房前肉眼看不到的地方房子漏水,作为租客并不知情,在入住期间才知道产生了额外的水费

2023-05-04

今日最新!不会唱歌喝酒的领导能带好团队、卖好药吗?

凌晨四点口干的难受起来喝了杯温水,再也睡不着了,起来记录一下昨天的项目启动学术会,大家搞过会议的的都

2023-05-04

当前报道:天宸股份拟投资116亿元建设新能源产业基地项目

中国网财经5月4日讯 天宸股份今日盘后发布公告,拟在江苏省芜湖市繁昌区投资建设光储一体新能源产业基地项

2023-05-04

黔江区气象局发布雷电黄色预警【Ⅲ级/较重】【2023-05-04】_世界动态

黔江区气象台2023年5月4日13时50分发布“雷电黄色预警信号”,预计4日14时至20时,黎水镇、黄溪镇、白石镇

2023-05-04

什么眼霜去细纹效果好点_什么眼霜去细纹效果好_世界热头条

1、cpb眼霜、裴礼康精华眼霜、彼得罗夫精华眼霜、SK-II、pola抗糖化眼霜、兰蔻大眼精华。2、可全面改善眼周

2023-05-04

兰州红古区小学划片范围(最新)

兰州市红古区小学学区划片(幼升小学区划分)2023各县区小学招生方案6月上旬前向社会公布,招生录取工作于7

2023-05-04

卡塔尔央行加息25个基点

卡塔尔央行加息25个基点

2023-05-04

吸血鬼幸存者闪电戒指超武怎么合成(吸血鬼闪现e)_全球热闻

吸血鬼幸存者闪电戒指超武怎么合成?雷环是游戏中一个非常强的超级武器,很多小伙伴可能还不清楚怎么合成吧

2023-05-04

美年健康:正在与相关科研院所合作 启动基于AIGC技术在健康体检行业的应用研究

美年健康在披露的投资者关系活动记录表中表示,目前,美年健康研究院正在与相关科研院所合作,启动基于AI

2023-05-04

缓刑到司法局报到流程

一、缓刑到司法局报到流程缓刑到司法局报到流程是带着材料,复印件先去司法局报道,备案。然后去司法所报道

2023-05-04

世界新资讯:小摩:重估空间将继续存在,基建股首选中国中铁、中国建筑国际

智通财经APP获悉,小摩发布研究报告称,考虑到香港基建前景改善以及香港政府地区规划政策推展速度较预期快

2023-05-04

国二报名时间_国二报名条件-热文

欢迎观看本篇文章,小升来为大家解答以上问题。国二报名时间,国二报名条件很多人还不知道,现在让我们一起

2023-05-04

【全球速看料】港股异动 | 维亚生物(01873)涨超6% 机构称医药外包服务产业将继续享受发展红利

维亚生物(01873)涨超6%,截至发稿,涨6 29%,报1 52港元,成交额618 7万港元。

2023-05-04

全球今亮点!新县召开防范强降雨会商研判调度会

5月2日,新县召开防范强降雨会商研判调度会。会议以视频形式召开,各乡镇(区、街道)设分会场。会议要求,

2023-05-04

资讯

花式避暑添夏日趣味 热浪滚滚燃高温经济

防晒、遮阳、冰饮,冲冲冲!西瓜、外卖、空调,不能停!多地持续的高温天气不仅贡献了很多热搜,也助燃了夏日经济。这其中,既有人们熟悉的传

2022-08-08     
天津津门虎队教练于根伟:机会来了要冷静

天津津门虎队明天将迎来中超联赛第五轮比赛,未尝一胜的现实也让全队上下倍感压力。昨天,主教练于根伟在谈及全队问题时表示:球员们在完成

2022-06-20     
北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27