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

Posted 秃头扣脚大叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java练手项目(尚硅谷的),不涉及框架,数据库等。相关的知识,希望对你有一定的参考价值。

软件: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<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;
    





//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;//ERROR
double salary = s;//ERROR

这个构造器声明了局部变量name和salary。这些变量只能在构造器内部访问。这些变量会遮蔽(shadow)同名的实例字段。有些程序员偶尔会不假思索地写出这类代码,因为他们的手指会不自觉地增加数据类型。这种错误很难检查出来,因此,必须注意在所有的方法中都不要使用与实例字段同名的变量。

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

尚硅谷Netty视频教程重磅发布!


Netty是当前非常流行的网络通讯框架,当程序对网络数据处理时,需要保证高并发和高可靠,底层就可以使用Netty支撑。


尚硅谷Netty视频教程重磅发布!

Netty涉及内容很多,如设计模式、数据结构、并发、同步、异步,阻塞等,目前网上的Netty课程不多,且普遍讲解晦涩难懂,内容浅尝辄止,导致很多学习者只知道Netty的核心组件,但不知道怎么使用到项目之中……


本套课程针对上述问题,有针对性地进行了升级:授课方式采用图解+框架源码分析的方式,让课程生动好理解。系统的内容讲解,还对Netty的核心技术进行了源码剖析:

  • Netty心跳(heartbeat)服务

  • EventLoop源码

  • 任务提交到异步线程池

  • Pipeline Handler HandlerContext创建源码

  • Netty启动过程源码

  • bossGroup和workerGroup机制源码等……

小电影由广受大家好评的韩顺平老师操刀,一通疯狂输出共计116集!按照我们尚大的调性,依照惯例,视频、源码、课件、笔记,全部毫无保留送给你!这么说吧,要是韩老师本人没意见,净重的韩老师我们都分成几个包给你快递过去!


尚硅谷Netty视频教程重磅发布!


本套视频详细讲解了Netty核心技术点,同时进行底层机制和源码剖析,并编写了大量的应用实例。通过学习可以快速掌握Netty的底层实现机制,熟练运用Netty解决网络高并发问题!


Netty
课程介绍视频


尚硅谷Netty视频教程重磅发布!

 

Netty
课程详细目录

001.课程说明和要求

002.Netty是什么

003.应用场景和学习资料

004.IO模型

005.BIO 介绍说明

006.BIO实例及分析

007.BIO内容梳理小结

008.NIO介绍说明

009.NIO的Buffer基本使用

010.NIO三大核心组件关系

011.Buffer的机制及子类

012.Channel基本介绍

013.Channel应用实例1

014.Channel应用实例2

015.Channel应用实例3

016.Channel拷贝文件

017.Buffer类型化和只读

018.MappedByteBuffer使用

019.Buffer的分散和聚集

020.Channel和Buffer梳理

021.Selector介绍和原理

022.Selector API介绍

023.SelectionKey在NIO体系

024.NIO快速入门(1)

025.NIO快速入门(2)

026.NIO快速入门小结

027.SelectionKey API

028.SocketChannel API

029.NIO 群聊系统(1)

030.NIO 群聊系统(2)

031.NIO 群聊系统(3)

032.NIO 群聊系统(4)

033.零拷贝原理剖析

034.零拷贝应用实例

035.零拷贝AIO内容梳理

036.Netty概述

037.线程模型概述

038.Reactor模式图解剖析

039.单Reactor单线程模式

040.单Reactor多线程模式

041.主从Reactor模式

042.Netty模型-通俗版

043.Netty模型-详细版

044.Netty入门-服务端1

045.Netty入门-服务端2

046.Netty入门-客户端

047.Netty案例源码分析

048.Netty模型梳理

049.taskQueue自定义任务

050.scheduledTaskQueue

051.异步模型原理剖析

052.FutureListener机制

053.Http服务程序实例

054.Http服务过滤资源

055.阶段内容梳理

056.Netty核心模块(1)

057.Netty核心模块(2)

058.pipeline组件剖析

059.Netty核心模块梳理

060.EventLoop组件

061.Unpooled应用实例1

062.Unpooled应用实例2

063.Netty群聊系统服务端

064.Netty群聊系统客户端

065.Netty私聊实现思路

066.Netty心跳机制实例

067.Netty心跳处理器

068.WebSocket长连接开发1

069.WebSocket长连接开发2

070.WebSocket长连接开发3

071.WebSocket长连接开发4

072.核心模块内容梳理

073.netty编解码器机制简述

074.ProtoBuf机制简述

075.ProtoBuf实例-生成类

076.ProtoBuf实例Codec使用

077.ProtoBuf传输多种类型

078.ProtoBuf内容小结

079.Netty入站与出站机制

080.Handler链调用机制实例1

081.Handler链调用机制实例2

082.Handler链调用机制实例3

083.Handler链调用机制实例4

084.Netty其它常用编解码器

085.Log4j 整合到Netty

086.编解码器和处理器链梳理

087.Tcp粘包拆包原理

088.Tcp粘包拆包实例演示

089.自定义协议解决TCP粘包拆包1

090.自定义协议解决TCP粘包拆包2

091.TCP粘包拆包内容梳理

092.Netty服务器启动源码剖析1

093.Netty服务器启动源码剖析2

094.Netty服务器启动源码剖析3

095.Netty接收请求源码剖析1

096.Netty接收请求源码剖析2

097.Netty接收请求源码剖析3

098.Pipeline源码剖析

099.ChannelHandler源码剖析

100.管道 处理器 上下文创建源码剖析

101.Pipeline调用Handler源码剖析

102.三大核心组件剖析梳理

103.Netty心跳源码剖析1

104.Netty心跳源码剖析2

105.EventLoop源码剖析1

106.EventLoop源码剖析2

107.任务加入异步线程池源码剖析1

108.任务加入异步线程池源码剖析2

109.任务加入异步线程池源码剖析3

110.RPC调用流程分析

111.用Netty实现DubboRPC-1

112.用Netty实现DubboRPC-2

113.用Netty实现DubboRPC-3

114.用Netty实现DubboRPC-4

115.用Netty实现DubboRPC-5

116.用Netty实现DubboRPC-6

 

即刻免费获取全套视频教程!

学习Java,回复关键词:Java 有惊喜!


尚硅谷Netty视频教程重磅发布!

更多精彩视频,请猛击阅读原文!

以上是关于Java练手项目(尚硅谷的),不涉及框架,数据库等。的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷RBAC权限实战视频

Java开发框架!尚硅谷java学习路线

尚硅谷--Java--基础篇(717集)

尚硅谷_Java零基础教程(集合Collection:list,set;map)-- 学习笔记

尚硅谷全套课件整理:Java前端大数据安卓面试题

尚硅谷基于阿里云搭建数据仓库(实时)项目视频发布!