├── .gitignore ├── README.md ├── docs ├── 01-java-base │ ├── 第一章_Java基础语法[上].pptx │ ├── 第三章_面向对象基础.pptx │ ├── 第二章_Java基础语法[下].pptx │ └── 第四章_常用API.pptx ├── JDK_API_1.6.CHM └── jQueryAPI1.4.chm ├── images ├── 01-java-base │ ├── api │ │ ├── String拼接浪费空间.bmp │ │ ├── 字符串对象构造方法创建和直接赋值的区别.bmp │ │ └── 对象数组的内存图.bmp │ ├── arrays │ │ ├── Java中的内存分配图解.bmp │ │ ├── 一个数组的内存图.bmp │ │ ├── 两个数组指向同一个地址的内存图.bmp │ │ ├── 两个数组的内存图.bmp │ │ ├── 数组操作之获取最值图解.bmp │ │ ├── 数组操作的两个常见小问题.bmp │ │ └── 静态初始化内存图.bmp │ ├── baseTest │ │ └── 基础语法练习之数组元素反转分析.bmp │ ├── class │ │ ├── 一个对象的内存图.bmp │ │ ├── 两个引用指向同一个对象的内存图.bmp │ │ ├── 方法共用的内存图.bmp │ │ └── 运动员案例分析.png │ ├── collections │ │ ├── 对象数组的内存图.bmp │ │ ├── 常见数据结构(数组).bmp │ │ ├── 常见数据结构(栈&队列).bmp │ │ └── 常见数据结构(链表).bmp │ ├── debug │ │ ├── 断点调试方法调试.bmp │ │ └── 断点调试运行界面.bmp │ ├── io │ │ ├── FileReader读数据的两种方式图解.bmp │ │ ├── IO流的作用及分类.bmp │ │ └── 学生管理系统IO版图解.bmp │ ├── method │ │ ├── 方法的形式参数是基本类型图解.bmp │ │ ├── 方法的形式参数是引用类型图解.bmp │ │ ├── 求和方法的调用图解.bmp │ │ └── 递归求5的阶乘图解.bmp │ └── thread │ │ ├── 主方法是单线程的.bmp │ │ ├── 主方法是多线程的.bmp │ │ └── 线程的生命周期.bmp └── 02-html │ ├── 网站信息页面.png │ ├── 网站注册.png │ └── 网站首页.png ├── notes ├── 01-java-base │ ├── Java IO流.md │ ├── Java介绍.md │ ├── Java基础语法.md │ ├── Java多线程.md │ ├── Java常用API.md │ ├── Java异常处理.md │ ├── Java网络编程.md │ ├── Java集合与数据结构.md │ ├── Java面向对象.md │ └── eclipse的基本使用.md ├── 02-java-web │ ├── css.md │ ├── html.md │ └── js.md ├── git.md └── softwareTest.md └── src └── Java-web ├── 01-html ├── 01-网站信息页面 │ └── 网站信息页面.html ├── 02-网页图片信息 │ └── 图片demo.html ├── 03-友情链接 │ └── demo.html ├── 04-网站首页 │ ├── 网站首页.html │ └── 表格标签.html ├── 05-网站注册案例 │ ├── 网站注册案例.html │ └── 表单demo.html ├── 06-网站后台页面 │ ├── aaa.html │ ├── bbb.html │ ├── ccc.html │ ├── data.html │ ├── 框架标签.html │ └── 网站后台.html └── img │ ├── ad.jpg │ ├── big01.jpg │ ├── footer.jpg │ ├── header.jpg │ ├── logo2.png │ ├── middle01.jpg │ ├── part3.jpg │ ├── regist_bg.jpg │ ├── small01.jpg │ ├── small02.jpg │ ├── small03.jpg │ ├── small04.jpg │ ├── small05.jpg │ ├── small06.jpg │ ├── small07.jpg │ ├── small08.jpg │ ├── small09.jpg │ └── title2.jpg └── 02-css ├── 01-网站首页的优化 ├── 03-引入方式 │ ├── style1.css │ ├── 外部样式1.html │ ├── 外部样式2.html │ └── 行内样式Demo.html ├── 04-浮动 │ └── 浮动.html ├── 05-css优先级 │ └── css优先级.html ├── 1-块标签 │ ├── divDemo.html │ └── spanDemo.html ├── 2-选择器 │ ├── ID选择器.html │ ├── 伪类选择器.html │ ├── 元素选择器.html │ ├── 后代选择器.html │ ├── 属性选择器.html │ ├── 类选择器.html │ ├── 选择器入门.html │ └── 选择器分组.html └── 网站首页css优化.html ├── 02-网站注册案例的优化 ├── 盒子模型.html ├── 绝对定位.html └── 网站注册css优化.html ├── img ├── ad.jpg ├── big01.jpg ├── footer.jpg ├── header.jpg ├── logo2.png ├── middle01.jpg ├── part3.jpg ├── regist_bg.jpg ├── small01.jpg ├── small02.jpg ├── small03.jpg ├── small04.jpg ├── small05.jpg ├── small06.jpg ├── small07.jpg ├── small08.jpg ├── small09.jpg └── title2.jpg └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.bak 2 | *.class 3 | *.DS_Store 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Java入门到进阶 2 | 3 | 4 | ## 目录 5 | 6 | ### 00-基础知识 7 | - [数据结构与算法小结..待整理] 8 | - [Git使用小结 (Mac版)](https://github.com/anliux/JAVALearning/blob/master/notes/git.md) 9 | - [Linux常用命令小结..待整理] 10 | - [软件工程小结..待整理] 11 | - [软件测试小结](https://github.com/anliux/JAVALearning/blob/master/notes/softwareTest.md) 12 | 13 | ### 01-Java基础 14 | - [Java介绍](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E4%BB%8B%E7%BB%8D.md) 15 | - 发展史, Java语言跨平台原理 16 | - 常用dos命令 17 | - JDK下载安装与路径配置 18 | - Java程序执行流程, helloworld 19 | - notepad安装与配置, 其他 20 | - [eclipse的基本使用](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/eclipse%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.md) 21 | - 概述, 图文参考链接 22 | - 基本使用, 基本配置, 快捷键 23 | - 删除和导入项目, 自动生成代码, 以创建类的重命名 24 | - 键盘录入, 输出语句, 随机数 25 | - 断点调试 26 | - [Java基础语法](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95.md) 27 | - 注释 28 | - 关键字, 标识符 29 | - 常量, 变量 30 | - 计算机存储单位, 数据类型 31 | - 运算符 32 | - 程序流程控制 33 | - 数组 34 | - Java内层分配 35 | - 方法 36 | - 基础语法练习 37 | - [Java面向对象](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1.md) 38 | - 面向对象思想,类与对象,成员变量和局部变量,私有private,封装,this,构造方法,标准类代码示例(以Student为例),类名作为形参和返回值,static关键字,代码块,继承, 抽象类,接口,匿名对象,final关键字,多态,包与修饰符,内部类 39 | - [Java常用API](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E5%B8%B8%E7%94%A8API.md) 40 | - API概述, String类, StringBuilder类, 对象数组, 集合类与ArrayList, 案例, 集合版学生管理系统, IO流, IO流版学生管理系统, Object类, System类, Date类与DateFormat类, Calendar类, 包装类与自动装箱拆箱, 正则表达式 41 | - [集合类与常见数据结构](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E9%9B%86%E5%90%88%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.md) 42 | - ArrayList, 集合类, 三种数据结构简介, List, Set, Collections工具类, Map 43 | - [异常处理](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86.md) 44 | - java异常, 异常的处理方式, 处理多个异常, Throwable的常用方法, finally, 异常的分类, 自定义异常, 递归 45 | - [IO流](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%20IO%E6%B5%81.md) 46 | - IO流基础概述, FileWriter, FileReader, 字符缓冲流, 字符流读写应用, File类, IO流分类, 输入输出流, 打印流, 对象操作流, Properties, 编码表 47 | - [多线程](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E5%A4%9A%E7%BA%BF%E7%A8%8B.md) 48 | - 多线程概述, 多线程的实现方法, 多线程模拟火车站售票, 同步代码块与同步方法, 线程的生命周期 49 | - [网络编程](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/Java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B.md) 50 | - 网络编程概述, InetAddress, UDP/TCP协议收发数据, 模拟用户登录 51 | 52 | 53 | 54 | ### 02-Java Web 55 | - [HTML入门](https://github.com/anliux/JAVALearning/blob/master/notes/02-java-web/html.md): 56 | - HTML概述和基本语法规则, HBuilder, 纯文字页面实现, 图片页面实现(涉及引用路径), 列表标签, 超链接标签, 表格标签(表格属性, 合并单元格, 表格嵌套), 利用表格对页面划分和实现的思路, 表单标签, input的type参数, 框架标签, 框架中点击跳转, 常用学习链接 57 | - [CSS入门](https://github.com/anliux/JAVALearning/blob/master/notes/02-java-web/css.md): 58 | - xx 59 | - [JS入门](https://github.com/anliux/JAVALearning/blob/master/notes/02-java-web/js.md): 60 | - xx 61 | - [](): 62 | - [](): 63 | - [](): 64 | - [](): 65 | 66 | 67 | ### 03-数据库 68 | 69 | 70 | 71 | 72 | ### 04-框架 73 | 74 | 75 | 76 | ### 05-项目 77 | 78 | 79 | 80 | ## 备注 81 | - 82 | -------------------------------------------------------------------------------- /docs/01-java-base/第一章_Java基础语法[上].pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/01-java-base/第一章_Java基础语法[上].pptx -------------------------------------------------------------------------------- /docs/01-java-base/第三章_面向对象基础.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/01-java-base/第三章_面向对象基础.pptx -------------------------------------------------------------------------------- /docs/01-java-base/第二章_Java基础语法[下].pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/01-java-base/第二章_Java基础语法[下].pptx -------------------------------------------------------------------------------- /docs/01-java-base/第四章_常用API.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/01-java-base/第四章_常用API.pptx -------------------------------------------------------------------------------- /docs/JDK_API_1.6.CHM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/JDK_API_1.6.CHM -------------------------------------------------------------------------------- /docs/jQueryAPI1.4.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/docs/jQueryAPI1.4.chm -------------------------------------------------------------------------------- /images/01-java-base/api/String拼接浪费空间.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/api/String拼接浪费空间.bmp -------------------------------------------------------------------------------- /images/01-java-base/api/字符串对象构造方法创建和直接赋值的区别.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/api/字符串对象构造方法创建和直接赋值的区别.bmp -------------------------------------------------------------------------------- /images/01-java-base/api/对象数组的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/api/对象数组的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/Java中的内存分配图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/Java中的内存分配图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/一个数组的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/一个数组的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/两个数组指向同一个地址的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/两个数组指向同一个地址的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/两个数组的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/两个数组的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/数组操作之获取最值图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/数组操作之获取最值图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/数组操作的两个常见小问题.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/数组操作的两个常见小问题.bmp -------------------------------------------------------------------------------- /images/01-java-base/arrays/静态初始化内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/arrays/静态初始化内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/baseTest/基础语法练习之数组元素反转分析.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/baseTest/基础语法练习之数组元素反转分析.bmp -------------------------------------------------------------------------------- /images/01-java-base/class/一个对象的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/class/一个对象的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/class/两个引用指向同一个对象的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/class/两个引用指向同一个对象的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/class/方法共用的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/class/方法共用的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/class/运动员案例分析.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/class/运动员案例分析.png -------------------------------------------------------------------------------- /images/01-java-base/collections/对象数组的内存图.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/collections/对象数组的内存图.bmp -------------------------------------------------------------------------------- /images/01-java-base/collections/常见数据结构(数组).bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/collections/常见数据结构(数组).bmp -------------------------------------------------------------------------------- /images/01-java-base/collections/常见数据结构(栈&队列).bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/collections/常见数据结构(栈&队列).bmp -------------------------------------------------------------------------------- /images/01-java-base/collections/常见数据结构(链表).bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/collections/常见数据结构(链表).bmp -------------------------------------------------------------------------------- /images/01-java-base/debug/断点调试方法调试.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/debug/断点调试方法调试.bmp -------------------------------------------------------------------------------- /images/01-java-base/debug/断点调试运行界面.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/debug/断点调试运行界面.bmp -------------------------------------------------------------------------------- /images/01-java-base/io/FileReader读数据的两种方式图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/io/FileReader读数据的两种方式图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/io/IO流的作用及分类.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/io/IO流的作用及分类.bmp -------------------------------------------------------------------------------- /images/01-java-base/io/学生管理系统IO版图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/io/学生管理系统IO版图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/method/方法的形式参数是基本类型图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/method/方法的形式参数是基本类型图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/method/方法的形式参数是引用类型图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/method/方法的形式参数是引用类型图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/method/求和方法的调用图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/method/求和方法的调用图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/method/递归求5的阶乘图解.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/method/递归求5的阶乘图解.bmp -------------------------------------------------------------------------------- /images/01-java-base/thread/主方法是单线程的.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/thread/主方法是单线程的.bmp -------------------------------------------------------------------------------- /images/01-java-base/thread/主方法是多线程的.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/thread/主方法是多线程的.bmp -------------------------------------------------------------------------------- /images/01-java-base/thread/线程的生命周期.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/01-java-base/thread/线程的生命周期.bmp -------------------------------------------------------------------------------- /images/02-html/网站信息页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/02-html/网站信息页面.png -------------------------------------------------------------------------------- /images/02-html/网站注册.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/02-html/网站注册.png -------------------------------------------------------------------------------- /images/02-html/网站首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/images/02-html/网站首页.png -------------------------------------------------------------------------------- /notes/01-java-base/Java介绍.md: -------------------------------------------------------------------------------- 1 | # Java介绍 2 | 3 | ### 目录 4 | 5 | 6 | * [发展史](#发展史) 7 | * [Java语言跨平台原理](#java语言跨平台原理) 8 | * [常用dos命令](#常用dos命令) 9 | * [JDK下载安装与路径配置](#jdk下载安装与路径配置) 10 | * [Java程序执行流程](#java程序执行流程) 11 | * [HelloWorld](#helloworld) 12 | * [notepad安装与配置](#notepad安装与配置) 13 | * [其他](#其他) 14 | 15 | 16 | 17 | 18 | ## 发展史 19 | - 发展史:SUN->推出各个版本->oracle收购 20 | - Java语言平台:J2SE, J2ME,J2EE 21 | 22 | 23 | 24 | ## Java语言跨平台原理 25 | - 平台:操作系统 (windows, linux, mac) 26 | - 跨平台:Java程序可以在任意操作系统上运行,一次编写到处运行 27 | - 原理:实现跨平台需要依赖Java的虚拟机 JVM,在不同的系统安装jvm即可运行Java程序。 28 | - JVM (Java Virtual Machine):Java虚拟机 29 | - JRE (Java Runtime Environment):Java运行环境 = JVM + 核心类库 30 | - JDK (Jave Development Kit):Java开发工具包 = JRE + 开发工具 31 | - 概述为:使用JDK写完的开发程序,交给JRE中运行,有JRE中的JVM保证运行 32 | 33 | 34 | 35 | ## 常用dos命令 36 | - 打开控制台:win + R,然后cmd回车 37 | - 常用命令 38 | - d: 回车,盘符切换,切换到d盘 39 | - dir(directory): 列出当前目录下的文件以及文件夹 40 | - cd (change directory)改变指定目录(进入指定目录) 41 | - 进入 cd 目录;cd 多级目录 42 | - 回退 cd..;cd\ 回退多级 (注:使用单杠’/‘或双杠'//'分割不同级文件夹均可) 43 | - cls : (clear screen)清屏 44 | - exit : 退出dos命令行 45 | 46 | 47 | 48 | ## JDK下载安装与路径配置 49 | - ### 下载安装 50 | - 官网下载(建议安装32位版本) -- 傻瓜式安装 -- 完成后不必再装jre 51 | 52 | - ### 路径配置 53 | - 需要让javac和java可以在任意目录下访问。 54 | - 测试是否配置成功同理。 55 | 56 | - ### path配置 57 | - 创建新的变量名称:JAVA_HOME 58 | - 计算机-右键属性-高级系统设置-高级-环境变量-系统变量 59 | - 为JAVA_HOME添加变量值:JDK安装目录 60 | - 在path环境变量最前面添加如下内容:`%JAVA_HOME%\bin;,则javac可以在任意路径下访问 61 | - 注意:cmd窗口保持打开时的配置状态,中途重新配置后需要关闭重新打开才会生效。 62 | 63 | - ### classpath配置 64 | - 临时:在cmd窗口中用set设置,可以用于在别人电脑中配置路径,具体操作略。 65 | - 永久配置:同path配置,此处涉及配置后路径查找顺序问题。 66 | 67 | - ### 测试是否配置成功 68 | - cmd窗口任意目录下键入‘java’回车不报错 69 | 70 | 71 | 72 | ## Java程序执行流程 73 | - `.java`源文件 -- 编译器 -- 字节码文件 -- 解释器 -- 控制台显示结果 74 | - 编译器和解释器:bin目录下的javac和java命令,只能在bin目录下访问。 75 | - `javac + xxx.java` 生成字节码文件; 76 | - `java + classname` 执行字节码文件,不需要添加`.class`后缀。 77 | - 主方法main:入口方法,用于执行程序。 78 | - 代码常见错误:单词大小写;非法中文字符比如中文分号等。 79 | - 执行流程: 80 | - `javac xxx.java` --> 编译生成class文件 81 | - `java xxx` --> 执行class文件 82 | 83 | 84 | 85 | ## HelloWorld 86 | ```java 87 | public class HelloWorld{ 88 | public static void main(String[] args){ 89 | System.out.println(“HelloWorld”); 90 | } 91 | } 92 | ``` 93 | 94 | 95 | 96 | ## notepad安装与配置 97 | - 官网下载 -- 傻瓜式安装 98 | - 配置:设置-- 首选项 -- 新建 -- 默认语言与编码: 系统(windows or mac); 默认语言Java;编码ANSI. 99 | - 配置好后,在notepad中写代码比在白板写体验好一些。 100 | 101 | 102 | 103 | ## 其他 104 | - eclipse的常规使用、键盘录入等使用详见:[eclipse的基本使用.md](https://github.com/anliux/JAVALearning/blob/master/notes/01-java-base/eclipse%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.md) 105 | 106 | 107 | 108 | ### END 109 | -------------------------------------------------------------------------------- /notes/01-java-base/Java基础语法.md: -------------------------------------------------------------------------------- 1 | # java基础语法 2 | 3 | 4 | ### 目录 5 | 6 | 7 | * [注释](#注释):单行、多行、文档、嵌套 8 | * [关键字](#关键字):定义、特点 9 | * [标识符](#标识符):组成规则、命名规范 10 | * [常量](#常量):常量分类 11 | * [变量](#变量):概述、定义格式、定义注意事项 12 | * [计算机存储单元](#计算机存储单元):bit-B-KB-MB-GB-TB-... 13 | * [数据类型](#数据类型):基本数据类型、引用数据类型、类型转换:显式隐式 14 | * [运算符](#运算符):算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符、位运算符 15 | * [程序流程控制](#程序流程控制):顺序结构、选择结构(if,switch)、循环结构(for,while,do…while) 16 | * [数组](#数组):一维数组、二维数组、数组初始化、对象地址值、数组常见问题 17 | * [java内存分配](#java内存分配):5片内存区、栈、堆、数组示例图解 18 | * [方法](#方法):方法概述、方法格式、写方法、方法调用、方法重载、方法参数传递问题 19 | * [基础语法练习](#基础语法练习):月份对应季节、斐波那契数列、数组元素反转、加密数字 20 | 21 | 22 | 23 | 24 | ## 注释 25 | - 单行注释: `//注释文字` 26 | - 多行注释: `/* 注释文字 */` 27 | - eclipse中,输入`/*`之后直接回车即可显示多行注释,并且光标定位在可输入注释位置。 28 | - 文档注释: `/** 注释文字 */` 29 | - 注释的作用: 解释说明程序,提高程序的阅读性 30 | - 注释的嵌套: 31 | - 单行可以相互嵌套,多行可以嵌套单行,多行不可嵌套多行。 32 | 33 | 34 | * ### [返回目录](#目录) 35 | 36 | 37 | 38 | 39 | ## 关键字 40 | - 关键字:被Java语言赋予特定含义的单词 41 | - 关键字特点: 42 | - 全部小写; 43 | - 常见的代码编辑器会对关键字有特殊的颜色标记。 44 | - 熟悉常见关键字,可以会考查: 45 | - 数据类型,数据类型值,修饰符,类类关系,实例相关,异常处理,包等。 46 | 47 | 48 | * ### [返回目录](#目录) 49 | 50 | 51 | 52 | 53 | ## 标识符 54 | - 作用:包,类,方法,变量等的命名 55 | - 组成规则 56 | - 由字符(字母汉字数字),下划线_,美元符$组成 57 | - 字符:unicode字符集,包括英文大小写字母,中文字符,数字字符等;不建议使用中文字符。 58 | - 不能以数字开头(美元符号、下划线都可以); 59 | - 不能是Java中的关键字。 60 | - 命名规则:见名知意 61 | - 包(文件夹) :全部小写,多级包用点隔开。xxxyyyzzz,com.itheima。 62 | - 类:每个单词首字母大写。XxxYyyZzz。 63 | - 变量或者方法:第一个单词首字母小写,从第二个单词开始每个单词首字母大写。xxxYyyZzz。 64 | - java源码命名:java文件名应与代码中public类的名字相同。 65 | 66 | 67 | * ### [返回目录](#目录) 68 | 69 | 70 | 71 | 72 | ## 常量 73 | - 常量:在程序执行的过程中,其值不可以发生改变的量。 74 | - 常量分类: 75 | - 字符串常量("");整数常量;小数常量;字符常量('');布尔常量(true和false);空常量(null)。 76 | 77 | 78 | * ### [返回目录](#目录) 79 | 80 | 81 | 82 | 83 | ## 变量 84 | - 变量概述:在程序执行的过程中,在某个范围内其值可以发生改变的量 85 | - 本质讲:变量是内存中的一小块区域。(配合图示食用) 86 | - 区域限定:用数据类型限定 (eg. 苹果的价格是数字,不能是字符串..) 87 | - 区域名称:变量名。 88 | - 区域内容:初始化值。 89 | - 变量定义格式: 90 | - `数据类型 变量名 = 初始化值;` 91 | - `数据类型 变量名; 变量名 = 初始化值;` 92 | - 变量定义的注意事项: 93 | - 变量未赋值,不能直接使用;(否则会报错’未初始化‘) 94 | - 注意精度:定义long型或float型需要在数字末尾加L或F标记; 95 | - 注意范围:变量只在所属范围内有效,范围用大括号划分(代码块); 96 | - 同一范围内,变量名不能重复; 97 | - 同一行可以定义多个变量,但是不建议 (看起来更清楚一些)。 98 | - 关于变量与代码块的测试: 99 | - 不能同名,但代码块中的变量不能在代码块外使用 100 | 101 | ```java 102 | //测试1:代码块内外变量重名 103 | int a = 123; 104 | { 105 | int a = 456; //会报错,提示重名 (虽然是在代码块内外,但第二个a定义时,已经有a这个变量名存在了) 106 | } 107 | System.out.println(b); 108 | ``` 109 | 110 | ```java 111 | //测试2:在代码块以外使用变量 112 | int a = 123; 113 | { 114 | int b = 456; 115 | } 116 | System.out.println(b); //会报错,提示找不到符号 117 | ``` 118 | 119 | 120 | * ### [返回目录](#目录) 121 | 122 | 123 | 124 | 125 | ## 计算机存储单元 126 | - 变量是内存中的小容器,用来存储数据。 127 | - 计算机存储设备的最小信息单元叫“位(bit)”,又称“比特位”,通常用小写的字母b表示。 128 | - 计算机最小的存储单元叫“字节(byte)”,通常用大写字母B表示,字节是由连续的8个位组成。 129 | - 除了字节外的一些常用的存储单位:1024进率 (特殊: 1B=8bit) 130 | - bit-B-KB-MB-GB-TB-... 131 | 132 | 133 | * ### [返回目录](#目录) 134 | 135 | 136 | 137 | 138 | ## 数据类型 139 | - ### Java语言是强类型语言 140 | - 对于每一种数据都给出了明确的数据类型; 141 | - 不同的数据类型:分配不同的内存空间,表示不同的数据大小。 142 | 143 | - ### 常见数据类型:基本数据类型 + 引用数据类型 144 | - 基本数据类型:4类8种 145 | - 整数:byte-1,short-2,int-4,long-8; 146 | - 浮点数:float-4,double-8; 147 | - 字符:char-2; 148 | - 布尔:boolean-1; 149 | - 注:数字表示所占字节数 150 | - 引用数据类型:类,数组,接口。 151 | - 整数默认int型,浮点数默认double型。 152 | - long类型定义时在数字末尾加L,float类型定义时在数字末尾加F(可小写,建议大写,更清晰)。 153 | - 否则会报错:整数不加L默认int类型,会报错’过大的整数‘;float不加F默认double类型,会报错’可能损失精度‘。 154 | 155 | - ### 数据类型转换:显式/隐式 156 | - 隐式转换/默认转换: 157 | - 一般由小到大 158 | - 运算时,存在更高级类型则自动提升:byte,short,char—>int—>long—>float—>double 159 | - byte,short,char相互之间不转换,他们参与运算首先转换为int类型 160 | - boolean类型不能转换为其他的数据类型 161 | - 显式转换/强制转换: 162 | - 一般由大到小;可能会损失精度。 163 | - 格式:`目标类型 变量名=(目标类型)(被转换的数据);` 164 | - 例如:`byte d = (byte)(a+b);` 165 | - 建议:数据做运算,结果应该是什么类型就用什么类型接受,不要随意转换类型,否则会有精度的损失。 166 | 167 | 168 | * ### [返回目录](#目录) 169 | 170 | 171 | 172 | 173 | ## 运算符 174 | - ### 定义 175 | - 运算符:对常量和变量进行操作的符号称为运算符. 176 | - 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。 177 | - 不同运算符连接的式子体现的是不同类型的表达式。 178 | 179 | - ### 算术运算符 180 | - 加减乘除 `+,-,*,/` : 181 | - 加减乘正常; 182 | - 除法:注意int相除只能得到int,要想得到小数,就必须有浮点型参与运算。 183 | - 取余 `%`: 184 | - 整除的余数; 185 | - 应用1:对2取余结果为0或1,可以实现开关算法切换; 186 | - 应用2:任何数对某数取余,结果必小于被取余数,可以实现将结果控制在某数范围内。 187 | - 取模与取余: 188 | - Java中取余和取模是不同的,取余是`%`,而取模是`Math.FloorMod()`; c和c++中取模为`%`,而Python中取模为`%`。 189 | - 取余,遵循尽可能让商向0靠近的原则; 取模,遵循尽可能让商向负无穷靠近的原则(fix()和floor()两个函数的不同) 190 | - 当a b同正负,则结果一致;当a和b不同正负,则取余结果正负同a,取模结果正负同b。 191 | - 示例: 192 | - `7 % 4 = 3`, `Math.FloorMod(7,4)=3`; 193 | - `(-7) % (-4) = -3`, `Math.FloorMod(-7,-4) = -3`. 194 | - `7 % (-4) = 3`, `Math.floorMod(7, -4) = -1`; 195 | - `(-7) % 4 = -3`, `Math.floorMod(-7, 4) = 1`. 196 | - 注:7 % (-4) = (-4)(-1)+3, 而 Math.FloorMod(7,-4) = (-4)(-2)+(-1) 197 | - 参考链接:[Java取模和取余,你真的弄懂了吗?](https://www.cnblogs.com/doondo/p/14678204.html) 198 | - 加号 `+`: 199 | - 数值变量相加是加法运算。 200 | - 字符参与加法运算:字符在计算机中存储的数据值来参与运算; 201 | - 常见字符值:`A-65`,`a-97`, `0-48` 202 | - 字符串参与加法运算:和其他类型的数据做拼接,结果是字符串类型的。 203 | - 示例: 204 | - 设置`int a = 10, b = 20;` 205 | - 则`打印("hello" + a)`,结果是`hello10`,直接拼接; 206 | - 则`打印("hello" + a + b)`,结果是`hello1020`,直接拼接; 207 | - 则`打印(a + b + "hello")`,结果是`30hello`,从左往右,先计算后拼接。 208 | - 自增自减 `++--`: 209 | - `++--`可以放在变量的左侧或者右侧,均可。 210 | - 单独使用时,放在左右,结果没有区别; 211 | - 参与其他运算时: 212 | - `a++`:先拿变量做操作运算,后变量自增自减; 213 | - 注:内存表示中,(b=a++为例) 会先取出变量初始值存起来,然后进行运算即a+=1,然后把存起来的初始值赋值给b。 214 | - `++a`: 先变量自增自减,后拿变量做操作运算。 215 | - 注:简单记忆为”谁(指变量或加加减减)在前先操作谁“ eg. ,变量在前运算后自增自减,符号在前先自增自减。 216 | - #### 注意:Python没有这样的自增,是按照正常写`a=a+1;`,或者`a+=1` 217 | 218 | - ### 赋值运算符 219 | - 基本赋值运算符:`=` 220 | - 与逻辑运算符等等于`==`区别。 221 | - 扩展赋值运算符:`+=, -=, *=, /=,...` 222 | - 注意:此类运算符隐含强制类型转换,<即强制转换为左侧的数据类型>。(潜在考点,可能见于笔试小题) 223 | - 示例:`byte a;`时:`a+=10;`相当于`a=(a的数据类型)(a+10);`,但`a=a+10`就可能因为数据类型不一致而报错。 224 | 225 | - ### 关系运算符 226 | - 符号包含:`==,!=,>,>=,<,<=` 227 | - 结果类型:关系运算符的结果都是boolean型,true或false。 228 | - 注意:关系运算符“==”不能误写成“=” 。 229 | - `输出(a==b)`: 判断a与b是否相等,然后输出比较结果。 230 | - `输出(a=b)`: 把b的值赋值给a,然后将a的值输出。 231 | - 注意:如果在布尔型变量位置出现`a=b`,要知道此处的结果。 232 | 233 | - ### 逻辑运算符 234 | - 逻辑运算符用于连接关系表达式 235 | - 注意:在Java中不可以写成`33 && x<6`。 236 | - 符号包含:`&,|,^,!,&&,||` 237 | - 与运算`&`:一假即假,全真才真。 238 | - 或运算`|`:一真即真,全假才假。 239 | - 异或运算`^`:相同为假,不同为真。(异或即求异) 240 | - 非运算`!`:只连接一个,转为反面 (注:!!可两个以上相连使用不会报错)。 241 | - 短路:双与双或 242 | - 结果与"单与"和"单或"一样。 243 | - `&`:两边都参与运算;`&&`:左为false时,右边不执行。 244 | - `|`:两边都参与运算;`||`:左为true时,右边不执行。 245 | - 示例: 246 | ```java 247 | int a = 10, b = 20; 248 | System.out.println((a++ > 10) && (b++ > 20));//先算a与10的比较,后a++,不成立则短路,false 249 | System.out.println(a);//a=11 250 | System.out.println(b);//b=20 短路未执行,因此不变 251 | ``` 252 | 253 | - ### 三元运算符 254 | - 格式:`(关系表达式)?表达式1:表达式2;` 255 | - 如果条件为true,运算后的结果是表达式1; 256 | - 如果条件为false,运算后的结果是表达式2; 257 | - 获取两个数中大数: 258 | - `z = (x>y)?x:y;//z变量存储的就是两个数的大数。` 259 | - 比较两个整数是否相同: 260 | - `boolean b = (a==b) ? true : false;` 261 | - `boolean b = (a==b); //其实这样写就可以了,上一行是为了演示三元运算符` 262 | - 获取三个数中的最大值: 263 | ```java 264 | int temp = (a>b) ? a: b; 265 | int max = (temp>c) ? temp: c; 266 | ``` 267 | 268 | - ### 位运算符 269 | - 左移和右移: 270 | - 左移:二进制位向左移动,相当于乘以2的次幂运算,移动几位就是几次幂。 271 | - 右移:二进制位向右移动,相当于除以2的次幂运算,移动几位就是几次幂。(整除) 272 | - 好处:运算速度快;弊端:只能操作2的倍数。 273 | - 右移和无符号右移: 274 | - 右移:最高位补位原则是,原最高位是什么,就补什么; 275 | - 无符号右移:空位补0。 276 | - 无符号右移:不用于做除法,用于获取二进制中的某些位。 277 | - 与`&`、或`|`:同逻辑运算符的位运算。 278 | - 异或`^`:位相同取1,不同取0。 279 | - 性质:`a^b^b=a;`,可以用于简单加密。 280 | - 反码`~`:二进制的每一位,0变成1,1变成0 281 | - 当n为正数时,`~(n) = -(n+1)` 282 | - 当n为负数时,`~(-n) = |n| - 1`,忽略负号。 283 | - 例如:`~6+1 = -6;`,`~(-3) = 2` 284 | - ### 经典面试题:两个整数互换 285 | - 三种方法:通过第三方变量;通过和;通过异或。 286 | - 第三方:`temp = a; a = b; b = temp` 287 | - 通过和(可能超出范围,慎用):`a = a+b; b = a-b; a = a-b; //和-自己=另一个数` 288 | - 通过异或:`a=a^b; b=a^b; a=a^b; //a^b^b=a` 289 | - `a=a^b;` 290 | - `b=a^b=(a^b)^b=a;` 291 | - `a=a^b=(a^b)^a=(b^a)^a=b;` (根据两数异或的原理,可知交换律符合,故可得) 292 | 293 | - ### [运算符优先级](https://www.cnblogs.com/anliux/p/12342676.html) 294 | - 括号>符号>乘除加减>位移>逻辑大于小于>逻辑等等于>与或非>双与双非>三目>赋值(=、某=) 295 | - 1265453-20200221193113530-594239145 296 | 297 | 298 | 299 | * ### [返回目录](#目录) 300 | 301 | 302 | 303 | 304 | ## 程序流程控制 305 | - ### 顺序结构 306 | - 按照代码的先后顺序,依次执行。 307 | 308 | - ### 选择结构: 309 | - 控制语句体的执行与否,又叫分支结构,有if和switch两种。 310 | - if语句: 311 | - 格式1:一种情况的判断 312 | - 首先执行关系表达式;如果true,就执行语句体;否则为false,则不执行语句体。 313 | ```java 314 | if(关系表达式) 315 | { 语句体 } 316 | ``` 317 | - 格式2:两种情况的判断 318 | - 首先执行关系表达式;如果true,就执行语句体1;否则为false,则执行语句体2。 319 | ```java 320 | if(关系表达式) 321 | { 语句体1; } 322 | else 323 | { 语句体2; } 324 | ``` 325 | - 格式3:多种情况的判断 326 | - 首先执行关系表达式1,为true则执行语句体1;否则执行表达式2,为true则执行语句体2;...;否则,执行语句体n+1. 327 | - 注意:是判断就可能为false,因此若语句体都是对相同变量赋值,如果语句体n+1为空,则会编译报错,需要完善。 328 | ```java 329 | if(关系表达式1) 330 | {语句体1;} 331 | else if (关系表达式2) 332 | {语句体2;} 333 | … 334 | else 335 | {语句体n+1;} 336 | ``` 337 | - switch语句: 338 | - 关键字:switch,case,default,break。 339 | - 格式: 340 | ```java 341 | 342 | switch(表达式) { 343 | case 值1: 344 | 语句体1; 345 | break; 346 | case 值2: 347 | 语句体2; 348 | break; 349 | … 350 | default: 351 | 语句体n+1; 352 | break; 353 | } 354 | 355 | ``` 356 | - 表达式的取值:byte,short,int,char, JDK5以后可以是枚举, JDK7以后可以是String; 357 | - case后面的值:要和表达式进行比较的值; 358 | - 注意:case标签不能重复,重复产生了不确定性。 359 | - 语句体部分可以是一条或多条语句; 360 | - break表示中断,结束的意思,可以结束switch语句; 361 | - 注意:如果没有break,则运行到switch语句的最后结束。 362 | - default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。 363 | - 注意:无论摆放位置如何,都是按照`case->default`的顺序。 364 | - 执行流程:计算表达式;将结果与case后的值比较,遇break结束;都不匹配,则执行default。 365 | - 注意:找到某case或从default执行时,到break或switch末尾结束。 366 | - 如果某case没break,则继续向下执行下面的case的内容直到遇到break或switch末尾。 367 | 368 | - ### 循环结构: 369 | - 控制语句体循环,直到不再满足循环条件 370 | - 循环语句的组成: 371 | - 初始化语句,判断条件语句,循环体语句,控制条件语句。 372 | - 三种:for, while, do…while 373 | - for语句: 374 | - 格式: 375 | ```java 376 | for(初始化语句;判断条件语句;控制条件语句) 377 | {循环体语句;} 378 | ``` 379 | - 执行流程: 380 | - 初始化;判断条件语句,false则结束循环,否则继续;循环体语句;控制条件语句;重新执行判断条件语句。 381 | - 示例: 382 | - 水仙花数是指一个三位数,其各位数字的立方和等于该数本身。 383 | - 隐含了范围是100-999,因此`for(int i=100;i<1000;i++){...}` 384 | - 个位:153%10;十位:153/10%10;百位:153/10/10%10。 385 | - PS: 水仙花数一共有4个 (153, 370, 371, 407). 386 | - while循环: 387 | - 格式: 388 | ```java 389 | 初始化语句; 390 | while(判断条件语句) 391 | { 循环体语句; 392 | 控制条件语句; } 393 | ``` 394 | - do-while循环: 395 | - 格式:注意,while后面还有分号的。 396 | ```java 397 | 初始化语句; 398 | do{ 399 | 循环体语句; 400 | 控制条件语句; 401 | }while((判断条件语句); 402 | ``` 403 | - 三种循环的区别: 404 | - do…while循环至少会执行一次循环体。 405 | - for循环和while循环只有在条件成立的时候才会去执行循环体 406 | - for循环语句和while循环语句的小区别: 407 | - 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用; 408 | - 因此,如果想继续使用,就用while,否则推荐使用for。 409 | - 此处注意:变量有效范围。 410 | - 三种循环选取优先级:for > while > do while. 411 | - break和continue: 412 | - 两者都只能用在循环中 (脱离使用场景则没有意义)。 413 | - break: 414 | - 使用场景:switch语句;循环。 415 | - 作用:跳出单层循环。即默认作用于所在循环。例如位于内层时break则跳出内循环。 416 | - 注意:若内层break控制外循环,则可以使用标记符号标记内外循环。 417 | - 示例:(continue也可以这样使用) 418 | ```Java 419 | outer: for(){ //注意冒号别丢了 420 | inter: for(){ 421 | ....; 422 | break: outer;//直接跳出外循环。 423 | //continue: outer; //继续外循环。 424 | } 425 | } 426 | ``` 427 | - continue: 428 | - 使用场景:循环。 429 | - 注意:break和continue如果单独存在,该条语句下面都不可以有语句(永远执行不到的废物语句,会报错) 430 | - 两者的区别:break-退出当前循环;continue-退出本次循环,并继续下次循环。 431 | - 无限循环: 432 | - 格式:`while(true){}`, `for(,,){}` 433 | - 存在的原因:并不知道循环多少次,而是根据某些条件来控制循环;控制循环语句一般放在循环体中,并配合break等使用。 434 | 435 | 436 | * ### [返回目录](#目录) 437 | 438 | 439 | 440 | 441 | ## 数组 442 | - ### 一维数组 443 | - 概述: 444 | - 数组是存储同一种数据类型多个元素的容器。 445 | - 数组既可以存储基本数据类型,也可以存储引用数据类型。 446 | - 特点注意: 447 | - 元素类型必须一致; 448 | - 元素有整数索引; 449 | - 长度一旦定义好就无法改变; 450 | - 可以存储基本数据类型,也可存储引用数据类型。 451 | - 定义数组: 452 | - 格式1:`数据类型[] 数组名;` -- 推荐使用 453 | - 格式2:`数据类型 数组名[];` 454 | - 注意:这两种定义做完了,数组中是没有元素值的。需要初始化。 455 | - 数组的初始化: 456 | - 定义:为数组中的数组元素分配内存空间,并为每个数组元素赋值。 457 | - 分类: 458 | - 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值(默认初始化)。 459 | - 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。 460 | - 动态初始化: 461 | - 格式:`数据类型[] 数组名 = new 数据类型[数组长度];` 462 | - new:为数组申请内存分配,开辟空间。 463 | - 未指定数组元素时,通过数值名输出地址值,例如打印arr输出 ` [I@15db9742 ` 464 | - 地址值 `[I@15db9742 `: 一个方括号表示一维数组,I表示int型,` @ `是分隔符,后面是哈希值。 465 | - 访问数组元素:使用索引值。例如`arr[i]`。 466 | - 静态初始化: 467 | - 格式:`数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};` 468 | - 注意后面小括号不定义数组长度,以免不一致造成不确定性。 469 | - 简写:`数据类型[] 数组名 = {元素1,元素2,…};`,例如:`int[] arr = {1,2,3};` 470 | - 数组属性:length -- 获取数组中元素的个数。 471 | - 使用:`数组名.length;` 472 | - 数组获取最值的思路: 473 | - 注意:参照物从数组元素中取,否则容易出现取太大超过所有数组元素的情况。 474 | 475 | - ### 二维数组 476 | - 概述:二维数组其实就是元素为一维数组的数组。 477 | - 定义格式: 478 | - `数据类型[][] 数组名;` -- 推荐 479 | - `数据类型 数组名[][];` -- 不推荐 480 | - `数据类型[] 数组名[];` -- 不推荐 481 | - 初始化方式: 482 | - 动态初始化:`数据类型[][] 变量名 = new 数据类型[m][n];` 483 | - m:二维数组中的一维数组的个数,n:一维数组的元素个数。 484 | - 静态初始化:`数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};` 485 | - 简化版格式:`数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};` 486 | - 二维数组名+索引:获取一维数组地址名 487 | - 例如:arr[][]={{},{},..,{}}; 488 | - `syso(arr);` -- 二维数组地址值:例如`[[I@6d06d69c `,两个方括号表示是二维数组。 489 | - `syso(arr[1]);` -- 二维数组中第二个一维数组的地址值:例如`[I@7852e922 `,一个方括号表示一维数组。 490 | - 遍历二维数组: 491 | ```java 492 | int[][] arr2 = {{1,2,3,4},{5,6},{7,8,9}}; 493 | for(int i = 0; i < arr2.length; i++) { 494 | for(int j = 0; j < arr2[i].length; j++) { 495 | System.out.print(arr2[i][j]+" "); 496 | } 497 | System.out.println(); 498 | } 499 | ``` 500 | 501 | - ### 数组初始化问题: 502 | - 二维数组:左侧的方括号可以放在任意插空位置; 503 | - 静态初始化:右侧可以直接赋值空花括号,不报错。例如`int[] arr = {};` 504 | - 这样相当于定义了一个长度为0的数组,里面没有元素,`arr[0]`也会越界异常。 505 | - 如果后期要添加元素,可使用其他容器,比如ArrayList等。 506 | - 动态初始化:一维必须指定数组长度,二维必须指定前一个方括号中的值(降维为一维理解)。 507 | - 关于二维数组动态初始化只赋值前一个方括号: 508 | - 没有指定一维数组的长度,则一维数组在内存中不存在; 509 | - 长度一旦确定,数组实体就会new出来; 510 | - 长度不确定,数组实体就还不存在。 511 | - 示例:`int[][] arr=new int[3][];` 512 | - `syso(arr)`:输出arr地址值; 513 | - `syso(arr[0])`:输出null,开辟了空间,但其中的一维数组没有new出来; 514 | - `syso(arr[0][0])`:空指针异常,arr[0]已经是null为空了,不能操作该数组中的元素。 515 | - new一维数组:`arr[0] = new int[5];`,之后再打印`[0][0]`就不会空指针异常了。 516 | 517 | - ### 地址值概述 518 | - 示例:`[[I@6d06d69c ` 519 | - `[[`:表示二维数组,如果是一个方括号,表示一维数组; 520 | - `I`:表示int类型; 521 | - ` @ `:分隔符; 522 | - 后面的数字:16进制哈希值,由哈希算法得出,表示实体在内存中的位置。 523 | - 即:看到哈希值,说明必然有实体。 524 | - #### 注:打印数组名特例 -- `char[] chs` 525 | - 数值型数组如int型数组:初始化后直接打印数组名,输出的是地址值。 526 | - char类型数组输出总结: 527 | - 直接输出数组名:将数组以字符串形式打印; 528 | - 输出前面加字符:输出的是地址; 529 | - 输出前面加字符的情况下想要输出数组内容:Arrays.toString(ch),数组内容将以数组形式输出: 530 | - 注:直接打印字符串变量名,输出的也是字符串内容;前面加字符串后,输出的仍是字符串内容。 531 | - 注:字符串数组直接输出的是地址值。 532 | - 参考:[【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容](https://www.cnblogs.com/anliux/p/12641018.html) 533 | 534 | - ### 数组常见问题: 535 | - 数组索引越界异常:ArrayIndexOutOfBoundsException 536 | - 产生原因:访问到了数组中的不存在的索引时发生。 537 | - 空指针异常:NullPointerException 538 | - 产生原因:数组引用没有指向对象,却在操作对象中的元素或使用数组名访问元素。 539 | - 例如:`arr=null; syso(arr[1]);` 540 | - 引用类型:类,接口,数组。 541 | - 空常量:null,可以赋值给引用类型变量。 542 | 543 | 544 | * ### [返回目录](#目录) 545 | 546 | 547 | 548 | 549 | ## java内存分配 550 | - ### 分类: 551 | - 栈:存储局部变量; 552 | - 堆:存储new出来的东西,实体、对象;new:进行空间开辟。 553 | - 方法区:(面向对象进阶讲); 554 | - 本地方法区:(和系统相关); 555 | - 寄存器:(给CPU使用)。 556 | 557 | - ### 栈:存储局部变量。 558 | - 栈的读取速度比堆快。 559 | - 局部变量:定义在方法中的变量; 560 | - 一旦生命周期结束,即使用完毕后,立即回收。 561 | - 基本数据类型会一直在栈中创建,当声明基本类型时,不需要new。 562 | - 基本类型一旦被声明,java将在栈上直接存储它,所以基本类型的变量表示的是数据本身。 563 | - 假如调用基本类型的包装类来创建对象,那么将会在堆中创建。 564 | 565 | - ### 堆:存储new出来的东西,实体、对象。 566 | - 堆的读取速度比栈慢。 567 | - 每个对象都有地址值; 568 | - 每个对象的数据都有默认值: 569 | - byte, short, int, long: 0; 570 | - float, double: 0.0; 571 | - char:'\u0000'; -- unicode编码的空字符。 572 | - boolean: false; 573 | - 对象:null. 574 | - 使用完毕后,会在垃圾回收器空闲的时候回收。 575 | 576 | - ### 数组内存: 577 | - 定义的局部变量arr只存数组实体的地址(引用型变量); 578 | - 实体对象在堆内存中,通过new来开辟空间。 579 | - java中的内存分配图解: 580 | ![java中的内存分配图解](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/Java%E4%B8%AD%E7%9A%84%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E5%9B%BE%E8%A7%A3.bmp) 581 | - 一个数组的内存图: 582 | ![一个数组的内存图](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E4%B8%80%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E5%86%85%E5%AD%98%E5%9B%BE.bmp) 583 | - 两个数组的内存图: 584 | ![两个数组的内存图](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E5%86%85%E5%AD%98%E5%9B%BE.bmp) 585 | - 两个数组指向同一个地址的内存图: 586 | ![两个数组指向同一个地址的内存图](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E6%8C%87%E5%90%91%E5%90%8C%E4%B8%80%E4%B8%AA%E5%9C%B0%E5%9D%80%E7%9A%84%E5%86%85%E5%AD%98%E5%9B%BE.bmp) 587 | - 静态初始化内存图 588 | ![静态初始化内存图](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E9%9D%99%E6%80%81%E5%88%9D%E5%A7%8B%E5%8C%96%E5%86%85%E5%AD%98%E5%9B%BE.bmp) 589 | - 数组操作的两个常见小问题 590 | ![数组操作的两个常见小问题](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%B8%B8%E8%A7%81%E5%B0%8F%E9%97%AE%E9%A2%98.bmp) 591 | - 数组操作之获取最值图解 592 | ![数组操作之获取最值图解](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/arrays/%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C%E4%B9%8B%E8%8E%B7%E5%8F%96%E6%9C%80%E5%80%BC%E5%9B%BE%E8%A7%A3.bmp) 593 | 594 | 595 | * ### [返回目录](#目录) 596 | 597 | 598 | 599 | 600 | ## 方法 601 | - ### 方法概述 602 | - 方法就是完成特定功能的代码块 603 | - 在很多语言里面都有函数的定义 604 | - 函数在Java中被称为方法 605 | 606 | - ### 方法的格式: 607 | - 方法三要素:函数名,参数列表,结果类型。 608 | - 格式: 609 | ```java 610 | 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 611 | 函数体; 612 | return 返回值; 613 | } 614 | ``` 615 | - 格式解释: 616 | - 修饰符:public static 617 | - 返回值类型:用于限定返回值的数据类型 618 | - 方法名:一个名字,为了方便我们调用方法 619 | - 参数类型:用于接收调用方法时传入的数据的类型 620 | - 参数名:用于接收调用方法时传入的数据的变量 621 | - 方法体:完成功能的代码 622 | - return:结束方法,把返回值带给调用者(返回值为void时可以省略,或`return;`) 623 | - 注:return不能写在最前面,否则后面的语句都执行不到了,同`break`。 624 | - 注意:函数中只能调用函数,不能在函数内部定义函数。(存疑) 625 | 626 | - ### 写方法 627 | - 写一个方法首先有两点需要明确: 628 | - 返回值类型:明确功能结果的数据类型; 629 | - 参数列表:明确有几个参数,以及参数的类型。 630 | 631 | - ### 方法的调用 632 | - 方法的一个很重要的特点:不调用不执行。 633 | - 有明确返回值的方法调用: 634 | - 单独调用:没有意义;(eg. `sum(10,20);`, 调用了但是什么都没有做,没有联系) 635 | - 输出调用:有意义,但是不够好,因为不一定非要把结果输出; 636 | - 赋值调用:推荐方式。 637 | - 图解:求和方法的调用图解 638 | ![求和方法的调用图解](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/method/%E6%B1%82%E5%92%8C%E6%96%B9%E6%B3%95%E7%9A%84%E8%B0%83%E7%94%A8%E5%9B%BE%E8%A7%A3.bmp) 639 | - 没有明确返回值的方法调用: 640 | - 其实就是void类型方法的调用(没有返回值类型也不能把返回值类型这里空着); 641 | - 参数列表:可以为空,例如`void printHW(){...}`; 642 | - 只能单独调用,例如`printHW();` -- (是与输出调用和赋值调用相比)。 643 | 644 | - ### 方法的重载 645 | - 方法重载概述: 646 | - 在同一个类中,方法名相同,参数列表不同的情况。 647 | - 方法重载特点: 648 | - 方法名相同,参数列表不同。 649 | - 参数列表不同:参数个数或者参数类型不同 650 | - 注:参数列表是有顺序的,`(int, float)`和`(float,int)`也算重载。 651 | - 注:参数个数不同包括一个是多参数,一个是空参数的情况。 652 | - 在调用时,java虚拟机通过参数列表的不同来区分同名方法。 653 | - 注:与返回值类型无关,只看方法名和参数列表 654 | - 参考`int sum(int a, int b)`和`int sum(int a, int b, int c);` 655 | 656 | - ### 方法参数传递问题 657 | - 形式参数:用于接收实际参数的变量。 658 | - 实际参数:实际参与运算的变量。 659 | - 方法的形式参数是基本数据类型:形式参数的改变不影响实际参数。 660 | - 图解: 661 | ![方法的形式参数是基本数据类型](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/method/%E6%96%B9%E6%B3%95%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%8F%82%E6%95%B0%E6%98%AF%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B%E5%9B%BE%E8%A7%A3.bmp) 662 | - 方法的形式参数是引用数据类型:形式参数的改变直接影响实际参数。 663 | - 传递的是引用型变量的地址值,因此改变后,是对本体进行改变的。 664 | - 图解: 665 | ![方法的形式参数是引用数据类型](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/method/%E6%96%B9%E6%B3%95%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%8F%82%E6%95%B0%E6%98%AF%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E5%9B%BE%E8%A7%A3.bmp) 666 | 667 | 668 | * ### [返回目录](#目录) 669 | 670 | 671 | 672 | 673 | ## 基础语法练习 674 | - ### 录入月份输出对应季节 675 | - 记得做非法输入判断 (包含对不属于1-12范围输入的判断) 676 | - 用switch比if-else判断好一点; 677 | - 整合相同季节,而不是每个月份数字做一次判断; 678 | - if-else:可以用或连接多个月份数字,或者用范围;冬季12,1,2用范围不好表示可以放在最后的else里。 679 | - switch:case穿透,将相同的季节的case放在一起穿透 680 | ```java 681 | case 3: 682 | case 4: 683 | case 5: 684 | syso("春季"); 685 | break; 686 | ``` 687 | 688 | - ### 斐波那契数列问题 689 | - 前两项和等于新的数的数列:1,1,2,3,5,,.... 690 | - 注意第一项和第二项是从几开始的。 691 | - 跳台阶问题同(跳台阶方法数为斐波那契数列)。 692 | - 生兔子问题同(兔子总数为斐波那契数列)。 693 | - 求解方法: 694 | - 递归; 695 | - 数组保存每个结果; 696 | - 用变量保存前两项,并不断更新前两项变量的值。 697 | 698 | - ### 评委打分问题 699 | - 题目:竞赛中有6个评委打分(0-100),去掉最高分和最低分后的平均分为最后得分,求最终得分。 700 | - 思路:键盘获取6个打分并存入数组中,写’getMax()‘,’getMin()‘,’getSum()‘三个方法并调用,avg=(sum-max-min)/(arr.length-2) 701 | - 注:就最简单最质朴的解决思路,没有花里胡哨的技巧 702 | 703 | - ### 数组元素反转 704 | - 双指针从两端向中间遍历,同时交换两指针对应的元素,直到两指针相遇;仔细考虑临界条件! 705 | - 交换两个数:常规是利用第三方变量;或者利用两数和;或者利用两数异或。 706 | - 关键代码:`for(int start=0, end=arr.length-1; start<=end; start++,end--){}` 707 | - 图解 708 | ![基础语法练习之数组元素反转分析](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/baseTest/%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%E7%BB%83%E4%B9%A0%E4%B9%8B%E6%95%B0%E7%BB%84%E5%85%83%E7%B4%A0%E5%8F%8D%E8%BD%AC%E5%88%86%E6%9E%90.bmp) 709 | 710 | - ### 数组基本查找 711 | - 题目:定义一个数组,键盘录入被查找数据,写方法得到target第一次出现的索引值 712 | - 思路:写方法时for循环遍历数组,比较每个元素与target,循环内if判断,相等时返回 713 | - 注意点:既然是if判断,就有可能全部不符合,但是返回值类型又是一个int型数值,因此需要在for循环外额外加一个`return -1;` 714 | - 这一点在编程题目中非常常见,引起注意 715 | 716 | - ### 加密数字 717 | - 要求对一个四位数的每个位的数字进行各种操作: 718 | - eg. 每一位数+5, 对10取余,之后1 4位和2 3位交换 719 | - 可以将每个位的数字拆开,并放入一个数组中,便于操作。 720 | - 拆开指:`arr[0](千位)=a/10/10/10%10;`, `arr[1]=a/10/10%10;`,`arr[2]=a/10%10;`,`arr[3]=a%10;` 721 | 722 | 723 | * ### [返回目录](#目录) 724 | 725 | 726 | 727 | 728 | ### END 729 | -------------------------------------------------------------------------------- /notes/01-java-base/Java多线程.md: -------------------------------------------------------------------------------- 1 | # Java多线程 2 | 3 | 4 | ### 目录 5 | 6 | 7 | * [多线程概述](#多线程概述): 进程和线程, 单线程和多线程, Thread类, 主方法是单线程 8 | * [多线程的实现方式](#多线程的实现方式): Thread的常用方法(getName,setName,Thread(Runnable target),Thread.currentThread()), 继承Thread类构建线程, 实现Runnable接口构建线程, 两种方法对比 9 | * [多线程模拟火车站售票与同步代码块](#多线程模拟火车站售票与同步代码块): 分析, Ticket类和主函数代码示例, 线程中加入sleep(), 同步代码块, 同步方法 10 | * [线程的生命周期](#线程的生命周期): 生命周期, 线程的生命周期, 图解 11 | 12 | 13 | 14 | 15 | ## 多线程概述 16 | - ### 进程和线程: 17 | - 进程:当前正在运行的程序,一个应用程序在内存中的执行区域 18 | - 参考任务管理器中展示的多个进程 19 | - 线程:进程中的一个执行控制单元,执行路径 20 | - 运行程序是通过进程中的线程来执行的,线程依赖于进程 21 | - 例如:一个公司接了一个活,这个活是由公司里的程序员来做的 22 | 23 | - ### 单线程和多线程: 24 | - 一个进程可以有一个线程(单线程), 也可以有多个线程(多线程) 25 | - 单线程:安全性高,但效率低 26 | - 多线程:安全性低,但效率高 27 | - 举例:只刷牙肯定不会出问题,但是占用时间; 边刷牙边看手机,手机可能会掉水池里 28 | 29 | - ### 多线程案例: 30 | - 360中的多个线程同时执行:边体检边杀毒 31 | - 迅雷中的多个下载任务同时执行 32 | 33 | - ### Thread类 34 | - 位于java.lang包下,可以直接使用 35 | - 实现了Runnable接口 36 | - 线程:是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。 37 | - 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。 38 | 39 | - ### 主方法 40 | - 主方法的单线程和多线程两种方法的探讨图示 41 | - 如果是单线程的: 42 | ![主方法是单线程的](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/thread/%E4%B8%BB%E6%96%B9%E6%B3%95%E6%98%AF%E5%8D%95%E7%BA%BF%E7%A8%8B%E7%9A%84.bmp) 43 | - 如果是多线程的: 44 | ![主方法是多线程的](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/thread/%E4%B8%BB%E6%96%B9%E6%B3%95%E6%98%AF%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84.bmp) 45 | - 结论 46 | - 主方法是单线程 47 | - 但是主方法中可以定义多个线程,以此来实现多线程 48 | 49 | 50 | * ### [返回目录](#目录) 51 | 52 | 53 | 54 | 55 | ## 多线程的实现方式 56 | - Thread的常用方法 57 | - `String getName()`: 58 | - 返回该线程的名称。 59 | - `void setName(String name)`: 60 | - 改变线程名称,使之与参数 name 相同。 61 | - 传入Runnable对象的构造方法:`Thread(Runnable target)` 62 | - 分配新的 Thread 对象 63 | - 可以用在实现Runnable的多线程中 64 | - `static Thread currentThread()`: 65 | - 返回对当前正在执行的线程对象的引用。 66 | - 静态可以直接类名调用,可以用在实现Runnable的多线程中 67 | - 注意:想要调用类名仍然需要使用getName()方法 68 | - 调用类名示例:`Thread.currentThread().getName()` -- 链式编程 69 | 70 | - ### 方式1:继承Thread类 71 | - 将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例 72 | - 四个要点 73 | - 1. 将类声明为 Thread 的子类:继承Thread类 74 | - 2. 该子类应重写 Thread 类的 run 方法:重写run()方法 75 | - 3. 分配:创建该子类的实例 new 76 | - 4. 启动该子类的实例:start()方法 77 | - 创建MyThread类并定义 78 | - 两个要点:继承Thread方法;重新run()方法 79 | - 代码示例: 80 | ```java 81 | //MyThread.java 82 | public class MyThread extends Thread{ 83 | @Override 84 | public void run() {//这里可以输入run后用alt+/自动填充 85 | for (int i = 0; i < 100; i++) { 86 | System.out.println(getName() + ": " + i); 87 | } 88 | } 89 | } 90 | ``` 91 | - 在main方法中创建并使用MyThread对象 92 | - 两个要点:创建子类对象;启动子类示例 93 | - 代码示例: 94 | ```java 95 | //ThreadDemo.java 96 | public class ThreadDemo { 97 | public static void main(String[] args) { 98 | //创建线程实例 99 | MyThread mt = new MyThread(); 100 | //修改线程名字 101 | mt.setName("张三"); 102 | //启动线程 103 | mt.start(); 104 | 105 | MyThread mt2 = new MyThread();//创建线程示例 106 | mt2.setName("李四"); 107 | mt2.start();//启动线程 108 | } 109 | } 110 | ``` 111 | - 多线程资源分配: 112 | - 每次运行,两个线程的启动先后是不一样的: 113 | - 随机性 114 | - CPU执行程序(线程)的随机性: 115 | - CPU在多个线程之间快速切换 116 | - 感觉不到程序卡顿,实际是CPU在快速切换,同时仍然是只执行某一个线程 117 | - 多线程的高效性: 118 | - 虽然是同时只能执行一个,但多线程的情况下,抢到执行权的概率就高了,效率相对也变高了 119 | 120 | - ### 方式2:实现Runnable接口 121 | - 声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。 122 | - 定义线程类,并实现Runnable接口 123 | - 线程类:实现 run 方法 124 | - 创建线程类实例 125 | - 创建 Thread 时,该实例作为一个参数来传递并启动:`new Thread(p).start();` 126 | - 创建Thread和启动start可以分两步,也可以写在一起 127 | - 创建MyThread类并定义 128 | - 两个要点:继承Thread方法;重新run()方法 129 | - 代码示例: 130 | ```java 131 | public class MyThread implements Runnable{ 132 | @Override 133 | public void run() {//这里可以输入run后用alt+/自动填充 134 | for (int i = 0; i < 100; i++) { 135 | System.out.println(Thread.currentThread().getName()+ ": " + i);//getName()不可用了 136 | } 137 | } 138 | } 139 | ``` 140 | - 在main方法中创建并使用MyThread对象 141 | - 两个要点:创建子类对象;启动子类示例 142 | - 两种方法: 143 | - 分别创建两个MyThread实例和两个Thread实例 144 | - 共用同一个MyThead实例,分别传入两个Thread实例中 145 | - 弊端:如果MyThread带参构造,new时传入参数,并在run()中进行了输出等使用,则结果会不同 146 | - 代码示例: 147 | ```java 148 | //分别创建两个MyThread实例和两个Thread实例 149 | public class ThreadDemo { 150 | public static void main(String[] args) { 151 | //创建线程实例 152 | MyThread mt = new MyThread();//new时可以传入不同的参数 153 | Thread t = new Thread(mt); 154 | t.setName("老王"); 155 | t.start(); 156 | 157 | //创建另一个线程实例 158 | MyThread mt2 = new MyThread();//new时可以传入不同的参数 159 | Thread t2 = new Thread(mt2); 160 | t2.start(); 161 | } 162 | } 163 | 164 | //共用一个MyThread实例,分别传入两个Thread实例中 165 | public class ThreadDemo { 166 | public static void main(String[] args) { 167 | //创建线程实例 168 | MyThread mt = new MyThread();//共用:new时传入的参数相同 169 | Thread t = new Thread(mt); 170 | t.setName("老王"); 171 | t.start(); 172 | 173 | //创建另一个线程实例 174 | Thread t2 = new Thread(mt); 175 | t2.start(); 176 | } 177 | } 178 | ``` 179 | 180 | - ### 两种方式的区别: 181 | - 第一种是继承,而第二种是实现。 182 | - 鉴于Java的单一继承规则,如果用第一种方式,则不能再继承其他父类,而用第二种,不影响其他父类的继承 183 | - 推荐使用第二种:实现的方式 184 | 185 | 186 | * ### [返回目录](#目录) 187 | 188 | 189 | 190 | 191 | ## 多线程模拟火车站售票与同步代码块 192 | - ### 分析: 193 | - 需要火车票的总数量,并且每售出一张,数量减一 194 | - 需要判定:当火车票数量小于1时,停止售票 195 | - 需要使用多线程模拟多个售票窗口 196 | - 当火车票售完以后,火车票并不会关门,仍然开着 197 | 198 | - ### Ticket类 199 | - 注意点: 200 | - 优先选实现Runnable的方法 201 | - 设置票数变量tickets,且调用时使用同一个TicketThread对象实例,以保证是同一个票数对象在变化 202 | - tickets--:放在循环里,节约写代码的空间 203 | - 代码示例: 204 | ```java 205 | public class TicketThread implements Runnable{ 206 | int tickets = 100; 207 | 208 | @Override 209 | public void run() { 210 | while(true) {//火车站不会因为票卖光而关闭: 程序需要手动终止 211 | if(tickets > 0 ) { 212 | System.out.println(Thread.currentThread().getName() + ":" + tickets--); 213 | } 214 | } 215 | } 216 | } 217 | ``` 218 | 219 | - ### 主函数 220 | - 步骤: 221 | - 创建同一个Ticket线程实例:保证票数变化的是同一个票数 222 | - 创建三个线程,传入同一个Ticket线程对象,并分别重命名线程的名字 223 | - 启动线程 224 | - 卖票结束后需要手动终止程序 (这个设定危,一定一定要记得终止程序!!!!) 225 | - 代码示例: 226 | ```java 227 | public class ThreadDemo { 228 | public static void main(String[] args) { 229 | //创建线程实例 230 | TicketThread tt = new TicketThread(); 231 | 232 | Thread t1 = new Thread(tt); 233 | t1.setName("窗口1"); 234 | Thread t2 = new Thread(tt); 235 | t2.setName("窗口2"); 236 | Thread t3 = new Thread(tt); 237 | t3.setName("窗口3"); 238 | 239 | //启动线程对象 240 | t1.start(); 241 | t2.start(); 242 | t3.start(); 243 | } 244 | } 245 | ``` 246 | 247 | - ### 线程中加入sleep() 248 | - `static void sleep(long millis)`: 249 | - 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) 250 | - 此操作受到系统计时器和调度程序精度和准确性的影响。 251 | - 加到代码中会需要try-catch捕获异常(上面没有抛出,下面捕获即可) 252 | - 加入sleep()的问题: 253 | - 结果会出问题,比如售出相同票编号多于一次,或售出0甚至负数编号的票 254 | - 代码示例: 255 | ```java 256 | //TicketThread.java 257 | public class TicketThread implements Runnable{ 258 | int tickets = 100; 259 | 260 | @Override 261 | public void run() { 262 | while(true) {//火车站不会因为票卖光而关闭: 程序需要手动终止 263 | if(tickets > 0 ) { 264 | try { 265 | Thread.sleep(100);//参数单位是毫秒 266 | } catch (InterruptedException e) { 267 | e.printStackTrace(); 268 | } 269 | System.out.println(Thread.currentThread().getName() + ":" + tickets--); 270 | } 271 | } 272 | } 273 | } 274 | ``` 275 | - 加入sleep()后出现问题的原因分析: 276 | - 三个售票窗口t1, t2, t3 277 | - 假设只剩下1张票,则仍然符合'if(tickets>0){}'的判断,可以进入if代码块中,即会执行里面的sleep()和syso()语句 278 | - t1: 过来发现有票,进入if代码块,然后sleep()了 279 | - t2: 也过来,发现有票,进入if代码块,然后sleep()了 280 | - 这时t1:sleep结束,执行下一句syso语句,ticket=0; 281 | - 这时t2: sleep结束,执行下一句syso语句,ticket=-1; 282 | - 如果在t1和t2 sleep时,t3也进入了if代码块,则会出现ticket=-2的情况 283 | 284 | - ### 同步代码块 285 | - 问题出现的原因分析: 286 | - 有多个线程; 287 | - 有被多个线程所共享的数据; 288 | - 多个线程并发地访问共享的数据。 289 | - 举例说明:火车上的厕所 290 | - 当有人在使用时,就会把门锁上,标识变红,其他人就进不去了; 291 | - 使用完毕,打开锁,标识变绿,这时其他人才能使用 292 | - 如果里面的人一直锁着门,标识一直是红色,别人无法使用,直到锁打开 293 | - Synchronized: 294 | - 同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个县城访问,则直接锁住,其他的线程将无法访问 295 | - 同步代码块: 296 | - 注意:锁对象需要被所有的线程所共享(否则如果有线程不认识,就难办了) 297 | ```java 298 | Synchronized(锁对象){ 299 | //coding... 300 | } 301 | ``` 302 | - 用同步改进后的TickedThread类: 303 | - 首先要创建一个被所有线程所共享的锁,并传入同步代码块中 304 | - 把需要锁起来的代码放在同步代码块中 305 | - 注:加了同步以后明显能感觉到运行变慢了,这是同步的缺点 306 | ```java 307 | public class TicketThread implements Runnable{ 308 | int tickets = 100; 309 | Object obj = new Object();//放在这里,可以被所有线程所共享,可以作为锁 310 | 311 | @Override 312 | public void run() { 313 | while(true) {//火车站不会因为票卖光而关闭: 程序需要手动终止 314 | synchronized (obj) { 315 | if(tickets > 0 ) { 316 | try { 317 | Thread.sleep(100); 318 | } catch (InterruptedException e) { 319 | e.printStackTrace(); 320 | }//参数单位是毫秒 321 | System.out.println(Thread.currentThread().getName() + ":" + tickets--); 322 | } 323 | } 324 | } 325 | } 326 | } 327 | ``` 328 | - 同步与非同步的优缺点: 329 | - 同步:安全性高,效率低 330 | - 非同步:效率高,安全性低 331 | 332 | - ### 同步方法 333 | - 同步方法的几种方式: 334 | - 方式1: 335 | - 将有问题的代码封装进一个方法中,然后在同步代码块中调用此方法 336 | - 代码示例: 337 | ```java 338 | synchronized (obj) { 339 | method(); 340 | } 341 | ... 342 | private void method(){ 343 | //这里放所有有同步问题的代码 344 | } 345 | ``` 346 | - 方式2: 347 | - 与方式1类似的思路,如果调用时不放在同步代码块中,则使用同步代码块把抽出的方法中的代码都用同步代码块封装 348 | - 代码示例: 349 | ```java 350 | method();//调用时不放在同步代码块中 351 | ... 352 | private void method(){ 353 | synchronized (obj) { 354 | //这里放所有有同步问题的代码 355 | } 356 | } 357 | ``` 358 | - 方式3: 359 | - 使用Synchronized来修饰方法 360 | - 代码示例: 361 | ```java 362 | method();//调用时不放在同步代码块中 363 | ... 364 | private Synchronized void method(){//同步修饰符修饰此方法 365 | //这里放所有有同步问题的代码 366 | } 367 | ``` 368 | - 方式4: 369 | - 静态同步方法,也是可以的,同步修饰符放在void之前,否则报错 370 | - 代码示例: 371 | ```java 372 | method();//调用时不放在同步代码块中 373 | ... 374 | private static Synchronized void method(){//同步修饰符修饰此方法 375 | //这里放所有有同步问题的代码 376 | //注意:此静态方法内的成员方法,也需要用静态修饰,比如外面的`static int tickets=100;` 377 | } 378 | ``` 379 | - 同步方法: 380 | - 使用关键字Synchronized修饰的方法 381 | - 一旦被某一个线程访问,则整个方法全部锁住,其他线程无法访问 382 | - 注意: 383 | - 同步方法也需要有锁对象,与同步代码块必须要一个锁对象类似 384 | - 非静态同步方法的锁对象:this 385 | - 静态同步方法的锁对象:当前类的字节码对象 386 | - 静态方法随着类的加载而加载,没有this 387 | 388 | 389 | * ### [返回目录](#目录) 390 | 391 | 392 | 393 | 394 | ## 线程的生命周期 395 | - ### 生命周期: 396 | - 指一个对象的生老病死 397 | 398 | - ### 线程的生命周期: 399 | - 新建 -- 就绪 -- 运行 -- 死亡,中间可能经历等待 400 | - 新建:创建线程对象 401 | - 两种方法,继承和实现 402 | - 根据需要,如果需要继承其他父类,则只能选择实现的方式 403 | - 就绪: 404 | - 在新建和运行之间的一个阶段 405 | - 具备了执行条件,没有具备执行权利 406 | - 运行: 407 | - 具备了执行条件,同时具备了执行权利 408 | - 死亡: 409 | - 线程对象变成了垃圾 410 | - 等待: 411 | - 介于就绪和运行之间的一个阶段 412 | - 需要锁对象调用:wait()等待,notify()唤醒 413 | - 运行过程中,调用了wait()则进入等待阶段 414 | - 等待过程中,如果调用了notify()则进入 415 | 416 | - ### 图解: 417 | ![线程的生命周期](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/thread/%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.bmp) 418 | 419 | 420 | * ### [返回目录](#目录) 421 | 422 | 423 | 424 | 425 | ### END 426 | -------------------------------------------------------------------------------- /notes/01-java-base/Java异常处理.md: -------------------------------------------------------------------------------- 1 | # Java异常处理 2 | 3 | 4 | ### 目录 5 | 6 | 7 | * [Java异常](#java异常): 异常概述, 异常的体系结构, JVM处理异常的方式 8 | * [异常的处理方式](#异常的处理方式): 捕获(try-catch), 抛出(方法名后throws) 9 | * [处理多个异常](#处理多个异常): 多个try-catch组合, 一个try多个catch, 多个catch的执行顺序 10 | * [Throwable的常用方法](#throwable的常用方法): Throwable概述, getMessage(), toString(), printStackTrace(), 与JVM自动抛出异常的区别, eclipse生成try-catch 11 | * [finally](#finally): finally概述, finally格式, IO流中使用异常捕获的正确方法 12 | * [异常的分类](#异常的分类): 编译时异常, 运行时异常 13 | * [自定义异常](#自定义异常): throw和throws, 查看源码学习定义一个异常的格式, 自定义一个MyException异常 14 | * [递归](#递归): 递归概述, 求5的阶乘, 用debug分析递归算法的执行流程, 斐波那契数列 15 | 16 | 17 | 18 | 19 | ## Java异常 20 | - ### 异常概述 21 | - 引入: 22 | - 在写代码时,经常出现一些小问题。为了方便我们处理这些问题,Java提供了异常机制 23 | - 概述: 24 | - 异常,即不正常,在写代码时出现的编译或运行时的异常。 25 | - 异常内容: 26 | - 包含了错误的类型、原因和位置。 27 | 28 | - ### 异常的体系结构 29 | - 最顶层:Throwable 30 | - Error: 出现的不能处理的严重问题 31 | - Exception: 可以处理的问题 32 | - 类比:电脑 33 | - 系统中毒:重装系统就可以了 34 | - 主板坏了:换一台新电脑 35 | 36 | - ### JVM处理异常的方式 37 | - 如果出现异常我们没有处理,则JVM会帮我们处理 38 | - JVM会把异常的类型、原因、位置显示在命令行,并且终止程序 39 | - 异常后的代码不会执行 40 | 41 | ### 异常的处理方式 42 | - ### 两种: 43 | - 捕获 44 | - 抛出 45 | 46 | - ### 捕获 47 | - 关键语句: 48 | - `throw...catch`,同if-else的语句组合 49 | - 语句格式: 50 | ```java 51 | throw{ 52 | 语句1; 53 | 可能出问题的代码; 54 | 语句2; 55 | }catch(异常类名XxxException 自定义异常名){ 56 | 处理异常语句; 57 | } 58 | ``` 59 | - try..catch语句的执行顺序: 60 | - 如果发生异常: 61 | - 则异常语句下面的代码不执行,直接跳入catch语句中,catch语句结束后,整个try-catch结束。 62 | - 如果没有发生异常: 63 | - try语句执行结束后,try..catch直接结束,不再执行catch语句。 64 | - 代码示例: 65 | ```java 66 | public class ThrowsDemo { 67 | public static void main(String[] args) { 68 | try { 69 | System.out.println(1); 70 | System.out.println(10/0); 71 | System.out.println(2); 72 | }catch(ArithmeticException ae) {//注意catch参数 73 | System.out.println(3); 74 | } 75 | //输出:1 3 76 | } 77 | } 78 | ``` 79 | 80 | - ### 抛出: 81 | - 场景: 82 | - 当我们不想处理异常,或者没有能力处理时,可以选择抛出异常,谁调用方法谁处理异常 83 | - 使用关键字throws在方法的声明处抛出异常 84 | - 注意:抛出的异常可以是异常的父类异常 85 | - 代码示例: 86 | ```java 87 | import java.io.FileWriter; 88 | import java.io.IOException; 89 | 90 | public class ThrowsDemo { 91 | public static void main(String[] args) throws IOException {//此处也可以抛出父类异常: Exception 92 | //method(); 93 | function(); 94 | } 95 | 96 | public static void function() throws IOException{ 97 | FileWriter fw = new FileWriter("a.txt"); 98 | } 99 | } 100 | ``` 101 | 102 | 103 | * ### [返回目录](#目录) 104 | 105 | 106 | 107 | 108 | ## 处理多个异常 109 | - ### 可以使用多个try-catch组合 110 | - 针对可能异常的代码,分别catch异常 111 | - 存在try的代码重复 112 | - 代码示例: 113 | ```java 114 | public class ExceptionDemo { 115 | public static void main(String[] args) { 116 | try { 117 | String s = null; 118 | System.out.println(s.length());//java.lang.NullPointerException 119 | }catch(NullPointerException e) { 120 | System.out.println("空指针异常了"); 121 | } 122 | 123 | try { 124 | int[] arr = new int[5]; 125 | System.out.println(arr[8]);//java.lang.ArrayIndexOutOfBoundsException 126 | }catch(ArrayIndexOutOfBoundsException e) { 127 | System.out.println("数组越界异常了"); 128 | } 129 | /* 输出: 130 | * 空指针异常了 131 | * 数组越界异常了 132 | * */ 133 | } 134 | } 135 | ``` 136 | 137 | - ### 可以使用一个try和多个catch 138 | - 类似于if-else语句,catch直接跟在catch后面即可 139 | - 如果一段代码有多个异常,只能捕获最开始出现的异常,然后就通过catch退出了 140 | - 最后可以添加一个所有异常的父类异常,相当于'if-else if'里的else 141 | - 代码示例: 142 | ```java 143 | public class ExceptionDemo { 144 | public static void main(String[] args) { 145 | try { 146 | //String s = null; 147 | //System.out.println(s.length());//java.lang.NullPointerException 148 | 149 | //int[] arr = new int[5]; 150 | //System.out.println(arr[8]);//java.lang.ArrayIndexOutOfBoundsException 151 | 152 | System.out.println(10/0);//出现异常了 153 | 154 | }catch(NullPointerException e) { 155 | System.out.println("空指针异常了"); 156 | }catch(ArrayIndexOutOfBoundsException e) { 157 | System.out.println("数组越界异常了"); 158 | }catch(Exception e) { 159 | System.out.println("出现异常了"); 160 | } 161 | } 162 | } 163 | ``` 164 | 165 | - ### 多个catch的执行顺序: 166 | - 多个catch之间的异常可以有子父类异常共存; 167 | - 平级异常之间没有顺序关系,可以任意放在前后; 168 | - 如果有子父类同时在,父类异常必须放在子类的后面 169 | - 否则父类后面的代码永远执行不到,java不允许这样的语句存在。 170 | 171 | 172 | * ### [返回目录](#目录) 173 | 174 | 175 | 176 | 177 | ## Throwable的常用方法 178 | - ### Throwable类: 179 | - Java 语言中所有错误或异常的超类。 180 | - 只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。 181 | - 类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。 182 | - 简单来说,当有异常发生的时候,并且收集到某‘Exception e’中时,就可以通过e调用其方法 183 | 184 | - ### `String getMessage()`: 185 | - 获取异常原因 186 | - 示例: 187 | - `catch(ArithmeticException e) { System.out.println(e.getMessage());/// by zero }` 188 | 189 | - ### `String toString()`: 190 | - 获取异常的类型和原因 191 | - 示例: 192 | - `System.out.println(e.toString());//java.lang.ArithmeticException: / by zero` 193 | 194 | - ### `void printStackTrace()`: 195 | - 打印异常的类型、原因和位置 196 | - 自带打印,没有返回值,可以直接调用,会自动输出 197 | - 示例: 198 | - `e.printStackTrace();` 199 | 200 | - ### 与JVM自动抛出异常的区别: 201 | - 手动调用后,是可控的输出,不会终止程序,异常语句后的语句也会正常运行。 202 | - 例如:下方示例代码的try-catch代码块后的hello语句也会正常执行。 203 | 204 | - ### 代码示例: 205 | ```java 206 | public class ExceptionDemo { 207 | public static void main(String[] args) { 208 | try { 209 | System.out.println(10/0);//出现异常了 210 | 211 | }catch(ArithmeticException e) { 212 | System.out.println(e.getMessage());/// by zero 213 | System.out.println(e.toString());//java.lang.ArithmeticException: / by zero 214 | e.printStackTrace(); 215 | /* 216 | * java.lang.ArithmeticException: / by zero 217 | * at test.demo.ExceptionDemo.main(ExceptionDemo.java:6) 218 | * */ 219 | } 220 | syso("hello");//hello 221 | } 222 | } 223 | ``` 224 | 225 | - ### eclipse快速生成try-catch代码: 226 | - 选中语句 -- 右键 -- surroundwith - try/catch block 227 | - 自动填充`e.printStackTrace();`,可以手动修改catch传入的异常类型 228 | 229 | 230 | * ### [返回目录](#目录) 231 | 232 | 233 | 234 | 235 | ## finally 236 | - ### finally概述: 237 | - try-catch-finally组合使用,finally用于释放资源等收尾工作 238 | - 无论try-catch语句如何执行,finally的代码都一定会执行。 239 | 240 | - ### finally格式: 241 | ```java 242 | try{ 243 | 有可能出问题的代码; 244 | }catch(异常对象 异常名){ 245 | 处理异常; 246 | }finally{ 247 | 释放资源; 248 | 清理垃圾; 249 | } 250 | ``` 251 | 252 | - ### IO流中使用异常捕获的正确方法 253 | - 思路: 254 | - `FileWriter fw = new FileWriter("exception.txt");`: 255 | - 两种异常处理方式,之前IO流部分选抛出异常,这次选try-catch环绕,自动生成try-catch代码块 256 | - `fw.close();`: 257 | - 如果写在try部分,中途有异常语句(比如'10除以0'),后面不执行,则不刷新,则异常前的write()也无法写入内容 258 | - 要保证close()执行,则把这条语句放在finally里 259 | - `FileWriter fw = new FileWriter("exception.txt");`: 定义FileWriter对象 260 | - 如果定义在try代码块,则finally的fw.close()会有问题,看不到fw对象 261 | - 所以需要在try-catch代码块外先定义好: `FileWriter fw;` 262 | - `fw.close()`: 263 | - 此时finally部分的close代码仍然需要处理异常,继续选try-catch处理 264 | - 根据错误提示,fw初始化为null:`FileWriter fw = null;` 265 | - 注意:开始写入才需要close,如果在fw创建IO对象/写入语句执行之前就有异常,则抛出相应的异常 (参考如下代码) 266 | - finally部分的fw看不到try部分的fw做了什么,可能在任何位置异常中断,因此需要在代码块外赋初值null 267 | - 代码示例: 268 | ```java 269 | import java.io.FileWriter; 270 | import java.io.IOException; 271 | 272 | public class ExceptionDemo { 273 | public static void main(String[] args) { 274 | FileWriter fw = null;////finally的fw看不到try部分的任何操作,需要有初始化值 275 | try { 276 | System.out.println(10/0);//此句异常:抛出异常,没有生成"exception.txt"文件 277 | fw = new FileWriter("exception.txt"); 278 | fw.write("hello"); 279 | fw.write("java"); 280 | //System.out.println(10/0);//此句异常:中断刷新后,仍然写入了hellojava 281 | fw.write("world"); 282 | 283 | } catch (IOException e) { 284 | // TODO Auto-generated catch block 285 | e.printStackTrace(); 286 | } finally { 287 | try {//close: 放在finally中保证执行此句代码,由此衍生出另一个try-catch代码块 288 | if(fw != null)//不加这条判断,会抛出空指针异常 289 | fw.close();//加上这条判断:java.lang.ArithmeticException 290 | } catch (IOException e) { 291 | // TODO Auto-generated catch block 292 | e.printStackTrace(); 293 | } 294 | } 295 | } 296 | } 297 | ``` 298 | 299 | 300 | * ### [返回目录](#目录) 301 | 302 | 303 | 304 | 305 | ## 异常的分类 306 | - ### 运行时异常 307 | - RuntimeException的子类就是运行时异常 308 | - 在编译时期可以自由选择处理或不处理 309 | - 举例:数组越界异常、空指针异常、数学运算异常(除以0)等都是运行时异常,编译阶段并不会报错。 310 | 311 | - ### 编译时异常 312 | - Exception的子类,且非RuntimeException的子类 313 | - 在编译时期就必须处理 314 | - 举例: IOException 315 | 316 | - ### 在方法名处throws异常 317 | - 如果是编译时异常,必须抛出; 318 | - 如果是运行时异常,可以不抛出。 319 | 320 | 321 | * ### [返回目录](#目录) 322 | 323 | 324 | 325 | 326 | ## 自定义异常 327 | - ### throw和throws: 328 | - throws: 处理异常的一种方式,把异常抛出,由调用者来处理 329 | - 示例:`public static void main(String[] args) throws IOException` 330 | - throw: 制造异常的方式,同时结束方法 331 | - 示例:`throw new MyException("考试成绩不符合要求");` 332 | - 注意: 333 | - 如果抛出(throw)的是编译时异常,则必须在方法声明处抛出(throws) 334 | 335 | - ### 查看异常的源码学习如何自定义一个异常 336 | - 异常的父类: 337 | - 按照异常分类定义,运行时异常继承RuntimeException,编译时异常继承Exception 338 | - 关键点: 339 | - 写一个无参构造继承父类,一个带参构造(传入String类型)继承父类 340 | - eclipse可以自动生成构造: 341 | - 只选取无参和带String参两种构造即可 342 | 343 | - ### 自定义一个MyException异常,并在main方法中调用的代码示例: 344 | ```java 345 | //MyException.java 346 | 347 | public class MyException extends RuntimeException{ 348 | 349 | public MyException() { 350 | super(); 351 | // TODO Auto-generated constructor stub 352 | } 353 | 354 | public MyException(String message) { 355 | super(message); 356 | // TODO Auto-generated constructor stub 357 | } 358 | } 359 | ``` 360 | 361 | ```java 362 | //ExceptionDemo.java 363 | 364 | public class ExceptionDemo { 365 | public static void main(String[] args) { 366 | try { 367 | checkScore(110); 368 | } catch (Exception e) { 369 | // TODO Auto-generated catch block 370 | e.printStackTrace(); 371 | } 372 | } 373 | 374 | public static void checkScore(int score) { 375 | if(score>100 || score<0) { 376 | throw new MyException("考试成绩不符合要求"); 377 | } 378 | System.out.println("考试成绩符合要求"); 379 | } 380 | } 381 | ``` 382 | 383 | 384 | * ### [返回目录](#目录) 385 | 386 | 387 | 388 | 389 | ## 递归 390 | - ### 递归概述 391 | - 引入: 392 | - 把大问题拆成很多小问题,然后把小问题拆成更多的小小问题; 393 | - 当把更多小小问题解决了,小问题也解决了; 394 | - 随着小问题的解决,大问题也随之解决了。 395 | - 概述 396 | - 在方法本身不断地调用方法自己 397 | - 注意: 398 | - 递归一定要有出口,否则内存溢出; 399 | - 递归次数不宜过多,否则内存溢出。 400 | - 代码示例: 401 | ```java 402 | public void show(int n){ 403 | if(){//出口 404 | return; 405 | } 406 | show(n-1);//微调 407 | } 408 | ``` 409 | 410 | - ### 求5的阶乘 411 | - 思路: 412 | - 5! = 5 * 4! 413 | - 4! = 4 * 3! 414 | - .. 415 | - 2! = 2 * 1!; 416 | - 1! = 1; 这里是出口 417 | - 代码示例: 418 | ```java 419 | public class RecurrenceDemo { 420 | public static void main(String[] args) { 421 | int result = jC(5); 422 | System.out.println(result);//120 423 | } 424 | 425 | public static int jC(int n) { 426 | if(n == 1) {//出口 427 | return 1; 428 | }else { 429 | return n * jC(n-1); 430 | } 431 | } 432 | } 433 | ``` 434 | - 图解: 435 | ![递归求5的阶乘图解](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/method/%E9%80%92%E5%BD%92%E6%B1%825%E7%9A%84%E9%98%B6%E4%B9%98%E5%9B%BE%E8%A7%A3.bmp) 436 | 437 | - ### 用debug分析递归算法的执行流程 438 | - 以递归求5的阶乘为例 439 | - 在`int result = jC(5);`处打断点 440 | - 右键debug as执行断点调试 441 | - 可以看到一共入栈了5次jC()方法,变量列表的n值也从5到1,之后从1到5 442 | - 主函数遇到jC()点step into; 443 | - 调用函数中:if判断用step over, 遇到调用jC()时用step into 444 | - 注意: 445 | - 顺序执行用: step over 446 | - 进入调用的函数用:step into 447 | - 遇到jC()用step into,包括调用函数里的`return n * jC(n-1);`: 448 | - 这样才会显示递归多次调用产生的多个jC()函数进栈 449 | 450 | - ### 斐波那契数列 451 | - 兔子:1 1 2 3 5 8 13 .. 452 | - 规律:除了第一个月和第二个月,其余每个月都是前两个月之和。 453 | - 出口:前两个月的数量是确定的 454 | - 代码示例: 455 | ```java 456 | public class RecurrenceDemo { 457 | public static void main(String[] args) { 458 | int result = method(7); 459 | System.out.println(result);//120 460 | } 461 | 462 | public static int method(int n) { 463 | if(n == 1) {//出口 464 | return 1; 465 | }else if (n == 2){ 466 | return 1; 467 | }else { 468 | return method(n-1) + method(n-2); 469 | } 470 | } 471 | } 472 | ``` 473 | 474 | 475 | 476 | 477 | * ### [返回目录](#目录) 478 | 479 | 480 | 481 | 482 | ### END 483 | -------------------------------------------------------------------------------- /notes/01-java-base/Java网络编程.md: -------------------------------------------------------------------------------- 1 | # Java网络编程 2 | 3 | 4 | ### 目录 5 | 6 | 7 | * [网络编程概述](#网络编程概述): 计算机网络, 网络编程, Socket套接字, 网络编程三要素(IP, 端口号, 传输协议), UDP与TCP协议 8 | * [InetAddress](#inetaddress): InetAddress概述, InetAddress常用方法 (getAllByName, getByName, getHostAddress, getHostName, getLocalHost) 9 | * [UDP协议收发数据](#UDP协议收发数据): UDP收发数据的特点和步骤, DatagramSocket类, DatagramPacket类, UDP收发数据的代码示例, 注意事项 10 | * [TCP协议收发数据](#TCP协议收发数据): TCP收发数据的特点和步骤, Socket类, ServerSocket类, TCP收发数据的代码示例, TCP收发数据并返回的案例分析 11 | * [模拟用户登录](#模拟用户登录): 题目, 收发步骤, 收发代码示例, 改进(更加面向对象 + 数据库思想) 12 | 13 | 14 | 15 | 16 | ## 网络编程概述 17 | - ### 计算机网络 18 | - 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 19 | - 在网络操作系统,网络管理软件及网络通信协议的管理和协调下, 20 | - 实现资源共享和信息传递的计算机系统 21 | 22 | - ### 网络编程 23 | - 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换 24 | - 又称Socket编程或套接字编程 25 | - 网络编程的底层:IO流 26 | 27 | - ### Socket(套接字) 28 | - 用于描述IP地址和端口,是一个通信链的句柄。 29 | - 在Internet上的主机一般运行了多个服务软件,同时提供几种服务。 30 | - 每种服务都打开一个Socket,并绑定到一个端口上, 31 | - 不同的端口对应于不同的服务。 32 | - Socket: 33 | - 就是为网络编程提供的一种机制; 34 | - 通信的两端都有Socket; 35 | - 网络通信其实就是Socket间的通信; 36 | - 数据在两个Socket间通过IO传输。 37 | 38 | - ### 网络通信三要素 39 | - IP地址: InetAddress 40 | - 网络中设备的标识,不易记忆,可用主机名 41 | - 类似'192.168.1.1':点分十进制表示法 42 | - 端口号: 43 | - 用于标识进程的逻辑地址,不同进程的标识 44 | - 传输协议: 45 | - 通讯的规则 46 | - 常见协议:TCP,UDP 47 | 48 | - ### IP地址: 49 | - 要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机, 50 | - 在TCP/IP协议中,这个标识号就是IP地址 51 | - IP地址分为网络地址和主机地址: 52 | - 通过这两个地址来确保IP地址的全球唯一性 53 | - IPv4和IPv6: 54 | - IPv4: 4个字节可能不够用 55 | - IPv6: 16个字节可以用很久了 56 | - 公共地址和内网(局域网)地址 57 | - 根据安全性不同可以分为这两种 58 | - 如何获取和操作IP地址呢? 59 | - 为了方便对IP地址的获取和操作,java提供了一个 类InetAddress 供我们使用 60 | - cmd窗口查询:ipconfig 61 | - 注:mac系统不灵 62 | 63 | - ### 端口号 64 | - 物理端口: 网卡口 65 | - 逻辑端口: 我们指的就是逻辑端口 66 | - 每个网络程序都会至少有一个逻辑端口 67 | - 用于标识进程的逻辑地址,不同进程的标识 68 | - 有效端口:0~65535,其中0~1024系统使用或保留端口 69 | - 可以通过360软件可以查看端口号 70 | 71 | - ### 传输协议 72 | - UDP协议 73 | - 将数据源和目的封装成数据包中,不需要建立连接; 74 | - 每个数据报的大小在限制在64k; 75 | - 因无连接,是不可靠协议; 76 | - 不需要建立连接,速度快 77 | - TCP协议 78 | - 建立连接,形成传输数据的通道; 79 | - 在连接中进行大数据量传输; 80 | - 通过三次握手完成连接,是可靠协议; 81 | - 必须建立连接,效率会稍低 82 | - 三次握手: 83 | - A-B:A给B发送数据 84 | - B-A:B收到A发送的数据,再给A发送一条数据 85 | - A-B:A收到B发送的数据后,再给B发送一条自己收到了的数据 86 | 87 | - ### UDP与TCP协议 88 | - UDP协议: 89 | - DatagramSocket与DatagramPacket 90 | - 建立发送端,接收端。 91 | - 建立数据包。 92 | - 调用Socket的发送接收方法。 93 | - 关闭Socket。 94 | - 发送端与接收端是两个独立的运行程序。 95 | - TCP协议: 96 | - Socket和ServerSocket 97 | - 建立客户端和服务器端 98 | - 建立连接后,通过Socket中的IO流进行数据的传输 99 | - 关闭socket 100 | - 同样,客户端与服务器端是两个独立的应用程序 101 | - 注: 102 | - TCP协议中的数据传输管道:指IO流 103 | 104 | 105 | * ### [返回目录](#目录) 106 | 107 | 108 | 109 | 110 | ## InetAddress 111 | - ### InetAddress概述 112 | - 此类表示互联网协议 (IP) 地址。 113 | - IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的 114 | - "32 位或 128 位" 分别对应IPv4和IPv6 115 | - java.net包下 116 | - 子类:Inet4Address, Inet6Address 117 | - 无构造方法:静态调用或子类实现 118 | 119 | - ### InetAddress常用方法 120 | - `static InetAddress[] getAllByName(String host)`: 121 | - 静态,类名调用 122 | - 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 123 | - 返回数组:是因为主机名不唯一,可能返回多个IP地址 124 | - `static InetAddress getByName(String host)`: 125 | - 静态,类名调用 126 | - throws UnknownHostException 127 | - 在给定主机名的情况下确定主机的 IP 地址。 128 | - 即传入主机名,返回主机名和IP地址 129 | - 注:此方法,如果传入的是IP地址,则获取到的是IP地址 130 | - 代码示例: 131 | ```java 132 | import java.net.InetAddress; 133 | import java.net.UnknownHostException; 134 | 135 | public class InetAddressDemo { 136 | public static void main(String[] args) throws UnknownHostException { 137 | //分别传入主机名和IP地址 138 | InetAddress address = InetAddress.getByName("Mac_liuxuan"); 139 | System.out.println(address);//Mac_liuxuan/192.168.0.106 140 | 141 | InetAddress address2 = InetAddress.getByName("192.168.0.106"); 142 | System.out.println(address2);//192.168.0.106 143 | } 144 | } 145 | ``` 146 | - `String getHostAddress()` 147 | - 非静态,对象调用 148 | - 返回 IP 地址字符串(以文本表现形式) 149 | - 代码示例:getByName传入的参数不同,获取到的结果都是IP地址 150 | - getByName(主机名)或getByName(IP地址):getHostAddress()获取到的都是IP地址 151 | ```java 152 | InetAddress address = InetAddress.getByName("Mac_liuxuan"); 153 | String hostAddress = address.getHostAddress();//192.168.0.106` 154 | ``` 155 | 156 | ```java 157 | InetAddress address2 = InetAddress.getByName("192.168.0.106"); 158 | String hostAddress = address2.getHostAddress();//192.168.0.106 159 | ``` 160 | - `String getHostName()`: 161 | - 非静态,对象调用 162 | - 获取此 IP 地址的主机名 163 | - 代码示例:getByName传入的参数不同,获取到的结果不同 164 | - getByName(主机名):getHostName()获取主机名 165 | - getByName(IP地址):getHostName()仍然获取IP地址 166 | ```java 167 | InetAddress address = InetAddress.getByName("Mac_liuxuan"); 168 | String hostName = address.getHostName();//Mac_liuxuan 169 | ``` 170 | 171 | ```java 172 | InetAddress address2 = InetAddress.getByName("192.168.0.106"); 173 | String hostName = address2.getHostName();//192.168.0.106 174 | ``` 175 | - `static InetAddress getLocalHost()`: 176 | - 静态,类名调用 177 | - 返回本地主机的 IP 地址。 178 | - 示例: 179 | - `InetAddress adds = InetAddress.getLocalHost(); System.out.println(adds);//Mac_liuxuan/192.168.0.106` 180 | - 与`static InetAddress getByName(String host)`的区别: 181 | - getByName: 可以返回其他的IP地址,比如别的主机的IP地址 182 | - getLocalHost: 只能获取本机的IP地址 183 | 184 | 185 | * ### [返回目录](#目录) 186 | 187 | 188 | 189 | 190 | ## UDP协议收发数据 191 | - ### UDP协议收发数据分析 192 | - 回顾UDP协议收发数据的特点: 193 | - 打包发送数据:将数据和地址、长度、端口都打包到一起 194 | - 不建立连接,只管发送,不管是否收到 195 | - 每个数据包有大小限制:64k 196 | - UDP协议发送数据的步骤 197 | - 创建发送端的Socket对象 198 | - 创建数据并打包 199 | - 发送数据 200 | - 释放资源 201 | - UDP协议接收数据的步骤 202 | - 创建接收端的Socket对象 203 | - 接收数据 204 | - 解析数据 205 | - 输出数据 206 | - 释放资源 207 | 208 | - ### 注:datagram 209 | - 数据报的意思 210 | 211 | - ### DatagramSocket类 212 | - 此类表示用来发送和接收数据报包的套接字。 213 | - 在 DatagramSocket 上总是启用 UDP 广播发送. 即基于UDP协议 214 | - 构造方法: 215 | - `DatagramSocket()`: 216 | - 构造数据报套接字并将其绑定到本地主机上任何可用的端口。随机分配端口 217 | - 发送端可用 218 | - `DatagramSocket(int port)`: 219 | - 创建数据报套接字并将其绑定到本地主机上的指定端口。 220 | - 接收端可用 221 | - `new DatagramSocket();`: 会抛出异常SocketException, 其父类是IOException 222 | 223 | - ### DatagramPacket类 224 | - 由DatagramSocket对象调用的send方法查看源码得知,send传入的是DatagramPacket对象 225 | - 此类表示数据报包。数据报包用来实现无连接包投递服务 226 | - 构造方法: 227 | - `DatagramPacket(byte[] buf, int length, InetAddress address, int port)`: 228 | - 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 229 | - 可用于发送端打包 230 | - 具备UDP收发数据的数据包需要的各种参数:数据,长度,IP,端口... 231 | - 数据:`byte[] buf` 232 | - 设备的地址:IP 233 | - 进程的地址:端口号 234 | - `DatagramPacket(byte[] buf, int length)` 235 | - 简单的构造方法,可用于接收端接收数据 236 | - 解析接收到的数据: 237 | - 可用以下几个getXxx()方法 238 | - `InetAddress getAddress()`: 239 | - 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 240 | - 获取发送端的IP地址 241 | - `byte[] getData()`: 242 | - 返回数据缓冲区,即用字节数组接收发送来的数据 243 | - 也可以直接使用创建包对象时的数组 244 | - `int getLength()`: 245 | - 返回将要发送或接收到的数据的长度 246 | - 获取具体收到的字节的个数 247 | 248 | - ### UDP收发数据的代码示例 249 | - 发送端 250 | ```java 251 | //SendDemo.java 252 | import java.io.IOException; 253 | import java.net.DatagramPacket; 254 | import java.net.DatagramSocket; 255 | import java.net.InetAddress; 256 | import java.net.SocketException; 257 | 258 | public class SendDemo { 259 | public static void main(String[] args) throws SocketException, IOException { 260 | //创建发送端Socket对象 261 | DatagramSocket ds = new DatagramSocket(); 262 | 263 | //创建数据并打包 264 | //DatagramPacket(byte[] buf, int length, InetAddress address, int port) 265 | String s = "Hello UDP, im coming!"; 266 | byte[] bys = s.getBytes(); 267 | int length = bys.length; 268 | InetAddress address = InetAddress.getByName("Mac_liuxuan"); 269 | int port = 8888;//接收端是什么就是哪个端口号 270 | //打包 271 | DatagramPacket dp = new DatagramPacket(bys,length,address,port); 272 | 273 | //发送数据 274 | ds.send(dp); 275 | 276 | //释放资源 277 | ds.close(); 278 | } 279 | } 280 | ``` 281 | - 接收端 282 | ```java 283 | import java.io.IOException; 284 | import java.net.DatagramPacket; 285 | import java.net.DatagramSocket; 286 | import java.net.InetAddress; 287 | 288 | public class ReceiveDemo { 289 | public static void main(String[] args) throws IOException { 290 | //创建接收端Socket对象 291 | DatagramSocket ds = new DatagramSocket(8888); 292 | 293 | //接收数据 294 | byte[] bys = new byte[1024]; 295 | DatagramPacket dp = new DatagramPacket(bys,bys.length); 296 | 297 | System.out.println("阻塞前"); 298 | ds.receive(dp);//阻塞中 299 | System.out.println("阻塞后"); 300 | 301 | //解析数据 302 | InetAddress address = dp.getAddress();//获取IP地址 303 | byte[] data = dp.getData();//获取数据 304 | int length = dp.getLength();//获取发送或接收到的数据的长度 305 | 306 | //输出数据 307 | System.out.println("sender:"+address.getHostAddress()); 308 | System.out.println(new String(data,0,length));//加length防止输出上面字节数组的1024个元素,即后面的空字符(直接复制会有) 309 | System.out.println(new String(bys,0,length)); //或者直接输出接收数据的字节数组也可 310 | /* 阻塞前 311 | 阻塞后 312 | sender:192.168.0.106 313 | Hello UDP, im coming! 314 | */ 315 | 316 | //释放资源 317 | ds.close(); 318 | } 319 | } 320 | ``` 321 | - 注意: 322 | - 需要先启动接收端,再启动发送端 323 | - 接收端卡在此条语句:`ds.receive(dp);//阻塞中` -- 阻塞 324 | - 接收端开始运行后,程序会在receive()方法这里有一个阻塞,即等待 325 | - 注意控制台:多条程序会有多个控制台 326 | - 接收数据的结果在ReceiveDemo.java的控制台可以看到 327 | 328 | - ### UDP收发数据的注意事项 329 | - 端口号错误:不报错,但是数据收不到 330 | - 对比主机名异常:会报错抛异常`java.net.UnknownHostException` 331 | - 接收端程序在运行的过程中,再次启动接收端程序,则抛异常: 332 | - `java.net.BindException: Address already in use (Bind failed)` 333 | - 该端口已经在使用中了,再次运行,已占用,绑定失败,抛异常 334 | - 端口号:标记线程,不能重复,否则就不知道指的是哪条进程了 335 | - 同理,需要注意常见程序已占用的端口号,否则同样会抛上述异常 336 | 337 | 338 | * ### [返回目录](#目录) 339 | 340 | 341 | 342 | 343 | ## TCP协议收发数据 344 | - ### TCP协议收发数据分析 345 | - 回顾TCP协议收发数据的特点: 346 | - 必须建立连接,形成传输数据的通道; 347 | - 在连接中进行大数据量传输: 没有大小限制了 348 | - 通过三次握手完成连接 349 | - TCP协议发送数据的步骤(客户端) 350 | - 创建发送端Socket对象(创建连接) 351 | - 获取输出流对象 352 | - 发送数据 353 | - 释放资源 354 | - TCP协议接收数据的步骤(服务端) 355 | - 创建接收端Socket对象(ServerSocket类) 356 | - 监听(阻塞):等着客户端过来 357 | - 获取输入流对象 358 | - 获取数据 359 | - 输出数据 360 | - 释放资源 361 | 362 | - ### Socket类 363 | - java.net.Socket包下 364 | - 此类实现客户端套接字(也可以就叫“套接字”)。 365 | - 套接字是两台机器间通信的端点。 366 | - 构造方法:`Socket(InetAddress address, int port)` 367 | - 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 368 | - 是所需的构造方法和参数 369 | 370 | - ### ServerSocket类 371 | - java.net.ServerSocket包 372 | - 此类实现服务器套接字,可用于TCP接收端 373 | - 服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。 374 | - 构造方法:`ServerSocket(int port)` 375 | - 创建绑定到特定端口的服务器套接字。 376 | - 这个有参构造适用于TCP接收端 377 | - `Socket accept()`: 378 | - 侦听并接受到此套接字的连接。 379 | - 由于需要操作输入流输出流,而ServerSocket并没有相关的方法,因此需要先获取到Socket 380 | 381 | - ### TCP协议收发数据代码 382 | - 发送端/客户端 383 | ```java 384 | //ClientDemo.java 385 | import java.io.IOException; 386 | import java.io.OutputStream; 387 | import java.net.InetAddress; 388 | import java.net.Socket; 389 | 390 | public class ClientDemo { 391 | public static void main(String[] args) throws IOException{ 392 | //发送数据 393 | //创建发送端Socket对象(创建连接) 394 | Socket s = new Socket(InetAddress.getByName("Mac_liuxuan"),9999); 395 | //获取输出流对象: 需要一个可以传送任意类型数据的IO流 396 | OutputStream os = s.getOutputStream(); 397 | //发送数据 398 | String str = "hello TCP, im coming"; 399 | os.write(str.getBytes()); 400 | //释放资源 401 | os.close();//这条不关也可,s.close()会帮助做这条 402 | s.close(); 403 | 404 | //没有连接到接收端时报错: 405 | //java.net.ConnectException: Connection refused 406 | } 407 | } 408 | ``` 409 | - 接收端/服务端 410 | ```java 411 | //ServerDemo.java 412 | import java.io.IOException; 413 | import java.io.InputStream; 414 | import java.net.InetAddress; 415 | import java.net.ServerSocket; 416 | import java.net.Socket; 417 | 418 | public class ServerDemo { 419 | public static void main(String[] args) throws IOException { 420 | //接收数据 421 | //创建接收端Socket对象(等待连接) 422 | ServerSocket ss = new ServerSocket(9999); 423 | //监听(阻塞) 424 | Socket s = ss.accept(); 425 | //获取输入流对象 426 | InputStream is = s.getInputStream(); 427 | //获取数据 428 | byte[] bys = new byte[1024]; 429 | int len;//用于存储读到的字节个数 430 | len = is.read(bys); 431 | //输出数据 432 | InetAddress address = s.getInetAddress(); 433 | System.out.println("client:" + address.getHostName());//192.168.0.106 - 似乎应该返回主机名但仍是IP地址 434 | System.out.println(new String(bys,0,len));//hello TCP, im coming 435 | //释放资源 436 | s.close(); 437 | ss.close();//服务端可以不关 438 | } 439 | } 440 | ``` 441 | 442 | - ### TCP收发数据并返回的案例分析 443 | - 题目: 444 | - 使用TCP协议发送数据,并将接收的数据转换成大写返回 445 | - 步骤: 446 | - 客户端发出数据; 447 | - 服务端接收数据; 448 | - 服务端转换数据; 449 | - 服务端发出数据; 450 | - 客户端接收数据 451 | - 注意: 452 | - 客户端和服务端交换功能以后,步骤仍是相似的 453 | - 代码运行之后: 454 | - 客户端(发送端)的控制台也会输出一条接收到的数据 455 | - 代码示例: 456 | - 发送端/客户端代码: 457 | ```java 458 | //ClientDemo.java 459 | import java.io.IOException; 460 | import java.io.InputStream; 461 | import java.io.OutputStream; 462 | import java.net.InetAddress; 463 | import java.net.Socket; 464 | 465 | public class ClientDemo { 466 | public static void main(String[] args) throws IOException{ 467 | //创建发送端Socket对象 468 | Socket s = new Socket(InetAddress.getByName("Mac_liuxuan"),9999); 469 | //获取输出流对象 470 | OutputStream os = s.getOutputStream(); 471 | //发送数据 472 | os.write("tcp, im coming again!!".getBytes()); 473 | 474 | //接收返回的大写数据: 与接收端接收数据的步骤相同 475 | //获取输入流对象 476 | InputStream is = s.getInputStream(); 477 | byte[] bys = new byte[1024];//接收数据 478 | int len;//存储读取到的字节个数 479 | //获取数据 480 | len = is.read(bys); 481 | 482 | //输出数据 483 | System.out.println(new String(bys,0,len));//TCP, IM COMING AGAIN!! 484 | 485 | //释放资源 486 | s.close(); 487 | } 488 | } 489 | ``` 490 | - 接收端/服务端代码: 491 | ```java 492 | //ServerDemo.java 493 | import java.io.IOException; 494 | import java.io.InputStream; 495 | import java.io.OutputStream; 496 | import java.net.ServerSocket; 497 | import java.net.Socket; 498 | 499 | public class ServerDemo { 500 | public static void main(String[] args) throws IOException { 501 | //创建接收端Socket对象 502 | ServerSocket ss = new ServerSocket(9999); 503 | //监听 504 | Socket s = ss.accept(); 505 | //获取输入流对象 506 | InputStream is = s.getInputStream(); 507 | //获取数据 508 | byte[] bys = new byte[1024]; 509 | int len; 510 | len = is.read(bys); 511 | String str = new String(bys,0,len); 512 | //输出数据 513 | System.out.println(str);//tcp, im coming again!! 514 | 515 | //转换数据 516 | String upperStr = str.toUpperCase();//s中的内容转换为大写 517 | 518 | //获取输出流对象:传输数据是通过IO流 519 | OutputStream os = s.getOutputStream(); 520 | //返回数据(即发出数据) 521 | os.write(upperStr.getBytes()); 522 | 523 | //释放资源 524 | s.close(); 525 | ss.close();//服务端一般不关闭 526 | } 527 | } 528 | ``` 529 | 530 | 531 | * ### [返回目录](#目录) 532 | 533 | 534 | 535 | 536 | ## 模拟用户登录 537 | - ### 题目: 538 | - 模拟用户登录 539 | 540 | - ### 收发的步骤 541 | - 客户端/发送端的步骤: 542 | - 创建客户端Socket对象 543 | - 获取用户名和密码 544 | - 写出数据 545 | - 获取输入流对象 546 | - 获取服务器返回的数据 547 | - 释放资源 548 | - 服务端/接收端的步骤: 549 | - 创建服务器端Socket对象 550 | - 监听 551 | - 获取输入流对象 552 | - 获取用户名和密码 553 | - 判断用户名和密码是否正确 554 | - 返回判断信息 555 | - 释放资源 556 | 557 | - ### 收发代码示例: 558 | - 客户端/发送端代码: 559 | ```java 560 | //ClientTest.java 561 | import java.io.BufferedReader; 562 | import java.io.IOException; 563 | import java.io.InputStreamReader; 564 | import java.io.PrintWriter; 565 | import java.net.Socket; 566 | 567 | public class ClientTest { 568 | public static void main(String[] args) throws IOException{ 569 | //创面客户端Socket对象 570 | //Socket s = new Socket(InetAddress(),8888); 571 | Socket s = new Socket("Mac_liuxuan",8888);//查看底层代码可知,直接传入主机名也可,会自动传入上一行代码所示InetAddress()中 572 | 573 | //获取用户名和密码:使用输入流 574 | BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//标准格式,可以记下来直接用 575 | System.out.println("请输入用户名:"); 576 | String username = br.readLine(); 577 | System.out.println("请输入密码:"); 578 | String password = br.readLine(); 579 | 580 | //获取输出流对象 581 | //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 582 | //嫌麻烦的话,下述打印流可以直接打印数据,且可以换行 583 | PrintWriter out = new PrintWriter(s.getOutputStream(),true);//参数true表示自动换行 584 | //写出数据 585 | out.println(username); 586 | out.println(password); 587 | 588 | //获取输入流对象 589 | BufferedReader serverBr = new BufferedReader(new InputStreamReader(s.getInputStream())); 590 | //获取服务器返回的数据 591 | String result = serverBr.readLine(); 592 | System.out.println(result); 593 | //释放资源 594 | s.close(); 595 | /* 596 | 请输入用户名: 597 | admin 598 | 请输入密码: 599 | 123456 600 | 登录失败 601 | 602 | 请输入用户名: 603 | itheima 604 | 请输入密码: 605 | 123456 606 | 登录成功 607 | * */ 608 | } 609 | } 610 | ``` 611 | - 服务端/接收端代码: 612 | ```java 613 | //ServerTest.java 614 | import java.io.BufferedReader; 615 | import java.io.IOException; 616 | import java.io.InputStreamReader; 617 | import java.io.PrintWriter; 618 | import java.net.ServerSocket; 619 | import java.net.Socket; 620 | 621 | public class ServerTest { 622 | public static void main(String[] args) throws IOException { 623 | //创建服务器端Socket对象 624 | ServerSocket ss = new ServerSocket(8888); 625 | //监听 626 | Socket s = ss.accept(); 627 | //获取输入流对象 628 | BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 629 | //获取用户名和密码 630 | String username = br.readLine(); 631 | String password = br.readLine(); 632 | //判断用户名和密码是否正确 633 | boolean flag = false; 634 | if("itheima".equals(username) && "123456".equals(password)) { 635 | flag = true; 636 | } 637 | //获取输出流对象 638 | PrintWriter out = new PrintWriter(s.getOutputStream(),true); 639 | 640 | //返回判断信息 641 | if(flag) { 642 | out.println("登录成功"); 643 | }else { 644 | out.println("登录失败"); 645 | } 646 | 647 | //释放资源 648 | s.close(); 649 | //ss.close();//服务器端不关闭,你不用别人可能还要用 650 | } 651 | } 652 | ``` 653 | 654 | - ### 改进 655 | - 上述代码中,对正确的用户名和密码进行了写死,不符合实际需求。 656 | - 改进: 657 | - 加入数据库思想,另建User类和UserDB类,放入若干用户名和密码 658 | - User类: 659 | ```java 660 | public class User { 661 | private String username;//用户名 662 | private String password;//密码 663 | public User() { 664 | super(); 665 | // TODO Auto-generated constructor stub 666 | } 667 | public User(String username, String password) { 668 | super(); 669 | this.username = username; 670 | this.password = password; 671 | } 672 | public String getUsername() { 673 | return username; 674 | } 675 | public void setUsername(String username) { 676 | this.username = username; 677 | } 678 | public String getPassword() { 679 | return password; 680 | } 681 | public void setPassword(String password) { 682 | this.password = password; 683 | } 684 | 685 | @Override 686 | public boolean equals(Object obj) { 687 | if (this == obj) 688 | return true; 689 | if (obj == null) 690 | return false; 691 | if (getClass() != obj.getClass()) 692 | return false; 693 | User other = (User) obj; 694 | if (password == null) { 695 | if (other.password != null) 696 | return false; 697 | } else if (!password.equals(other.password)) 698 | return false; 699 | if (username == null) { 700 | if (other.username != null) 701 | return false; 702 | } else if (!username.equals(other.username)) 703 | return false; 704 | return true; 705 | } 706 | } 707 | ``` 708 | - UserDB类: 709 | ```java 710 | import java.util.ArrayList; 711 | import java.util.List; 712 | 713 | public class UserDB { 714 | private static List users = new ArrayList();//因为要用下面的静态代码块初始化,这里也定义为static 715 | 716 | static {//在类加载时初始化 717 | users.add(new User("zhangsan","123456")); 718 | users.add(new User("lisi","888888")); 719 | users.add(new User("itheima","123456")); 720 | users.add(new User("admin","password")); 721 | 722 | } 723 | 724 | public static List getUsers(){ 725 | return users; 726 | } 727 | } 728 | ``` 729 | - ServerSocket改进代码: 730 | ```java 731 | /* 732 | if("itheima".equals(username) && "123456".equals(password)) {//写死的用户名和密码 733 | flag = true; 734 | }*/ 735 | 736 | //改进代码: 737 | List users = UserDB.getUsers(); 738 | User user = new User(username, password); 739 | if(users.contains(user)) {//查看contains方法的实现源码发现涉及equals,需要重写此equals()方法 740 | //ctrl+contains -- implement -- ArrayList -- .. 741 | //匹配成功 742 | flag = true; 743 | } 744 | ``` 745 | 746 | 747 | * ### [返回目录](#目录) 748 | 749 | 750 | 751 | 752 | ### END 753 | -------------------------------------------------------------------------------- /notes/01-java-base/eclipse的基本使用.md: -------------------------------------------------------------------------------- 1 | # eclipse的基本使用 2 | 3 | 4 | ## 目录: 5 | 6 | * [eclipse的概述](#eclipse的概述) 7 | * [图文参考链接](#图文参考链接) 8 | * [基本使用](#基本使用) 9 | * [基本配置](#基本配置) 10 | * [快捷键](#快捷键) 11 | * [删除和导入项目](#删除和导入项目) 12 | * [自动生成代码](#自动生成代码) 13 | * [已创建类的重命名](#已创建类的重命名) 14 | * [键盘录入](#键盘录入) 15 | * [输出语句](#输出语句) 16 | * [随机数](#随机数) 17 | * [断点调试](#断点调试) 18 | 19 | 20 | 21 | 22 | ## eclipse的概述 23 | - 是一个集成开发环境 IDE (integrated development environment) 24 | - 集成了代码的编写功能,分析功能,编译功能,调试功能等一体化的开发软件。 25 | - 特点:免费,纯Java语言编写,免安装(解压使用),扩展性强(可以添加各种功能的插件) 26 | - 下载和安装:http://eclipse.org/ ; 绿色版,解压就可以使用。 27 | - 使用: 28 | - exe启动 - workspace选择 - 新建project项目(项目配置) - 新建package包(注意命名唯一性) - 包新建class类(类配置) - 写代码(实时编译,只需手动运行即可) - 运行 (run as: java application) - 下方控制台显示结果 29 | - 详见下方第一个图文参考博文 30 | 31 | 32 | * ### [返回目录](#目录) 33 | 34 | 35 | 36 | 37 | ## 图文参考链接 38 | - [【JAVA】eclipse-使用入门及常用快捷键](https://www.cnblogs.com/anliux/p/11525981.html) 39 | - [【学习总结】Eclipse常用快捷键](https://www.cnblogs.com/anliux/p/11436568.html) 40 | 41 | 42 | * ### [返回目录](#目录) 43 | 44 | 45 | 46 | 47 | ## 基本使用 48 | A:创建Java项目: 49 | 点击File或者在最左侧空白处,选择Java项目,在界面中写一个项目名称,然后Finish即可。 50 | B:创建包:展开项目,在**源包src下**建立一个包com.itheima 51 | C:创建类:在com.ithiema包下建立一个类HelloWorld 52 | 在界面中写一个类名:HelloWorld,然后finish即可。 53 | D:编写代码 54 | 在HelloWorld类写main方法,在main方法中写一条输出语句:我是黑马程序员,我骄傲,我自豪。 55 | E:编译 56 | 自动编译,在保存的那一刻帮你做好了 57 | F:运行 58 | 选择要运行的文件或者在要运行的文件内容中 59 | 右键 -- Run as - Java Application即可 60 | 61 | 62 | * ### [返回目录](#目录) 63 | 64 | 65 | 66 | 67 | ## 基本配置 68 | A:行号的显示和隐藏 69 | 显示:在代码区域的最左边的空白区域,右键 -- Show Line Numbers即可。 70 | 隐藏:把上面的动作再做一次。 71 | 72 | B:字体大小及颜色 73 | a:Java代码区域的字体大小和颜色: 74 | window -- Preferences -- General -- Appearance -- Colors And Fonts -- Java -- Java Edit Text Font 75 | b:控制台 76 | window -- Preferences -- General -- Appearance -- Colors And Fonts -- Debug -- Console font 77 | c:其他文件 78 | window -- Preferences -- General -- Appearance -- Colors And Fonts -- Basic -- Text Font 79 | - mac里的字体编辑:(相似,大致一样,有一些不同) 80 | Eclipse(上方第一个) -- Preferences -- Genaral -- Appearance -- Colors and Fonts -- Basic -- Text Font -- edit或双击进行选择 -- ... 81 | 82 | C:窗体给弄乱了,怎么办? 83 | window -- Perspective -- Reset Perspective 84 | 85 | D:控制台找不到了,怎么办? 86 | Window--Show View—Console 87 | 88 | 89 | * ### [返回目录](#目录) 90 | 91 | 92 | 93 | 94 | ## 快捷键 95 | 96 | 内容辅助键 alt+/ (Mac: option+/ 效果同) 97 | main 然后alt+/ 98 | syso 然后alt+/ 99 | 100 | 提供解决方案 ctrl+1(数字1) 101 | 对小红叉提供解决方案:导包;异常处理;光标定位变量并重命名。 102 | 大红叉是语法错误,必须修改代码。 103 | 104 | 快捷键 105 | 注释 106 | 单行 选中内容,ctrl+/ (Mac: command+/), 再来一次取消 107 | 多行 选中内容,ctrl+shift+/ (Mac: Shift+command+/), 取消 ctrl+shift+\ 108 | - Mac多行快捷键不灵,设置以后仍然是没反应,还取消了系统原来的help,先这样吧。。 109 | - [mac下设置多行注释快捷键](https://www.cnblogs.com/maijunjin/archive/2013/04/24/3039463.html) 110 | 格式化 ctrl+shift+f 或者 右键 -- source -- format 111 | 导包 ctrl+shift+o 112 | 113 | 光标 shift+enter 将光标切换至下一行起始处。 114 | 复制 ctrl+alt+向上箭头 光标处代码向上复制 115 | ctrl+alt+向下箭头 光标处代码向下复制 116 | 移动 ctrl+向上/向下箭头 光标处的代码向上或向下移动 117 | 删除 ctrl+d 删除选中行 118 | 注:单行光标定位,多行选中,可不全选 119 | 120 | 大小写 ctrl+shift+x 选中部分全部大写 121 | ctrl+shift+y 选中部分全部小写 122 | 123 | source alt+shift+s 调出source快捷菜单 124 | 看源码 光标定位+ctrl+双击 打开定位处的源码 125 | 代码结构查看和检索 ctrl/command + O: 展示代码结构(类、变量、方法等),搜索输入可以查找 126 | 任意代码内搜索源码 ctrl+shift+T: 搜索关键词打开源码 127 | 128 | 快速抽取函数 win: alt+shift+M / Mac: option+command+M 129 | 130 | 打印 选中+alt+/:可选自动把选中部分放入输出语句中 131 | 即,可以通过生成的菜单选中sysout将选中语句放入输出语句 132 | tab tab或者shift+tab 选中代码整体后移或者前移 133 | 134 | 135 | * ### [返回目录](#目录) 136 | 137 | 138 | 139 | 140 | ## 删除和导入项目 141 | A:删除项目 142 | 选中项目 – 右键 – 删除 143 | 从项目区域中删除 144 | 从硬盘上删除 145 | B:导入项目 146 | 在项目区域右键找到import 147 | 找到General,展开,并找到 148 | Existing Projects into Workspace 149 | 点击next,然后选择你要导入的项目 150 | 注意:这里选择的是项目名称 151 | 152 | 153 | * ### [返回目录](#目录) 154 | 155 | 156 | 157 | 158 | ## 自动生成代码 159 | A:自动生成构造方法: 160 | 代码区域右键 -- Source -- Generate Constructors from Superclass.. : 无参构造函数 161 | 代码区域右键 -- Source -- Generate Constructors using Fields...: 带参构造函数 162 | B:自动生成get、set方法: 163 | 代码区域右键 -- Source -- Generate Getters and Setters.. -- select all 164 | C:自动重写toString 和 equals方法: 165 | 代码区域右键 -- Source -- Generate toString -- 选择变量 -- 自动生成重写的toString方法 166 | 代码区域右键 -- Source -- Generate HashCode() and equals() -- 选择变量 -- 自动生成重写的两个方法 167 | D: 生成try-catch代码: 168 | 选中语句 -- 右键 -- surroundwith - try/catch block: 自动填充`e.printStackTrace();`,可以手动修改catch传入的异常类型 169 | 170 | 171 | * ### [返回目录](#目录) 172 | 173 | 174 | 175 | 176 | ## 已创建类的重命名 177 | - 1.首先要进行选中java类名称,然后进行右键 178 | - 2.弹出了下拉菜单中,进行选择为refactor的选项。 179 | - 3.弹出了下一个菜单中进行选择为rename的选项。 180 | - 4.弹出了一个提示,那么就可以对类名进行重新修改。 181 | - 5.修改完成之后,然后进行按键盘中的enter的键 182 | 183 | 184 | * ### [返回目录](#目录) 185 | 186 | 187 | 188 | 189 | ## 键盘录入 190 | - ### 使用步骤: 191 | - 导包:手动`import java.util.Scanner;` 快捷键:`ctrl+shift+o` 192 | - 位置放到class定义的上面:`package>import>class` 193 | - 创建对象: `Scanner sc = new Scanner(System.in);` 194 | - 接收int数据: `int x = sc.nextInt(); //对象调用方法` 195 | - 接受String数据:`String s = sc.nextLine(); //获取键盘录入的字符串数据` 196 | 197 | - ### 参考链接: 198 | - [github: OJ输入输出总结](https://github.com/anliux/PracticePool/blob/master/base/docs/io.md) 199 | 200 | 201 | * ### [返回目录](#目录) 202 | 203 | 204 | 205 | 206 | ## 输出语句 207 | - println():ln是换行。 208 | - 可以在println()的括号中添加分隔符:比如制表符`\t` 209 | 210 | 211 | * ### [返回目录](#目录) 212 | 213 | 214 | 215 | 216 | ## 随机数 217 | - ### 作用: 218 | - 用于产生一个随机数 219 | 220 | - ### 使用步骤(和Scanner类似) 221 | - 导包:`import java.util.Random;` 222 | - 创建对象:`Random r = new Random();` 223 | - 获取随机数:`int number = r.nextInt(10);` 224 | - 产生的数据在0到10之间,包括0,不包括10。(惯例左闭右开) 225 | - 括号里面的参数n:产生0-n的左闭右开区间内的数据。 226 | 227 | - ### 示例: 228 | - 产生1-100的随机数: 229 | - Random(): 产生是的0到n-1的数,则1-100 可以在原来基础上+1 230 | - `int i = r.nextInt(100)+1;` 231 | - 猜数字小游戏:系统产生一个1-100的随机数,猜出这个数: 232 | ``` 233 | package test.demo; 234 | import java.util.Random; 235 | import java.util.Scanner; 236 | public class RandomDeom { 237 | public static void main(String[] args) { 238 | Random r = new Random(); 239 | int i = r.nextInt(100)+1; 240 | while(true) { 241 | System.out.println("输入要猜的数:"); 242 | Scanner sc = new Scanner(System.in); 243 | int guessNum = sc.nextInt(); 244 | if(guessNum > i) { 245 | System.out.println("输入的数"+guessNum+"太大了"); 246 | }else if(guessNum < i) { 247 | System.out.println("输入的数"+guessNum+"太小了"); 248 | }else { 249 | System.out.println("猜对啦!"); 250 | break; 251 | } 252 | } 253 | } 254 | 255 | } 256 | 257 | ``` 258 | 259 | 260 | * ### [返回目录](#目录) 261 | 262 | 263 | 264 | 265 | ## 断点调试 266 | - ### 断点: 267 | - 一个标记 268 | 269 | - ### 作用: 270 | - 查看程序的执行流程; 271 | - 调试程序。 272 | 273 | - ### 加断点 274 | - 哪里加:想看哪个语句的执行结果就在该语句前面加(哪里不会加哪里)。 275 | - 如何加:代码区域左边的空白位置 双击即可。 276 | 277 | - ### 运行加断点的程序 278 | - 代码区域右键 -- Debug as -- Java Application 279 | - 显示一个页面,提示是否进入调试页面? 是否记住当前操作?是(Yes)是(勾选复选框) 280 | 281 | - ### debug执行: 282 | - 位置:上方工具栏 -- 黄色半圆环向下箭头为step over键 283 | - step over (F6):按照代码流程执行 284 | - 法一:点击 工具栏中的Step Over (执行下一行) 285 | - 法二:快捷键F6 看到每一步程序的执行过程 286 | - 下同有此两种方法。 287 | - step into (F5):进入本行代码调用的方法中 288 | - 可以用于当有调用方法,但是被调用方法没有设置断点的情况。 289 | - step return (F7):从被调用函数返回调用被方法的代码行。 290 | - 可以用于从被调用函数返回调用该方法的代码行 291 | - 注:仍然顺序执行被调用方法中的代码行直到结束,没结束前作用等同于step over,但高亮代码有区别,不会像step over一样跳到当前语句。 292 | - 只有在有调用方法的debug中才有可用,若没有,则是灰的。 293 | 294 | - ### 重点关注区域: 295 | - 看代码区域:对照看程序执行步骤; 296 | - 看Debug区域:对照看程序执行步骤; 297 | - 看varable区域:观察变量的创建、赋值、销毁; 298 | - 引用型变量的值后面会有一个(id=xx),可以看作对象地址值。 299 | - 看console区域:看程序的输入输出。 300 | 301 | - ### 断点调试运行界面: 302 | - ![断点调试运行界面](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/debug/%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E8%BF%90%E8%A1%8C%E7%95%8C%E9%9D%A2.bmp) 303 | 304 | - ### debug停止 305 | - debug完毕后,需要保证本次debug停止,即左上方菜单栏的红色停止按钮为灰; 306 | - 自动停止:一直"step over"直到程序最后一个花括号结束,会自动停止,并自动删去thread线程和对应的变量值; 307 | - 手动停止:按左上方菜单栏的红色停止按钮。 308 | - 注意:如果不停止,会在java代码界面的行号位置出现蓝色debug箭头并显示`Debug Current Instruction Pointer`,影响之后的debug。 309 | - debug停止之后,记得删除断点。 310 | 311 | - ### 消除断点: 312 | - 法一:把设置断点的方式再执行一遍; 313 | - 法二:切换到Debug视图,选择 Breakpoints -- Remove All Breakpoints 就是2个XX的图标 314 | - 注:如果上面最小化了,这里重新打开debug视图 315 | 316 | - ### 注意: 317 | - 断点必须加在有效的语句上。 318 | - 例如:如果在注释行加断点,则会自动加在注释下的第一个有效语句行。 319 | 320 | - ### debug示例: 321 | - for循环执行流程: 322 | - 加断点:在程序开始处双击加断点 323 | - 观察变量:step over观察变量变化,for循环中不再使用的临时变量在退出循环后就消失了,以示使用完毕。 324 | - 完毕后去掉断点:在breadpoint窗口点双叉,或者在程序加断点处双击 325 | - 注意:循环断点的变量会变色,高亮以示上面的变量值又有变化。 326 | - 方法调用debug注意点: 327 | - 想看被调用方法的执行流程,则被调用方法也需要加断点 328 | - 按顺序自动进入所调用的方法中,且在左侧的debug视窗生成新的线程thread 329 | - 方法中执行完毕后自动跳回main方法,且该方法的debug线程会自动消失 330 | - 如被调用方法中不加断点,则按顺序执行程序不进入调用的方法; 331 | - 如需进入,则需要在用到该方法的代码行使用"step into (F5)",以手动进入。 332 | - 如仅在所调用的方法中加断点,也可以执行debug 333 | - 开始时,thread列表自动生成主方法和调用方法两个debug线程,以及对应的变量值 334 | - 从断点处的方法语句开始执行,并按顺序跳回main方法继续,直到结束。 335 | - debug执行到带有输入的语句时:如果不在控制台输入,则step over按钮变灰,等待输入完成。 336 | - 方法调试图示: 337 | ![断点调试之方法调试](https://raw.githubusercontent.com/anliux/JAVALearning/master/images/01-java-base/debug/%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95%E8%B0%83%E8%AF%95.bmp) 338 | 339 | 340 | * ### [返回目录](#目录) 341 | 342 | 343 | 344 | 345 | ### END 346 | 347 | 348 | -------------------------------------------------------------------------------- /notes/02-java-web/css.md: -------------------------------------------------------------------------------- 1 | # CSS入门 2 | 3 | ## 目录 4 | 5 | - [案例导航](#案例导航): 本期案例汇总 6 | - [使用CSS完成网站首页的优化](#使用css完成网站首页的优化): 7 | - [使用div和CSS完成注册页面的优化](#使用div和css完成注册页面的优化): 8 | - [CSS部分小结](#css部分小结): 9 | 10 | 11 | 12 | 13 | ## 案例导航 14 | - 使用CSS完成网站首页的优化 15 | - 使用CSS完成网站注册页面的优化 16 | 17 | 18 | * ### [返回目录](#目录) 19 | 20 | 21 | 22 | 23 | ## 使用CSS完成网站首页的优化 24 | - ### 需求分析: 25 | - 由于使用html表格布局存在缺陷,那么我们要来考虑使用div+CSS来对页面进行优化 26 | - 表格布局的缺陷: 27 | - 嵌套层级太多, 一旦出现嵌套顺序错乱, 整个页面达不到预期效果 28 | - 采用表格布局,页面不够灵活, 动其中某一块,整个表格布局的结构全都要变 29 | 30 | - ### 图片效果: 31 | - [网站首页-步骤分析]() 32 | 33 | - ### HTML的块标签: 34 | - div标签: 默认占一行, 自动换行 35 | - 代码示例: 36 | ```html 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
下雨了吗?
45 |
下雨了吗?
46 |
下雨了吗?
47 |
下雨了吗?
48 |
下雨了吗?
49 |
下雨了吗?
50 | 51 | 52 | ``` 53 | - span标签: 内容显示在同一行 54 | - 代码示例: 55 | ```html 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 下雨了 64 | 下雨了 65 | 下雨了 66 | 下雨了 67 | 下雨了 68 | 69 | 70 | ``` 71 | 72 | - ### CSS概述: 73 | - Cascading Style Sheets : 层叠样式表 74 | - 类比:红砖, 抹了一层水泥, 白灰 75 | - 主要用作用: 76 | - 用来美化HTML页面:HTML决定网页的骨架, CSS化妆, 77 | - 将页面的HTML和美化进行分离: 代码更简洁好管理 78 | - CSS的简单语法: 79 | - 在一个style标签中,去编写CSS内容,最好将style标签写在这个head标签中 80 | - 注:html是在body标签中写入内容 81 | - 示例: 82 | ```html 83 | 84 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 103 | 104 | 105 | 106 |
恭喜发财
107 |
红包拿来
108 |
年年有余
109 | 110 | 111 | ``` 112 | 113 | - ### CSS选择器: 114 | - 选择器概述: 115 | - 帮助我们找到我们要修饰的标签或者元素(标签也叫元素) 116 | - 格式:注意每一行中间的冒号,结尾的分号 117 | - 元素选择器: 118 | - 普适,标签名调用 119 | - 示例: 120 | ```html 121 | 122 | 元素的名称{ 123 | 属性名称:属性的值; 124 | 属性名称:属性的值; 125 | } 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 138 | 139 | 140 | 今天还下课吗?今天肝到地老天荒 141 | 今天还下课吗?今天肝到地老天荒 142 | 今天还下课吗?今天肝到地老天荒 143 | 144 | 145 | ``` 146 | - ID选择器: 147 | - 先指定ID,后面才能使用ID 148 | - ID在整个页面中必须是唯一的(这里没问题,后面别的知识点有问题,只会识别第一个) 149 | - ID属性不要以数字开头,数字开头的ID在 Mozilla/Firefox 浏览器中不起作用。 150 | - 优先级:ID > 元素 151 | - 示例: 152 | ```html 153 | 154 | 以#号开头 155 | #ID的名称{ 156 | 属性名称:属性的值; 157 | 属性名称:属性的值; 158 | } 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 177 | 178 | 179 |
java是世界上最好的语言
180 |
PHP是世界上最好的语言
181 |
c++是世界上最好的语言
182 | 183 | 184 | ``` 185 | - 类选择器: 186 | - 先指定类,后面才能使用类 187 | - 用法类似ID选择器,但class可以在多个元素中使用 (对应ID的唯一性) 188 | - 类名的第一个字符不能使用数字!它无法在 Mozilla 或 Firefox 中起作用。 189 | - 优先级:ID > 类 > 元素 190 | - 示例: 191 | ```html 192 | 193 | 以 . 开头 194 | .类的名称{ 195 | 属性名称:属性的值; 196 | 属性名称:属性的值; 197 | } 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 213 | 214 | 215 |
桃子
216 |
苹果
217 |
茄子
218 |
菠萝
219 |
青椒
220 | 221 | 222 | ``` 223 | - 选择器分组: 224 | - 格式:选择器1,选择器2{属性的名称:属性的值} 225 | - 属性选择器: 226 | - 示例: 227 | ```html 228 | a[title]:包含某属性 229 | a[titile='aaa']:包含属性为xx的语句 230 | a[href][title]:同时包含多个属性 231 | a[href][title='aaa']:同时包含多个属性且属性值为xx的语句 232 | ``` 233 | - 后代选择器: 234 | - 格式:爷爷选择器 孙子选择器{} 235 | - 空格隔开,找出所有的后代 236 | - 子元素选择器: 237 | - 格式:父选择器 > 儿子选择器{} 238 | - 只筛选子类,不包含子类的子类 239 | - 伪类选择器: 通常都是用在A标签上,超链接不同的点击状态显示不同的颜色 240 | - 代码示例: 略 241 | 242 | - ### CSS的优先级 243 | - 按照选择器搜索精确度来编写: 244 | - 行内样式 > ID选择器 > 类选择器 > 元素选择器 245 | - 就近原则: 哪个离得近,就选用哪个的样式: 246 | - 例如:同一行指定多个class时,按类选择器,style里的哪个选择器更靠近这一行就优先显示哪个 247 | - 更靠近:先class A,后写class B,则A距离下方代码更远,B拥有优先权 248 | 249 | - ### CSS的引入方式: 250 | - 外部样式: 251 | - 通过link标签引入一个外部的css文件(head标签内用link标签指向一个外部的css文件) 252 | - 思路: 253 | - 类似于把某方法集成到一个方法中,然后调用。 254 | - 这样方便改动时不需要每个调用的文件里都进行修改了 255 | - 提高了代码复用性 256 | - css文件仅包含style里的部分,而在html中,需要把style标签删掉,并使用link标签调用css文件 257 | - 注意link格式: 258 | - `` -- 不自动显示时需要知道格式 259 | - 示例: 260 | ```html 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 |
橘子
271 |
西瓜
272 |
洋葱
273 |
菠萝
274 |
番茄
275 | 276 | 277 | ``` 278 | 279 | ```css 280 | /* style.css: 抽取出的css文件 */ 281 | .fruit{ 282 | color: pink; 283 | } 284 | .vegetable{ 285 | color: green; 286 | } 287 | ``` 288 | - 内部样式: 289 | - 直接在style标签内编写CSS代码(例如上面在html文件内的head标签内的style标签写) 290 | - 行内样式: 291 | - 直接在标签中添加一个style属性, 编写CSS样式(语法同css语法) 292 | - 注意:行内style的引号里,每个样式设置完以后都要用分号作为结束,不要忘记 293 | - 注:仅针对某一行的格式,即使标记了类,也只能修改指定的行 294 | - 示例: 295 | ```html 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 |
桃子
305 |
苹果
306 |
茄子
307 |
菠萝
308 |
青椒
309 | 310 | 311 | ``` 312 | 313 | - ### CSS浮动 : 314 | - 浮动概述: 315 | - 浮动的元素会脱离正常的文档流,在正常的文档流中不占空间 316 | - 可应用于图片: 317 | - 使得文字环绕在图片周围 (注: 如果是div色块如示例,会叠在一起) 318 | - 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动。 319 | - 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。 320 | - 浮动元素之后的元素将围绕它;浮动元素之前的元素将不会受到影响。 321 | - 浮动属性: 322 | - float属性: left / right 323 | - clear属性: 清除浮动 324 | - 应用:两行浮动会叠在一起,这时可以清楚浮动把他们隔开,相当于手动给浮动换行 325 | - both : 两边都不允许浮动 326 | - left: 左边不允许浮动 327 | - right : 右边不允许浮动 328 | - 注意: 329 | - clear是添加在浮动模块之间的,可以设为空模块,不是在下面的模块里添加clear 330 | - 浮动:流式布局 331 | - 示例: 332 | ```html 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 |
341 |
342 |
343 |
344 | 345 |
346 | 347 |
348 |
349 |
350 | 351 | 352 | ``` 353 | 354 | - ### css网站首页优化的步骤分析: 355 | 1. 创一个最外层div 356 | 2. 第一部份: LOGO部分: 嵌套三个div 357 | 3. 第二部分: 导航栏部分 : 放置5个超链接 358 | 4. 第三部分: 轮播图 359 | 5. 第四部分: < 重点!! > 360 | 6. 第五部分: 直接放一张图片 361 | 7. 第六部分: 抄第四部分的 362 | 8. 第七部分: 放置一张图片 363 | 9. 第八部分: 放一堆超链接 364 | 365 | - ### 代码实现: 366 | ```html 367 | 368 | 369 | 370 | 371 | 372 | 398 | 399 | 400 | 411 |
412 | 413 |
414 | 417 | 420 | 425 |
426 | 427 | 428 | 429 |
430 | 431 | 432 | 433 |
434 | 首页 435 | 手机数码 436 | 电脑办公 437 | 鞋靴箱包 438 | 香烟酒水 439 |
440 | 441 | 442 | 443 |
444 | 445 |
446 | 447 |
448 |

最新商品

449 | 450 | 451 |
452 | 453 |
454 | 457 |
458 |
459 | 460 |
461 |
462 | 463 |

高压锅

464 |

$998

465 |
466 |
467 | 468 |

高压锅

469 |

$998

470 |
471 |
472 | 473 |

高压锅

474 |

$998

475 |
476 |
477 | 478 |

高压锅

479 |

$998

480 |
481 |
482 | 483 |

高压锅

484 |

$998

485 |
486 |
487 | 488 |

高压锅

489 |

$998

490 |
491 |
492 | 493 |

高压锅

494 |

$998

495 |
496 |
497 | 498 |

高压锅

499 |

$998

500 |
501 |
502 | 503 |

高压锅

504 |

$998

505 |
506 | 507 |
508 |
509 | 510 | 511 |
512 | 513 |
514 | 515 |
516 |

最新商品

517 | 518 | 519 |
520 | 521 |
522 | 525 |
526 |
527 | 528 |
529 |
530 | 531 |

高压锅

532 |

$998

533 |
534 |
535 | 536 |

高压锅

537 |

$998

538 |
539 |
540 | 541 |

高压锅

542 |

$998

543 |
544 |
545 | 546 |

高压锅

547 |

$998

548 |
549 |
550 | 551 |

高压锅

552 |

$998

553 |
554 |
555 | 556 |

高压锅

557 |

$998

558 |
559 |
560 | 561 |

高压锅

562 |

$998

563 |
564 |
565 | 566 |

高压锅

567 |

$998

568 |
569 |
570 | 571 |

高压锅

572 |

$998

573 |
574 | 575 |
576 |
577 | 578 | 579 |
580 | 581 |
582 | 583 |
584 | 585 | 关于我们 586 | 联系我们 587 | 招贤纳士 588 | 法律声明 589 | 友情链接 590 | 支付方式 591 | 配送方式 592 | 服务声明 593 | 广告声明 594 | 595 |
596 | 597 | Copyright © 2005-2016 传智商城 版权所有 598 |
599 |
600 | 601 | 602 | ``` 603 | 604 | - ### 代码链接: 605 | - []() 606 | 607 | 608 | * ### [返回目录](#目录) 609 | 610 | 611 | 612 | 613 | ## 使用div和CSS完成注册页面的优化 614 | - ### 需求分析 615 | - 由于html的注册页面也是用table布局的, 存在与首页同样的问题 616 | - 所以我们需要使用div+css对我们的注册页面进行美化 617 | - 总共是5部分内容 618 | 619 | - ### 图片效果 620 | - [注册页面]() 621 | 622 | - ### 盒子模型 623 | - CSS的盒子模型: 万物皆盒子 624 | - 图片实例: 625 | - [盒子模型.png]() 626 | - [盒子模型2.png]() 627 | - 内边距: 628 | - padding-top: 629 | - padding-right: 630 | - padding-bottom: 631 | - padding-left: 632 | - 直接指定边距:默认按照顺时针上右下左的顺序赋值 <笔试可能的考点> 633 | 634 | ```html 635 | padding: 10px; 上下左右都是10px 636 | padding:10px 20px; 上下是10px 左右是20px 637 | padding: 10px 20px 30px; 上 10px 右20px 下30px 左20px 638 | padding: 10px 20px 30px 40px; 上右下左, 顺时针的方向 639 | ``` 640 | - 外边距: 641 | - margin-top: 642 | - margin-right: 643 | - margin-bottom: 644 | - margin-left: 645 | - 代码链接: 646 | - [盒子模型.html]() 647 | 648 | - ### CSS绝对定位: 649 | - position: absolute -- 参考物是绝对的网页边框,即网页的上边框和左边框 650 | - top: 控制距离顶部的位置 651 | - left: 控制距离左边的位置 652 | - 注:只有前面声明过绝对位置,后面的top、left才有效 653 | - 代码示例: 654 | - [绝对定位.html]() 655 | 656 | - ### 步骤分析: 657 | 1. 总共是5部分 658 | 2. 第一部分是logo部分 659 | 3. 第二部分是导航菜单 660 | 4. 第三部分是注册部分 661 | 5. 第四部分是footer图片 662 | 6. 第五部分是一堆超链接 663 | 664 | - ### 代码实现: 665 | ```html 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 682 |
683 | 684 | 685 |
686 | 689 | 692 | 697 |
698 | 699 | 700 |
701 | 702 |
703 | 首页 704 | 手机数码 705 | 电脑办公 706 | 鞋靴箱包 707 | 香烟酒水 708 |
709 | 710 |
711 | 712 |
713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 |
会员注册USER REGISTER
用户名:
密码:
确认密码:
email:
姓名:
性别: 男 741 | 女 742 | 妖 743 |
出生日期:
验证码:
758 |
759 | 760 |
761 | 762 | 763 |
764 | 765 |
766 | 767 |
768 | 769 | 关于我们 770 | 联系我们 771 | 招贤纳士 772 | 法律声明 773 | 友情链接 774 | 支付方式 775 | 配送方式 776 | 服务声明 777 | 广告声明 778 | 779 |
780 | 781 | Copyright © 2005-2016 传智商城 版权所有 782 |
783 |
784 | 785 | 786 | ``` 787 | 788 | - 代码链接: 789 | - [网站注册css优化.html]() 790 | 791 | 792 | 793 | * ### [返回目录](#目录) 794 | 795 | 796 | 797 | 798 | ## CSS部分小结 799 | - CSS: 层叠样式表. 800 | - CSS作用: 美化页面,提高代码的复用性 801 | - 选择器: 802 | - 需要掌握的: 803 | - 元素选择器: 标签的名称 804 | - 类选择器: 以 '.' 开头 805 | - ID选择器: 以#开头, #ID的名称 ID必须是唯一的 806 | - 优先级: 807 | - 按照选择精确度: 行内样式 > ID选择器 > 类选择器 > 元素选择器 808 | - 就近原则 809 | - 扩展选择器: 810 | - 选择器分组: 选择器1,选择器2 以逗号隔开 811 | - 后代选择器: 爷爷 孙子 中间以空格隔开 812 | - 子元素选择器: 爸爸 > 儿子 813 | - 属性选择器: 选择器[属性的名称=''] 814 | - 伪类选择器: 超链接标签上使用 815 | - 浮动: float属性 left right 816 | - 清除浮动: clear: both left right 817 | - 盒子模型: 顺时针 : 上右下左 818 | - padding : 内边距 ,控制的是盒子内容的距离 819 | - margin : 外边距 控制盒子与盒子之间的距离 820 | - 绝对定位: position: absolute 821 | - top: 822 | - left: 823 | 824 | 825 | * ### [返回目录](#目录) 826 | 827 | 828 | 829 | 830 | ### END 831 | -------------------------------------------------------------------------------- /notes/02-java-web/html.md: -------------------------------------------------------------------------------- 1 | # HTML入门 2 | 3 | ## 目录 4 | 5 | - [案例导航](#案例导航): 汇总所有案例 6 | - [网站信息页面](#网站信息页面): HTML概述, HTML语法规范, HBuilderX, 需求分析, 代码实现 7 | - [网站图片信息页面](#网站图片信息页面): img标签, 文件路径, 代码实现 8 | - [网站友情链接页面](#网站友情链接页面): 列表标签ul/ol, 超链接标签a, 代码实现 9 | - [网站首页](#网站首页): 表格标签table, 合并单元格, 表格嵌套, 网站首页实现思路分析(以表格划分后分步填充实现) 10 | - [网站注册页面](#网站注册页面): 表单标签form, 跳转方式get/post, input的type参数, 背景图片插入等 11 | - [网站后台页面展示](#网站后台页面展示): 框架标签frameset, frame常用属性, 框架中点击跳转的实现 12 | - [内容回顾](#内容回顾): 简单回顾涉及到的标签 13 | - [参考链接](#参考链接): 菜鸟HBuilderX和HTML, w3school 14 | 15 | 16 | 17 | 18 | ## 案例导航 19 | - 网站信息页面案例 20 | - 网站图片信息页面案例 21 | - 网站友情链接页面案例 22 | - 网站首页案例 23 | - 网站注册页面案例 24 | - 网站后台页面案例 25 | 26 | 27 | * ### [返回目录](#目录) 28 | 29 | 30 | 31 | 32 | ## 网站信息页面 33 | - ### 需求分析: 34 | - 我们公司需要一个对外宣传的网站介绍,介绍公司的主要业务,公司的发展历史,公司的口号等等信息 35 | - 页面示例: 36 | ![网站信息页面](https://github.com/anliux/JAVALearning/blob/master/images/02-html/%E7%BD%91%E7%AB%99%E4%BF%A1%E6%81%AF%E9%A1%B5%E9%9D%A2.png) 37 | 38 | - ### HTML概述: 39 | - HTML: Hyper Text Markup Language 超文本标记语言 40 | - 超文本: 比普通文本功能更加强大,可以添加各种样式 41 | - 标记语言: 通过一组标签.来对内容进行描述. <关键字> , 是由浏览器来解释执行 42 | - 注意:HTML是解释型语言(弱语言),出现小错误,比如文本放到了标签外面,浏览器在解释的时候会自动调整和矫正小错误 43 | - 谷歌浏览器:右键--显示网页源代码 或 检查,查看网页源码 44 | - 学习文档:W3School(一个学习网站) 45 | - 代码示例: 46 | ```html 47 |

静夜诗

48 | --李白
49 |

床前明月光,

50 |

地上鞋两双,

51 |

举头望明月,

52 |

低头思故乡.

53 | ``` 54 | 55 | - ### HTML语法规范 56 | - ``:最上面是一个文档声明,不需要成对 57 | - 根标签 html,成对 58 | - html文件主要包含两部分. 头部分和体部分 59 | - 头部分head: 主要是用来放置一些页面信息 60 | - title:标签页显示标题;如果不写title,标签显示的是路径 61 | - meta charset:解析使用的码表 62 | - 体部分body: 主要来放置HTML页面的内容 63 | - 通过标签来对内容进行描述,标签通常都是由开始标签和结束标签组成 64 | - 标签不区分大小写, 官方建议使用小写 65 | - 大写也对,但规范是小写 66 | - 标签一定要保证是成对出现的 67 | - 标签可嵌套,注意内外成对出现 (虽然浏览器解析时可能会矫正此类错误) 68 | - 代码示例: 69 | ```html 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | ``` 81 | 82 | - ### HBuilderX 83 | - #### 简介 84 | - HBuilderX是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE。 85 | - HBuilderX的编写用到了Java、C、Web和Ruby。 86 | - HBuilderX本身主体是由Java编写。它基于Eclipse,所以顺其自然地兼容了Eclipse的插件 87 | - 是HTML5的常用编辑工具 88 | - HBuilderX: 官网下载即可 89 | - 学习参考链接: [菜鸟教程:HBuilderX 使用教程](https://www.runoob.com/w3cnote/hbuilder-intro.html) 90 | - #### 使用 91 | - 文件 -- 新建 -- web项目, 或新建 -- 项目 -- 基本的HTML项目(包含初始css,js,img等文件) 92 | - 目录顺序:项目-文件-html文件 93 | - 运行: 在默认浏览器运行,快捷键ctrl+R 94 | - 注:之前好像运行才会更新到浏览器显示,现版本保存后会自动更新显示到浏览器 95 | - #### 常用的快捷键 96 | - 参考:[菜鸟教程:HTML常用快捷键 win & mac](https://www.runoob.com/tags/html-keyboardshortcuts.html) 97 | ```html 98 | Ctrl + R 运行当前网页/刷新当前网页 99 | Ctrl + Shift + / 注释当前行 100 | Command + / mac: 加注释,同eclipse 101 | Ctrl + D 删除光标当前所在的行 102 | Ctrl + Shift + R 复制当前行到下一行 103 | Ctrl + Enter 将光标移动到下一行 104 | Ctrl + Shift + Enter 将光标定位在上一行 105 | ``` 106 | 107 | - ### 步骤分析: 108 | - 公司简介 需要标题: 109 | - body: 110 | - head: `

`: 1-6级标题,其他会显示为普通文本格式 (标签未定义) 111 | - `
`: 换行,空标签,没有内容可以修饰,不需要成对 112 | - b : 加粗 113 | - i : 斜体 114 | - strong: 加粗, 带语义标签 115 | - em: 斜体, 带语义标签 116 | - 注:“带语义”:搜索引擎友好,建议使用,例如盲人朗读时会加重语气,b/i则没有此类效果 117 | - 标签:都是预定义好的,不能去创造标签,例如,未定义,仍然显示未普通文本格式 118 | - 水平分割线: 119 | - 水平分割线的标签:`
` 120 | - 四个段落: 121 | - 段落标签:`

` 122 | - 第一个段落字体需要红色: 123 | - font格式: 124 | - 格式:`` 125 | - 示例:` 文本 >` 126 | - font 常用标签 127 | - color: 颜色 128 | - size: 改变字体大小,范围1-7,默认3 129 | - face: 改变字体 130 | 131 | - ### 代码实现: 132 | ```html 133 | 134 | 135 | 136 | 网站信息页面 137 | 138 | 139 | 145 |

公司简介

146 | 147 |
148 |

149 | “中关村黑马程序员训练营”是由传智播客联合中关村软件园、CSDN,并委托传智播客进行教学实施的软件开发高端培训机构,致力于服务各大软件企业,解决当前软件开发技术飞速发展,而企业招不到优秀人才的困扰。 目前,“中关村黑马程序员训练营”已成长为行业“学员质量好、课程内容深、企业满意”的移动开发高端训练基地,并被评为中关村软件园重点扶持人才企业。 150 |

151 |

152 | 黑马程序员的学员多为大学毕业后,有理想、有梦想,想从事IT行业,而没有环境和机遇改变自己命运的年轻人。黑马程序员的学员筛选制度,远比现在90%以上的企业招聘流程更为严格。任何一名学员想成功入学“黑马程序员”,必须经历长达2个月的面试流程,这些流程中不仅包括严格的技术测试、自学能力测试,还包括性格测试、压力测试、品德测试等等测试。毫不夸张地说,黑马程序员训练营所有学员都是精挑细选出来的。百里挑一的残酷筛选制度确保学员质量,并降低企业的用人风险。 153 |

154 |

155 | 中关村黑马程序员训练营不仅着重培养学员的基础理论知识,更注重培养项目实施管理能力,并密切关注技术革新,不断引入先进的技术,研发更新技术课程,确保学员进入企业后不仅能独立从事开发工作,更能给企业带来新的技术体系和理念。 156 |

157 |

158 | 一直以来,黑马程序员以技术视角关注IT产业发展,以深度分享推进产业技术成长,致力于弘扬技术创新,倡导分享、 开放和协作,努力打造高质量的IT人才服务平台。 159 |

160 | 161 | 162 | ``` 163 | 164 | - ### 代码链接 165 | - [网站信息页面.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/01-%E7%BD%91%E7%AB%99%E4%BF%A1%E6%81%AF%E9%A1%B5%E9%9D%A2/%E7%BD%91%E7%AB%99%E4%BF%A1%E6%81%AF%E9%A1%B5%E9%9D%A2.html) 166 | 167 | 168 | * ### [返回目录](#目录) 169 | 170 | 171 | 172 | 173 | ## 网站图片信息页面 174 | - ### 需求分析: 175 | - 在网站中通常需要显示LOGO图片 176 | 177 | - ### img标签: 178 | - 格式:``, 注意最后有个斜杠 179 | - 常用的属性: 180 | - width : 宽度,参数为像素值或缩放百分比 181 | - eg.`` 或 `` 182 | - height: 高度 - 注意,不是heigth 183 | - eg. `` 184 | - 注:单位px(像素);宽高指定其一,另一会等比缩放,两个都指定,图片显示可能会变形 185 | - src : 指定文件路径,图片文件可放在项目的img文件夹下 186 | - eg. `` 187 | - alt: 图片加载失败时的提示内容 (图片加载失败小图标可能不同浏览器不同) 188 | - eg. `这张图片可能加载有问题` 189 | 190 | - ### 文件路径 191 | - 相对路径 192 | - 示例: 193 | ```html 194 | ./ 代表的是当前路径,可不写,默认 195 | ../ 代表的上一级路径:例如图片在文件所在的文件夹平级的路径 196 | ../../ 上上一级路径:例如图片在文件外两层的路径下 197 | ``` 198 | 199 | - ### 代码实现 200 | ```html 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 215 | 这张图片可能加载问题 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | ``` 233 | 234 | - ### 代码链接 235 | - [图片demo.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/02-%E7%BD%91%E9%A1%B5%E5%9B%BE%E7%89%87%E4%BF%A1%E6%81%AF/%E5%9B%BE%E7%89%87demo.html) 236 | 237 | 238 | * ### [返回目录](#目录) 239 | 240 | 241 | 242 | 243 | ## 网站友情链接页面 244 | - ### 需求分析 245 | - 在我们的网站中,通常会显示友商公司的网站链接 246 | - 例如: 247 | - 百度 248 | - 新浪微博 249 | - 黑马程序员... 250 | 251 | - ### 列表标签: 252 | - 无序列表: ul 示例:`
    ` 253 | - type: 小圆圈circle, 小圆点disc(默认样式), 小方块square 254 | - 有序列表: ol 255 | - type: 指定序号的类型,1,a ,A,I, 256 | - start : 指定是起始索引,参数是数字 257 | 258 | - ### 超链接标签a 259 | - 点击链接,跳转去指定网站 260 | - a 超链接标签 `显示文本` 261 | - 常用的属性: 262 | - href: 指定要跳转去的链接地址 263 | - 绝对URL:指链接地址指向另一个站点,需要加上http协议,例:href=“http://www.php.cn/” 264 | - 相对URL:指向站点内某个文件,如果访问的是本网站的html文件,可以直接写文件路径,例:href="/course/list/1.html" 265 | - 锚URL:指向页面中的锚,例:href="#top", 回到最顶部(也可:`href="#"`) 266 | - 参考:[html中href什么意思](https://m.php.cn/article/417929.html) 267 | - target : 以什么方式打开,前两种常用 268 | - `_self`: 默认打开方式,在当前窗口打开 269 | - `_blank`: 新起一个标签页打开页面 270 | - `_parent`: 在父框架集中打开被链接文档。没有父,则使用默认`_self` 271 | - `_top`: 在整个窗口中打开被链接文档。没有父,则使用默认`_self` 272 | - framename: 在指定的框架中打开被链接文档。(详见网站后台页面部分) 273 | 274 | - ### 代码实现 275 | ```html 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 |
      284 |
    • 百度
    • 285 |
    • 新浪微博
    • 286 |
    • 新浪微博
    • 287 |
    • 新浪微博
    • 288 |
    • 黑马程序员
    • 289 |
    290 |
      291 |
    1. 百度
    2. 292 |
    3. GitHub: Anliux
    4. 293 |
    5. 黑马程序员
    6. 294 |
    295 | 296 | 297 | ``` 298 | 299 | - ### 代码链接 300 | - [demo.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/03-%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5/demo.html): 列表标签和超链接标签 301 | 302 | 303 | * ### [返回目录](#目录) 304 | 305 | 306 | 307 | 308 | ## 网站首页 309 | - ### 需求分析: 310 | - 根据产品文档,完成商城首页 311 | - 显示效果如图: ![网站首页.png](https://github.com/anliux/JAVALearning/blob/master/images/02-html/%E7%BD%91%E7%AB%99%E9%A6%96%E9%A1%B5.png) 312 | 313 | - ### 表格标签table 314 | - table标签的常用的属性: (也可以用到tr/td标签中) 315 | - border:表格边框的粗细值 316 | - bgcolor : 背景色 317 | - width : 宽度 318 | - height : 高度 319 | - align : 对齐方式 (参数:center, left, right, justify(两端对齐)) 320 | - tr 标签:表格的行 321 | - td 标签:表格的列 322 | - 注: 323 | - 表格的行和列需要嵌套,按照table-tr-td的顺序使用 324 | - 如果m*n的表格没有每一个都赋值,没赋值的单元格会空着,行列末尾的空单元格会没有边框 325 | - 合并单元格: td的两个属性标签 326 | - colspan : 跨列操作 eg. `x` 327 | - rowspan : 跨行操作 eg. `x` 328 | - colspan和rowspan的参数:表示以本格为基准,横向或纵向合并单元格行或者列的数量 329 | - 可以同时使用,即横向和纵向同时合并某几行和某几列 eg.`x` 330 | - 注意: 跨行或者跨列操作之后,被占掉的格子需要删除掉 331 | - 表格的嵌套: 332 | - 在td中可以嵌套一个表格 333 | - 在原本方法表格中元素的位置放入新的表格`...
    ` 334 | - 小技巧:想要让表格中嵌套的小表格填充满,可以使用宽度和高度的100%分别拉满,例如`width="100%"` 335 | 336 | - ### 思路技巧 337 | - 先分析产品需求页面的构成,并按表格划分几行几列,作为框架,后面分每部分进行内容的填充 338 | - 写代码时:先搭建表格框架,然后填充每部分;填充时,可以先把表格边框显示出来,更清晰 339 | - 善用width="100%" 340 | 341 | - ### 步骤分析 342 | 1. 创建一个8行一列的表格 343 | 2. 第一部份: LOGO部分: 嵌套一个一行三列的表格 344 | 3. 第二部分: 导航栏部分 : 放置5个超链接 345 | 4. 第三部分: 轮播图 346 | 5. 第四部分: 嵌套一个三行7列表格 347 | 6. 第五部分: 直接放一张图片 348 | 7. 第六部分: 抄第四部分的 349 | 8. 第七部分: 放置一张图片 350 | 9. 第八部分: 放一堆超链接 351 | 352 | - ### 代码实现 353 | ```html 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 373 | 374 | 375 | 376 | 393 | 394 | 395 | 396 | 403 | 404 | 405 | 406 | 409 | 410 | 411 | 412 | 478 | 479 | 480 | 481 | 484 | 485 | 486 | 487 | 553 | 554 | 555 | 556 | 559 | 560 | 561 | 562 | 576 | 577 |
    377 | 378 | 379 | 382 | 385 | 390 | 391 |
    380 | 381 | 383 | 384 | 386 | 登录 387 | 注册 388 | 购物车 389 |
    392 |
    397 | 首页 398 | 手机数码 399 | 鞋靴箱包 400 | 电脑办公 401 | 香烟酒水 402 |
    407 | 408 |
    413 | 414 | 415 | 418 | 419 | 420 | 421 | 424 | 427 | 432 | 437 | 442 | 443 | 444 | 445 | 450 | 455 | 460 | 465 | 470 | 475 | 476 |
    416 |

    最新商品

    417 |
    422 | 423 | 425 | 426 | 428 | 429 |

    洗衣机

    430 |

    $998

    431 |
    433 | 434 |

    洗衣机

    435 |

    $998

    436 |
    438 | 439 |

    洗衣机

    440 |

    $998

    441 |
    446 | 447 |

    洗衣机

    448 |

    $998

    449 |
    451 | 452 |

    洗衣机

    453 |

    $998

    454 |
    456 | 457 |

    洗衣机

    458 |

    $998

    459 |
    461 | 462 |

    洗衣机

    463 |

    $998

    464 |
    466 | 467 |

    洗衣机

    468 |

    $998

    469 |
    471 | 472 |

    洗衣机

    473 |

    $998

    474 |
    477 |
    482 | 483 |
    488 | 489 | 490 | 493 | 494 | 495 | 496 | 499 | 502 | 507 | 512 | 517 | 518 | 519 | 520 | 525 | 530 | 535 | 540 | 545 | 550 | 551 |
    491 |

    热门商品

    492 |
    497 | 498 | 500 | 501 | 503 | 504 |

    洗衣机

    505 |

    $998

    506 |
    508 | 509 |

    洗衣机

    510 |

    $998

    511 |
    513 | 514 |

    洗衣机

    515 |

    $998

    516 |
    521 | 522 |

    洗衣机

    523 |

    $998

    524 |
    526 | 527 |

    洗衣机

    528 |

    $998

    529 |
    531 | 532 |

    洗衣机

    533 |

    $998

    534 |
    536 | 537 |

    洗衣机

    538 |

    $998

    539 |
    541 | 542 |

    洗衣机

    543 |

    $998

    544 |
    546 | 547 |

    洗衣机

    548 |

    $998

    549 |
    552 |
    557 | 558 |
    563 | 564 | 关于我们 565 | 联系我们 566 | 招贤纳士 567 | 法律声明 568 | 友情链接 569 | 支付方式 570 | 配送方式 571 | 服务声明 572 | 广告声明 573 |
    574 | Copyright © 2005-2016 传智商城 版权所有 575 |
    578 | 579 | 580 | 581 | ``` 582 | 583 | - ### 代码链接 584 | - [表格标签.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/04-%E7%BD%91%E7%AB%99%E9%A6%96%E9%A1%B5/%E8%A1%A8%E6%A0%BC%E6%A0%87%E7%AD%BE.html) 585 | - [网站首页.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/04-%E7%BD%91%E7%AB%99%E9%A6%96%E9%A1%B5/%E7%BD%91%E7%AB%99%E9%A6%96%E9%A1%B5.html) 586 | 587 | 588 | * ### [返回目录](#目录) 589 | 590 | 591 | 592 | 593 | ## 网站注册页面 594 | - ### 需求分析: 595 | - 编写一个HTML页面 596 | - 显示效果如图所示:![网站注册.png](https://github.com/anliux/JAVALearning/blob/master/images/02-html/%E7%BD%91%E7%AB%99%E6%B3%A8%E5%86%8C.png) 597 | 598 | - ### 表单标签: 599 | - 表单标签form的参数: 600 | - action: 指定提交的地址,对应submit的跳转地址,如路径+网址 601 | - method: 602 | - get方式: <默认>提交方式,会将参数(给了name参数的每条input数据)拼接在跳转后的网址后, 有大小限制 -- 4k 603 | - post方式: 会将参数封装在请求体中, 而不会拼接在网址后;没有大小的限制 604 | - (如果因为路径有中文而错误,可以直接从本地用浏览器打开该文件) 605 | - input: input的内容放在form标签中间 606 | - input: 607 | - 格式:`文本:
    ` 608 | - input的参数: 609 | - type: 指定输入项的类型 610 | - placeholder : 指定默认的提示信息,显示在还没有输出内容的空格里 611 | - name : 在表单提交的时候,当作参数的名称 612 | - id : 给输入项取一个名字, 以便于后期我们去找到它,并且操作它 613 | - type: 指定输入项的类型,参数如下 614 | - text : 文本 615 | - password : 密码框,显示未非明文密码 616 | - radio : 单选按钮,互斥项需要指定为相同name,则不能同时选 617 | - checkbox : 复选框,一般多条input-checkbox并列 618 | - file : 上传文件 619 | - date : 日期类型 (可以在弹出的日历里选择某日期) 620 | - datetime-local: 日期类型,显示年月日和本地的时分时间 621 | - tel : 手机号 (手机应该会唤出小键盘) 622 | - number : 只允许输入数字 (输入其他非数字后会提示需要输入数字) 623 | - textarea : 文本域, 可以输入一段文本 624 | - cols : 指定宽度,可无单位 625 | - rows : 指定的是高度,可无单位 626 | - select : 下拉列表 627 | - option : 选择项 628 | - 格式:select里包option和文本 629 | - 需要包在表单标签里才能生效: 630 | - submit : 提交按钮 631 | - button : 普通按钮 632 | - reset : 重置按钮 633 | - hidden : 隐藏域,用来存放页面的一些ID信息 634 | 635 | - ### 步骤分析 636 | 1. logo部分 637 | 2. 导航栏 638 | 3. 注册部分 639 | 4. 页脚图片 640 | 5. 网站声明信息 641 | 642 | - ### 代码示例: 643 | - 仅展示注册部分,其余部分省略(详见代码链接) 644 | ```html 645 |
    646 | 647 | 648 | 649 | 650 | 651 | 652 | 655 | 656 | 657 | 658 | 661 | 662 | 663 | 664 | 667 | 668 | 669 | 670 | 673 | 674 | 675 | 676 | 679 | 680 | 681 | 682 | 687 | 688 | 689 | 690 | 693 | 694 | 695 | 696 | 699 | 700 | 701 | 702 | 705 | 706 |
    会员注册 USER REGISTER
    用户名: 653 | 654 |
    密 码: 659 | 660 |
    确认密码: 665 | 666 |
    email: 671 | 672 |
    姓名: 677 | 678 |
    性别: 683 | 男 684 | 女 685 | 妖 686 |
    出生日期: 691 | 692 |
    验证码: 697 | 698 |
    703 | 704 |
    707 |
    708 | ``` 709 | 710 | - ### 代码链接 711 | - [表单demo.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/05-%E7%BD%91%E7%AB%99%E6%B3%A8%E5%86%8C%E6%A1%88%E4%BE%8B/%E8%A1%A8%E5%8D%95demo.html) 712 | - [网站注册案例.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/05-%E7%BD%91%E7%AB%99%E6%B3%A8%E5%86%8C%E6%A1%88%E4%BE%8B/%E7%BD%91%E7%AB%99%E6%B3%A8%E5%86%8C%E6%A1%88%E4%BE%8B.html) 713 | 714 | 715 | * ### [返回目录](#目录) 716 | 717 | 718 | 719 | 720 | ## 网站后台页面展示 721 | - ### 需求分析: 722 | - 我们前面已经做完了首页商品展示, 那么我们需要一个页面用来编辑我们的商品信息, 还有商品分类, 用户购买之后,还得有订单管理页面 723 | - 本部分主要讲:从框架角度,对页面布局进行分区,例如邮箱主页(第一行一列,第二行两列且左窄右宽) 724 | 725 | - ### frameset 726 | - 框架标签: frameset 727 | - 对页面进行分区 728 | - 注意: 使用了frameset必须将body删掉,否则页面会有问题 729 | - 格式:frameset设置行列比,里面的frame设置每个页面对应的源文件 730 | - 设置行列比:cols/rows="百分比,逗号隔开,最后一个可以用星号代替" 731 | - frame的常用属性: 732 | - src: 引入的html文件路径 733 | - name: 指定框架的名称 734 | 735 | - ### 代码示例 736 | ```html 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | ``` 750 | 751 | - ### 框架中点击跳转 752 | - 概述: 753 | - 将某个frame进行命令,如name="rightFrame" 754 | - 然后可以在超链接中设置targe="rightFrame" 755 | - 则这个超链接的跳转会显示在指定的frame里 756 | - 场景:点左侧框架中的收件箱,会在右侧框架中显示收件箱页面 757 | 758 | - ### 步骤分析 759 | - 首先分区:先分区两行,后在第二行再次分区两列 760 | - 收件箱跳转:指定data文件;设置右框架name;左分区的源文件写超链接a指向data文件,并收件箱target设为右框架 761 | - 注意:右框架名:在后台页面设置(分区页面),而左分区的跳转是在左分区指向的源文件中设置 762 | 763 | - ### 代码实现 764 | ```html 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 收件箱
    790 | 发件箱
    791 | 垃圾箱
    792 | 793 | 794 | ``` 795 | 796 | - ### 代码链接 797 | - [框架标签.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/06-%E7%BD%91%E7%AB%99%E5%90%8E%E5%8F%B0%E9%A1%B5%E9%9D%A2/%E6%A1%86%E6%9E%B6%E6%A0%87%E7%AD%BE.html) 798 | - [网站后台.html](https://github.com/anliux/JAVALearning/blob/master/src/Java-web/01-html/06-%E7%BD%91%E7%AB%99%E5%90%8E%E5%8F%B0%E9%A1%B5%E9%9D%A2/%E7%BD%91%E7%AB%99%E5%90%8E%E5%8F%B0.html): 涉及到的其他文件在相同路径下 799 | 800 | 801 | * ### [返回目录](#目录) 802 | 803 | 804 | 805 | 806 | ## 内容回顾 807 | - 网站信息案例 808 | - 字体标签 font 809 | - color: 颜色 810 | - size: 大小 1~7 811 | - face: 改变字体 812 | - p 段落标签 813 | - h标题标签 : 1~6 814 | - br 换行 815 | - hr 水平线 816 | - b 加粗 817 | - i 斜体 818 | - strong : 加粗 包含语义 819 | - em : 斜体 包含语义 820 | - 网站图片案例 821 | - img标签 822 | - src : 指定图片的路径 823 | - width: 宽度 824 | - height: 高度 - 注意,不是heigth 825 | - alt : 图片加载错误时的提示信息 826 | - 相对路径: 827 | - ./ 代表的是当前路径 828 | - ../ 代表的上一级路径 829 | - ../../ 代表的上上一级路径 830 | - 友情链接: 831 | - ul: 无序列表 832 | - type : 833 | - ol: 有序列表 834 | - type : 样式 835 | - start : 起始索引 836 | - li : 列表项 837 | - a 超链接标签 838 | - href : 要访问的链接地址 839 | - target : 打开方式 840 | - 网站首页 841 | - table标签 842 | - border: 指定边框 (参数为"xx px") 843 | - width : 宽度 (参数为"xx px") 844 | - height : 高度 (参数为"xx px") 845 | - bgcolor : 背景颜色 (参数为"red/yellow"等) 846 | - align : 对齐方式 (参数为"center"等) 847 | - 注:table居中指表格相对整个页面居中,tr/td居中指单元格中的文字居中 848 | - tr标签 849 | - td标签 850 | - colspan: 跨列操作 851 | - rowspan: 跨行操作 852 | - 表格单元格的合并 853 | - 表格的嵌套 854 | - 网站注册页面: 855 | - 表单标签form的参数: 856 | - action: 指定提交的地址,对应submit的跳转地址,如路径+网址 857 | - method: 打开方式 get/post 858 | - input: input的内容放在form标签中间 859 | - input: 输入标签 860 | input的参数: 861 | - type: 指定输入项的类型 862 | - placeholder : 指定默认的提示信息,显示在还没有输出内容的空格里 863 | - name : 在表单提交的时候,当作参数的名称 864 | - id : 给输入项取一个名字, 以便于后期我们去找到它,并且操作它 865 | - type: 指定输入项的类型 - 参数如下 866 | - text : 文本 867 | - password : 密码框,显示未非明文密码 868 | - radio : 单选按钮,互斥项需要指定为相同name,则不能同时选 869 | -checkbox : 复选框,一般多条input-checkbox并列 870 | - file : 上传文件 871 | - date : 日期类型 (可以在弹出的日历里选择某日期) 872 | - datetime-local: 日期类型,显示年月日和本地的时分时间 873 | - tel : 手机号 (手机应该会唤出小键盘) 874 | - number : 只允许输入数字 (输入其他非数字后会提示需要输入数字) 875 | - textarea : 文本域, 可以输入一段文本 876 | - cols : 指定宽度,可无单位 877 | - rows : 指定的是高度,可无单位 878 | - select : 下拉列表 879 | - option : 选择项 (格式:select里包option和文本) 880 | - 需要包在表单标签里才能生效: 881 | - submit: 提交按钮 882 | - button: 普通按钮 883 | - reset: 重置按钮 884 | - hidden: 隐藏域,用来存放页面的一些ID信息 885 | - 网站后台页面: 886 | - 框架标签frameset: 887 | - 设置行列比:cols/rows 888 | - 内嵌若干frame 889 | - frame的常用属性: 890 | - src: 引入的html文件路径 891 | - name: 指定框架的名称 (框架中点击跳转可用) 892 | 893 | 894 | * ### [返回目录](#目录) 895 | 896 | 897 | 898 | 899 | ## 参考链接 900 | - [菜鸟教程:HBuilderX的使用](https://www.runoob.com/w3cnote/hbuilder-intro.html) 901 | - [菜鸟教程:HTML](https://www.runoob.com/html/html-tutorial.html) 902 | - [w3school](https://www.w3school.com.cn/) 903 | 904 | 905 | * ### [返回目录](#目录) 906 | 907 | 908 | 909 | 910 | ### END 911 | -------------------------------------------------------------------------------- /notes/02-java-web/js.md: -------------------------------------------------------------------------------- 1 | # JS入门 2 | 3 | ## 目录 4 | 5 | - [案例导航](#案例导航): 本期案例汇总 6 | - [](#): 7 | - [](#): 8 | - [](#): 9 | - [](#): 10 | - [](#): 11 | - [](#): 12 | - [](#): 13 | - [](#): 14 | 15 | 16 | 17 | 18 | 19 | ## 案例导航 20 | - 使用JS完成简单的数据校验 21 | - 使用JS完成图片轮播效果 22 | - 网站信息页面案例 23 | - 网站图片信息页面案例 24 | - 网站友情链接页面案例 25 | - 网站首页案例 26 | - 网站注册页面案例 27 | - 网站后台页面案例 28 | 29 | 30 | * ### [返回目录](#目录) 31 | 32 | 33 | 34 | 35 | 36 | ### END 37 | -------------------------------------------------------------------------------- /notes/git.md: -------------------------------------------------------------------------------- 1 | # Git小结 (Mac版) 2 | 3 | 4 | 5 | ## 目录 6 | 7 | - [Git简介](#git简介): 起源, 版本控制系统, 集中式, 分布式, 安装, 使用, Unix的哲学是“没有消息就是好消息” 8 | - [Git本地仓库](#git本地仓库): 初始化, 忽略特殊文件, 提交到仓库 9 | - [版本管理](#版本管理): 版本与回退, Git分区, 管理修改, 删除文件 10 | - [Git远程库](#git远程库): 参考, 连接本地主机与Github, 连接本地仓库到Github新仓库, 克隆GitHub仓库到本地文件夹 11 | - [Git分支管理](#git分支管理): 概述分支, 分支操作(增删改查), 合并分支, 合并冲突解决, 分支管理, bug分支, 多人协作, 变基 12 | - [标签](#标签): 概述, 打标签, 查看标签, 删除标签, 上传标签 13 | - [GitHub使用](#github使用): GitHub创建仓库, 参与开源项目 14 | - [设置Git命令行简写](#设置git命令行简写): 简写命令, config文件设置别名 15 | - [Git的图形化工具:SourceTree](#git的图形化工具sourcetree) 16 | - [Git流管理](#git流管理) 17 | - [常用命令](#常用命令) 18 | - [常见问题](#常见问题) 19 | - [参考链接](#参考链接) 20 | 21 | 22 | 23 | 24 | ## Git简介 25 | ### 起源: 26 | - 由Linux创始人Linus用 c语言 写成的 分布式版本控制系统 27 | - 2008年,GitHub上线 28 | 29 | ### 版本控制系统: 30 | - 能自动记录每次文件的改动,还可以让多人协作编辑 31 | - 集中式和分布式的区别是:本地是否有完整的版本库历史 32 | 33 | ### 集中式版本控制系统: 34 | - 版本库是集中存放在中央服务器的,用自己电脑干活时先从中央服务器取得最新版本,干完活再把自己的成果推送到中央服务器。 35 | - 缺点:必须联网才能工作;中央服务器出问题就翻车。 36 | - 代表:CVS及SVN 37 | 38 | ### 分布式版本控制系统: 39 | - 不存在中央,每个人的电脑都有完整的版本库,修改完后相互推送即可。更安全。 40 | - 分布式的核心设计:同步,而不是主从 41 | - 代表:Git, BitKeeper,.. 42 | 43 | ### 安装 44 | - 测试:命令行输入git,如果没有显示没有安装,则是安装成功了 45 | - 安装:[安装Git](https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496) 46 | 47 | ### 使用 48 | - Mac:在终端使用 49 | - Windows:git bash窗口中输入命令使用,或窗口版点击使用 50 | 51 | ### Unix的哲学是“没有消息就是好消息” 52 | - 如果Git命令后没有任何显示,说明成功 53 | - Git跟踪并管理的是修改,而非文件。 54 | 55 | 56 | ### [返回目录](#目录) 57 | 58 | 59 | 60 | 61 | ## Git本地仓库 62 | ### 初始化: 63 | - `git init`: 64 | - 初始化仓库,把当前文件夹初始化为Git可以管理的仓库,并生成'.git'目录, 65 | - '.git': 是Git来跟踪管理版本库的,不要随意修改 66 | 67 | ### 忽略特殊文件 68 | - `.gitignore`: 放在仓库根目录下,用于忽略特殊文件,不跟踪这类文件的改动,不track 69 | - '.gitignore'文件本身要放到版本库里,并且可以对.其做版本管理 70 | - 格式: 71 | - `#`表示注释,可以简单说明是什么类型,如`#JAVA`下添加一下java语言需要忽略的`* class`文件等 72 | - `!filename`: , 把指定文件排除在ignore规则之外 (指可以添加) 73 | - 检测标准:git status命令是不是说working directory clean。 74 | - `git add -f `: 强制添加已忽略文件 75 | - `git check-ignore -v Xxxxfilename.xxx`: 检查已有`.gitignore`与指定文件的冲突在哪里 76 | - 会显示行号和冲突的那条命令 77 | - mac的`.DS_Store`: 78 | - DS_Store是Mac OS保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于Windows的desktop.ini。 79 | - 可以放在.gitignore中 80 | 81 | ### 提交到仓库 82 | - `git status`: 83 | - 查询当前仓库的状态,会显示绿色已添加未提交、红色已修改未添加的文件 84 | - 可以设置快捷,如git st 85 | - `git add filename` / `git add .` / `git add *`: 86 | - 把新文件/修改文件添加到仓库,添加成功无显示,可用status确认 87 | - `git commit -m "xxxxxx"`: 88 | - 把文件提交到仓库,会显示 "1 file changed, 2 insertions(+)"等信息 89 | - `-m`后面输入的是本次提交的说明,方便从历史记录里查找改动记录 90 | - 注:第一次commit可能会要求输入自己的邮箱和名字以确认身份,按提示输入即可 91 | - `git config --global user.email "you@example.com"` 92 | - `git config --global user.name "Your Name"` 93 | - add和commit的区别: 94 | - add是添加,commit是提交 95 | - 可以多次add后,一次性commit 96 | 97 | 98 | ### [返回目录](#目录) 99 | 100 | 101 | 102 | 103 | ## 版本管理 104 | ### 版本与回退 105 | - 版本锚点: 106 | - 每一次commit提交;每个版本类似于游戏中的每次存档 107 | - `commit id`(版本号): 108 | - SHA1计算出来的很大的数字,用十六进制表示 109 | - 跳转不同版本时,版本号没必要写全,前几位就可以了,Git会自动去找 110 | - `git diff filename`: 111 | - 对比不同,适用于status显示已修改、未添加的情况(status红色),add后不再有diff结果 112 | - 结果(Unix通用的diff格式): 加减号显示增加或删除的行,命令行带颜色 113 | - 应用场景:status显示已修改未提交,但是自己忘记修改了什么不确定是否要提交等的情况 114 | - `git log`: 115 | - 查看版本详细信息,显示从最近到远的有限次commit信息 116 | - 输入q可以退出 117 | - `git log --pretty=oneline`: 118 | - 简化版log,每行显示一条版本信息 119 | - 会展示很多条版本信息,远比上一个log命令展示的多 120 | - `git log --graph --pretty=oneline --abbrev-commit`: 121 | - 显示简化commit ID后的分支图(分支合并情况) 122 | - `HEAD`: 大小写不影响,`^`可表述为倒V 123 | - HEAD指针:指向当前版本 (当前分支,如master) 124 | - `HEAD^`: 指向上一个版本; `HEAD^^`: 指向上上个版本; 以此类推 125 | - `HEAD~100`: 前100个版本写尖容易写不过来,可以用此格式 126 | - `git reset --hard 版本号或HEAD指向` 127 | - `git reset --hard 1094a`: 只提供版本号前几位(5位左右),跳转到该版本 128 | - `git reset --hard HEAD^`: HEAD指向上一个版本,跳转到上一个版本 129 | - `hard`: ? 130 | - `git reflog`: 131 | - 查看命令历史,同时会显示版本号 132 | 133 | ### Git分区:工作区、暂存区、分支 134 | - Git管理的文件分为:工作区,版本库;版本库又分为暂存区stage和暂存区分支master(仓库) 135 | - 工作区>>>>暂存区>>>>仓库 136 | - git add把文件从工作区>>>>暂存区,git commit把文件从暂存区>>>>仓库, 137 | - git diff: 138 | - git diff:查看工作区和暂存区差异 (1-2) 139 | - git diff --cached:查看暂存区和仓库差异 (2-3) 140 | - git diff HEAD:查看工作区和仓库的差异 (1-3) 141 | - 图示: 142 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220606165806467-1321019732.png) 143 | 144 | ### 管理修改 145 | - Git跟踪并管理的是修改,而非文件。 146 | - `git checkout -- file` / `git restore `: 147 | - git add的反向命令,撤销工作区修改,即把暂存区最新版本转移到工作区 (2->1) 148 | - `git reset HEAD ` / `git restore --staged `: 149 | - git commit的反向命令,就是把仓库最新版本转移到暂存区 (3->2) 150 | - `git restore`: git 2.23新增命令,用来分担checkout (管理分支等)的各种任务, 会在新版Git中出现在提示部分 151 | - 建议用此命令 152 | 153 | ### 删除文件 154 | - `rm filename`: 删除文件,等同于手动在文件夹删除 155 | - 本地删除文件后,如果确实需要删掉: 156 | - `git add/rm `删掉该文件,并且`git commit`提交到分支 157 | - 本地删除文件后,如果想要反悔: 158 | - `git restore `或者`git checkout -- filename`: 撤销这次本地删除 159 | - 本地和暂存库都删除文件后,如果想要反悔: 160 | - `git restore --staged `退回到上一个状态(即本地删除但未commit),继续退`git restore `恢复本地已删除文件 161 | - 删除并commit到分支:test.txt 162 | - `git reset --hard HEAD^`:思路是回退到上一个版本,弊端是可能丢失最新修改的一些数据 163 | 164 | 165 | ### [返回目录](#目录) 166 | 167 | 168 | 169 | 170 | ## Git远程库 171 | ### 参考: 172 | - [廖雪峰Git-远程仓库](https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416) 173 | - [Mac生成和查看SSH Key](https://blog.csdn.net/u010545480/article/details/122034047) 174 | 175 | ### 连接本地主机与Github库-Mac版: 176 | - 步骤: 177 | - 创建SSH Key:`$ ssh-keygen -t rsa -C "自己的email地址xxx@xx.com"`,之后一路回车会生成公钥和秘钥 178 | - 找到公钥:可以在用户主目录里找到.ssh目录,id_rsa.pub是公钥 179 | - 登录Github添加SSH公钥: 账号settings -- SSH key -- 添加key 180 | - mac版: 181 | - 默认状态下找不到ssh文件,由于默认是隐藏状态 ("."开头的文件默认是隐藏文件) 182 | - 需要终端进入.ssh文件夹,找到公钥内容并复制,访达里没有 183 | - 参考:[Mac生成和查看SSH Key](https://blog.csdn.net/u010545480/article/details/122034047): 有Mac相关详细步骤 184 | - 相关代码: 185 | ``` 186 | $ cd ~/.ssh 187 | $ ls 188 | $ cat id_rsa.pub 189 | ``` 190 | 191 | ### 连接本地仓库到Github新仓库 192 | - 前提准备: 193 | - 一个GitHub里的仓库;如果没有,新建:右上角找到“Create a new repo”后创建 194 | - 找到远程库的SSH地址并复制备用: 仓库主页 -- 绿色code -- 点开小三角有三个地址,其一是SSH地址 195 | - 需要关联的本地仓库目录下: 196 | - `git remote add origin git@github.com: xxx/xxx.git<此处贴上面找到的远程库SSH地址>` 197 | - `origin`:远程库的名字,Git默认的叫法;如果关联了多台远程服务器,可以分别命名为其他,否则默认是origin 198 | - 查看远程库信息: 199 | - `git remote`: 相当于查看远程库列表,只有名字 200 | - `git remote -v`:查看远程库列表的详细信息,同时列出远程库名和地址、分支等 201 | - 会显示可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址 202 | - 推送本地库到远程库: 203 | - `git push -u origin master`: 204 | - `-u`参数: 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git会把本地的master分支内容推送的远程新的master分支,同时会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 205 | - `git push / git push origin master`: 加`-u`参数后的推送的简化命令 206 | - 删除远程仓库与本地仓库的关联: 207 | - 注:“删除”其实是解除了本地和远程的绑定关系;要真正删除远程库,需要到GitHub的后台删除。 208 | - 先查看远程库信息,后删除 209 | - `git remote rm origin<此处为远程库的名字>` 210 | 211 | ### 克隆GitHub仓库到本地文件夹 212 | - #### 备注: 213 | - 先有远程库的情况下,可以直接clone后使用 214 | - #### clone和download的区别: 215 | - 采用git clone的项目: 216 | - 包含.git目录,这里面有历史版本信息 217 | - 会先在你当前选择的文件夹下建立一个本地仓库,然后再clone服务器上的git工程,这个文件夹下直接进行pull或者push等操作。 218 | - 采用下载zip文件: 219 | - 没有版本历史信息的,只是当前分支的最新版本 220 | - 会切断和git仓库的代码联系,得到的是一个单纯的项目文件,后期无法再对仓库进行pull和push等操作 221 | - 参考: 222 | - [从gitlab或者github采用git clone和download zip的区别](https://blog.csdn.net/u011250186/article/details/103595325) 223 | - [git直接打包下载和使用git clone进行项目拷贝的区别](https://www.csdn.net/tags/Mtjagg3sNDEyMDktYmxvZwO0O0OO0O0O.html) 224 | - #### 克隆步骤: 225 | - 命令行进入正确路径下 226 | - `git clone + 目标远程库的地址(推荐SSH地址)` 227 | - 成功的话:会展示clone进度,最后显示done 228 | 229 | 230 | ### [返回目录](#目录) 231 | 232 | 233 | 234 | 235 | ## Git分支管理 236 | ### 概述分支: 237 | - Git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。 238 | - git的分支最终是要合并到主干的 239 | - HEAD: 指向当前分支,然后分支指向某时间线 240 | - HEAD -> master -> 时间线,或HEAD -> dev -> 某时间线 241 | - 创建新分支dev后(新分支基于之前的分支如master),将HEAD指向dev,即当前分支由master变为dev 242 | - 合并dev与master:即当前HEAD指向的master指向dev的当前提交,就完成了合并 243 | - 快速切换的奥义: 244 | - 仅仅是指针指向的切换,所以快 245 | - 对于所有分支而言, 工作区和暂存区是公共的。 246 | - 所以会在某分支修改文件后,切换到其他分支,查看状态发现还在的情况; 247 | - [git 切换分支时会把未add或未commit的内容带过去](https://blog.csdn.net/stpeace/article/details/84351160) 248 | - 一般先提交后切换分支 249 | 250 | ### 分支操作:(增删查改) 251 | - `git branch`: (查) 列出所有分支,其中带星号的分支是当前分支 252 | - `git branch `: (增) 创建分支 253 | - `git checkout `或者`git switch `: (改) 切换分支 254 | - `git checkout -b `或者`git switch -c `: (增+改) 创建+切换分支,相当于两步brance和checkout 255 | - `git branch -d `: (删) 删除指定分支 (不能删除当前分支,需要先切换到其他分支) 256 | 257 | ### 合并分支 258 | - `git merge `: (先切换到需要保留的分支),合并某指定分支到当前分支 259 | - `Fast-forward`: 如果没有冲突,合并后提示的信息,表示这次合并是“快进模式” (并不是每次合并都能Fast-forward) 260 | - `git merge --no-ff -m "merge with no-ff" dev`: 合并时强制禁用Fast forward模式,会在merge时生成一个新的commit,可从分支历史上就可以看出分支信息 261 | - ff模式合并后:不显示分支图,只在某处标记曾经出现过一个某某分支,不直观 262 | - no ff模式合并后:分支图历史有分支,能看出来曾经做过合并 263 | - `--no-ff`参数,表示禁用Fast forward; `-m "xx"`为添加commit note 264 | - ff模式图示: 265 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607172209148-96579727.png) 266 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607172710367-2036978058.png) 267 | - no ff模式图示: 268 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607172509664-938435040.png) 269 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607172842827-2118204606.png) 270 | 271 | ### 合并冲突解决 272 | - 冲突: 273 | - 当两个分支都对同一行进行了修改并commit,且修改不同时,合并的时候会产生冲突 274 | - 示例:dev对readme文件加一行并commit,随后切换到master分支,同样对readme文件加不同的一行,并commit;此时如果合并dev分支到master分支,就会冲突。 275 | - 图示:![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607105211812-24796839.png) 276 | - 解决冲突: 277 | - 直接merge:会显示合并失败 (Merge conflict in xxx.txt); 278 | - 查看status:会显示冲突文件 (both modified: xxx-filename) 279 | - 解决冲突:vi编辑冲突文件 280 | - 会看到冲突位置已经标出,可以手动查看并修改为最终版本,删掉标识,保存退出 281 | - 注:Git用 `<<<<<<<`,`=======`,`>>>>>>>` 标记出不同分支的内容 282 | - 此时直接merge还是失败,提示需要`git add/rm ` 283 | - 再次查看状态(both modified..),之后正常add-commit此文件 284 | - 这里add-commit相当于将手动解决冲突后完成了merge这一步 285 | - `git log --graph --pretty=oneline --abbrev-commit`: 显示简化commit ID后的分支图(分支合并情况) 286 | - graph:显示图 287 | - abbrev-commit:简单显示commit ID 288 | - 后面不需要再merge了,解决冲突后commit,相当于已经将其他分支的内容手动合并到了当前分支 289 | - 此时merge: Already up to date 290 | - 注:此时其他分支的冲突文件仍是原样(不是解决冲突时修改为的样子),只是合并这一步的冲突解决了 291 | - 删除已合并分支:`git branch -d 其他分支名` 292 | - 注:`git branch -D `: 强行删除一个没有被合并过的分支,用小写d会删除失败 293 | - 合并操作 (merge): 294 | - 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 295 | - 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交 296 | - 只对当前所在分支产生影响:无论是否存在冲突,合并之后,另一个分支都不会发生变化 297 | - 二进制文件冲突就是二选一,你决定留下哪个就是哪个,没有合并一说 298 | - 一般合并完成后,以主线版本为主,这时可以删掉其他分支(可能与主线版本不一致),然后在主线分支基础上新建其他分支 299 | 300 | ### 分支管理 301 | - git有个最佳实践: 302 | - master是主分支,用来做正式发布版之后的保留历史, 303 | - dev用来做正常开发, 304 | - 多个feature用来做某些特性功能, 305 | - release用来做发布版历史,每次发布都是用release打包, 306 | - hotfix用来做发布版之后的一些及时迭代修复bug的工作。 307 | - 团队合作的分支看起来就像这样: 308 | - ![](https://img2022.cnblogs.com/blog/1265453/202206/1265453-20220607173414674-1094418243.png) 309 | 310 | ### bug分支 311 | - 场景: 312 | - 正在dev开发分支营业时,发现master分支有个bug急需处理; 313 | - 在还没有干完活的情况下,未commit的已修改文件会在status显示到别的分支 314 | - 可以先把dev分支的活存起来,先去master,修完bug回来继续干存起来的活 315 | - 注:相当于暂存在某个栈里,用时弹出 316 | - stage命令: 317 | - `git stash`: 当前工作现场“储藏”起来,等以后恢复现场后继续工作 318 | - `git stash list`: 列出已存储内容 319 | - 恢复法1:`git stash apply`恢复但stash内容并不删除,需要用`git stash drop`来删除 320 | - `git stash apply stash@{0}`: 如果多次stash,可以指定恢复哪条存储内容 321 | - 恢复法2:`git stash pop`,恢复的同时把stash内容也删了 322 | - `git cherry-pick commit ID`: 在当前分支上修复在其他分支修复的同样的bug 323 | - 场景:如果在master分支上修复了一个bug101,而同样的bug,想要在dev分支上也修复, 324 | - 我们只需要把fix bug101这个提交所做的修改“复制”到dev分支。 325 | - 注意:只复制fix bug101这个提交所做的修改,并不是把整个master分支merge过来。(dev分支可能比master分支新好多) 326 | - 当然,同样滴,也可以在dev分支上修复bug,然后在master分支上“重放” 327 | 328 | ### 多人协作 329 | #### 注:多人协作:势必涉及到远程库 330 | 331 | #### 流程 332 | - 首先,可以试图用git push origin 推送自己的修改; 333 | - 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; 334 | - 如果合并有冲突,则解决冲突,并在本地提交; 335 | - 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功! 336 | - 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建 337 | - 用命令`git branch --set-upstream-to origin/` 338 | 339 | #### 通常涉及的命令 340 | - 查看远程库信息,使用git remote -v; 341 | - 本地新建的分支如果不推送到远程,对其他人就是不可见的; 342 | - 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; 343 | - 在本地创建和远程分支对应的分支,使用`git checkout -b branch-name origin/branch-name`,本地和远程分支的名称最好一致; 344 | - 建立本地分支和远程分支的关联,使用`git branch --set-upstream branch-name origin/branch-name`; 345 | - 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。 346 | 347 | ### 变基 348 | - `git rebase`: 把本地未push的分叉提交历史整理成直线 (git log时的分支图) 349 | - 使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比 350 | - 注:只对尚未推送或分享给别人的本地修改执行变基操作清理历史; 从不对已推送至别处的提交执行变基操作 351 | 352 | 353 | ### [返回目录](#目录) 354 | 355 | 356 | 357 | 358 | ## 标签 359 | ### 概述 360 | - tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。 361 | - 标签是指向commit的死指针,分支是指向commit的活指针 362 | - 标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签 363 | 364 | ### 打标签 365 | - `git tag `: 默认标签是打在最新提交的commit上的 (默认为HEAD) 366 | - `git tag 标签名称 commit ID`: 将标签打在指定commit上,包含历史commit 367 | - 例如:`git tag v0.9 f52c633` 368 | - `git tag -a -m "<说明文字>" commit ID`: 创建带有说明的标签,用`-a`指定标签名,`-m`指定说明文字 369 | - 例如:`git tag -a v0.1 -m "version 0.1 released" 1094adb` 370 | 371 | ### 查看标签 372 | - `git tag`: 列出所有标签名,注意是按字母排序列出,与时间无关 373 | - `git show `: 查看标签信息,如commit信息,作者,时间,说明文字等 374 | 375 | ### 删除标签 376 | - `git tag -d `: 在本地删除指定标签 377 | - `git push origin :refs/tags/`: 删除一个远程标签 378 | - 在'.git'文件的路径refs/tags下存储了所有的tags信息 379 | - 冒号在这里,前面为空,即将一个“空”的标签推送给对应的标签,即删除 380 | 381 | ### 上传标签 382 | - `git push`: 不会传送标签到远程仓库服务器上, 在创建完标签后你必须显式地推送标签到共享服务器上。 383 | - 这个过程就像共享远程分支一样 384 | - `git push origin `: 推送本地的指定分支到远程库 385 | - `git push origin --tags`:一次性推送全部尚未推送到远程的本地标签 386 | - 或者`git push origin master --tags`:可以把全部的标签打上去 387 | 388 | 389 | ### [返回目录](#目录) 390 | 391 | 392 | 393 | 394 | ## GitHub使用 395 | ### GitHub创建仓库 396 | - 登录到GitHub账号 397 | - 加号 -- 新建仓库 398 | - 新建页面:设置仓库名、是否公开,选择自动生成readme/.gitignore/协议等 399 | - 确认创建 400 | 401 | ### 参与开源项目 402 | - 在GitHub上,可以任意Fork开源仓库,然后从自己账号下clone到本地后进行操作和上传; 403 | - 自己拥有Fork后的仓库的读写权限: 404 | - 一定要从自己的账号下clone仓库,这样你才能推送修改 405 | - 可以推送pull request给官方仓库来贡献代码: 406 | - 流程:干活 -- 干完活后,往自己的仓库推送 -- 发起pull request给官方仓库,等对方接受 407 | 408 | 409 | ### [返回目录](#目录) 410 | 411 | 412 | 413 | 414 | ## 设置Git命令行简写 415 | - `git config --global alias.xx abcde`: 全局设置abcde简写为xx 416 | - `--global`参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。 417 | - 加上 `--global`是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用 418 | - 示例: 419 | - `git config --global alias.st status`: 全局设置status简写为st 420 | - `git config --global alias.co checkout`: 全局设置checkout简写为co 421 | - `git config --global alias.ci commit`: 全局设置commit简写为ci 422 | - `git config --global alias.br branch`: 全局设置branch简写为br 423 | - `git config --global alias.unstage 'reset HEAD'`: 简写的不是单个单词时,可以加引号区分 424 | - 配置文件位置: 425 | - `.git/config`: 每个仓库的Git配置文件 426 | - `隐藏文件.gitconfig`: 当前用户的Git配置文件放在用户主目录下 427 | - `[alias] last = log -1 // ....`: 配置文件中会写简写前命令和别名 428 | - 可以直接在配置文件中修改别名: 429 | - `cat .gitconfig`: 查看用户git配置文件 430 | - `cat .git/config`: 查看仓库的.git配置文件 431 | 432 | 433 | ### [返回目录](#目录) 434 | 435 | 436 | 437 | 438 | ## Git的图形化工具:SourceTree 439 | - 可以官网下载使用,更直观 440 | 441 | 442 | ### [返回目录](#目录) 443 | 444 | 445 | 446 | 447 | ## Git流管理 448 | - 参考:[Git工作流-千锋教育(来自b站)](cnblogs.com/anliux/p/9924093.html) 449 | 450 | 451 | ### [返回目录](#目录) 452 | 453 | 454 | 455 | 456 | ## 常用命令 457 | ### 文件相关命令: 458 | - `ls`: 查看当前路径下的文件 459 | - `ls -ah`: 列出包括隐藏文件在内的所有文件 460 | - `ls -la`: 列出所有文件的详细信息,包括隐藏文件和文件权限等 461 | - `mkdir filename`: 当前路径下创建名为filename的文件夹 462 | - `cd xx`: 进入某某文件夹 463 | - `pwd`: 显示当前路径 464 | - `cat xx`: 查看某某文件的具体内容 465 | - `rm filename`: 删除文件,等同于手动在文件夹删除 466 | 467 | ### vim简单编辑 468 | - `vi/vim filename`: 进入filename的文件编辑状态; 如果是新文件键入并保存,效果相当于新建文件并键入内容 469 | - 键盘按`i`或者`o`:进入编辑模式 (i: insert) 470 | - `ESC`: 编辑完毕之后,esc退出编辑模式 471 | - `shift+;` : 进入末行模式,然后可以输出wq等退出vim 472 | - `wq`: 保存并退出,w写入,q退出 473 | - `e!`: 强制还原到最原始的状态 474 | - `wq!`: 强制保存并退出,感叹号为强制,后可接w或q 475 | 476 | ### Git相关: 477 | - `git init`:初始化仓库 478 | - `.gitignore`: 放在仓库根目录下,用于忽略特殊文件,不跟踪这类文件的改动,不track 479 | - `#`表示注释,可以简单说明是什么类型,如`#JAVA`下添加一下java语言需要忽略的`* class`文件等 480 | - `!filename`: , 把指定文件排除在ignore规则之外 (指可以添加) 481 | - `git add -f `: 强制添加已忽略文件 (添加在.gitignore文件中的文件) 482 | - `git check-ignore -v Xxxxfilename.xxx`: 检查已有`.gitignore`与指定文件的冲突在哪里 483 | - 会显示行号和冲突的那条命令 484 | - `git status`: 查看状态,常用 (可设置快捷,如git st) 485 | - `git add filename` / `git add .` / `git add *`: 添加有更新的文件(status查看变红的文件),星号可以通配各种文件,一键添加 486 | - `git commit -m "xx"`: 提交到仓库 (注:可多次add后一次性commit) 487 | 488 | - `git diff filename`: 对比已修改、未添加文件的不同(status红色的文件,绿色diff无结果) 489 | - git diff:查看工作区和暂存区差异(1-2) 490 | - git diff --cached:查看暂存区和仓库差异(2-3) 491 | - git diff HEAD:查看工作区和仓库的差异(1-3) 492 | - `git log`: 查看版本详细信息,显示有限条最新版本,按q退出 493 | - `git log --pretty=oneline`: 简化版log,每行显示一条版本信息 494 | - `git log --graph --pretty=oneline --abbrev-commit`: 显示简化commit ID的分支图(分支合并情况) 495 | - `git reset --hard 版本号或HEAD指向` 496 | - `HEAD`: 指向当前版本的指针,可用`HEAD^`或`HEAD~100`回退版本 497 | - `git reflog`: 查看命令历史,同时会显示版本号 498 | 499 | - `git restore ` / `git checkout -- file`: 500 | - git add的反向命令,撤销工作区修改,即把暂存区最新版本转移到工作区 (2->1) 501 | - `git restore --staged ` / `git reset HEAD `: 502 | - git commit的反向命令,就是把仓库最新版本转移到暂存区 (3->2) 503 | - `git restore`: git 2.23新增命令,用来分担checkout (管理分支等)的各种任务, 会在新版Git中出现在提示部分 504 | - 建议用此命令 505 | 506 | - `origin`: 远程库的默认名字 507 | - `git remote`: 相当于查看远程库列表,只有名字 508 | - `git remote -v`:查看远程库列表的详细信息,同时列出远程库名和地址、分支等 509 | 510 | - `git remote add origin git@github.com: xxx/xxx.git<此处贴上面找到的远程库SSH地址>`:本地仓库路径下,关联到目标远程库 511 | - `git push -u origin master`:首次推送本地库到远程库,加参数`-u` 512 | - `git push / git push origin master`: 加`-u`参数后的推送的简化命令 513 | - `git pull `: 拉取远程库代码,push的格式同 514 | - `git remote rm origin<此处为远程库的名字>`:删除远程库与本地仓库的关联,如删除origin 515 | - `git clone + 目标远程库的地址(推荐SSH地址)`:本地正确路径下使用此命令,会克隆包含`.git`的远程库到此路径下 516 | 517 | - `git branch`: (查) 列出所有分支,其中带星号的分支是当前分支 518 | - `git branch `: (增) 创建分支 519 | - `git checkout `或者`git switch `: (改) 切换分支 520 | - `git checkout -b `或者`git switch -c `: (增+改) 创建+切换分支,相当于两步brance和checkout 521 | - `git checkout -b branch-name origin/branch-name`: (远程) 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致; 522 | - `git branch --set-upstream branch-name origin/branch-name`: (远程) 建立本地分支和远程分支的关联; 523 | - `git merge `: 合并某指定分支到当前分支 524 | - `Fast-forward`: 合并后提示的信息,表示这次合并是“快进模式” (并不是每次合并都能Fast-forward) 525 | - `git merge --no-ff -m "merge with no-ff" dev`: 合并时强制禁用Fast forward模式,会在merge时生成一个新的commit,可从分支历史上就可以看出分支信息 526 | - `--no-ff`参数,表示禁用Fast forward; `-m "xx"`为添加commit note 527 | - `git branch -d `: (删) 删除指定分支 (不能删除当前分支,需要先切换到其他分支) 528 | - `git branch -D `: (删) 强行删除一个没有被合并过的分支,用小写d会删除失败 529 | 530 | - git rebase`: 变基,把本地未push的分叉提交历史整理成直线 (git log时的分支图) 531 | - 注:只对尚未推送或分享给别人的本地修改执行变基操作清理历史; 从不对已推送至别处的提交执行变基操作 532 | 533 | - `git stash`: 当前工作现场“储藏”起来,等以后恢复现场后继续工作 534 | - 注:stash看起来像一个存储栈,需要弹出等 535 | - `git stash list`: 列出已存储内容 536 | - `git stash apply`:恢复但stash内容并不删除,需要用`git stash drop`来删除 537 | - `git stash apply stash@{0}`: 如果多次stash,可以指定恢复哪条存储内容 538 | - `git stash drop`: 删除stash存储区的内容,再次stash list查看会发现删掉了 539 | - `git stash pop`:恢复的同时把stash内容也删了 540 | - `git cherry-pick commit ID`: 在当前分支上复现在其他分支修复的同样的bug 541 | - 例如在master分支修改bug101后在dev分支复现修复bug101的动作,而不会merge整条master分支 542 | 543 | - `git tag `: 默认标签是打在最新提交的commit上的 (默认为HEAD) 544 | - `git tag 标签名称 commit ID`: 将标签打在指定commit上,包含历史commit 545 | - `git tag -a -m "<说明文字>" commit ID`: 创建带有说明的标签,用`-a`指定标签名,`-m`指定说明文字 546 | - `git tag`: 列出所有标签名,注意是按字母排序列出,与时间无关 547 | - `git show `: 查看标签信息,如commit信息,作者,时间,说明文字等 548 | - `git tag -d `: 在本地删除指定标签 549 | - `git push origin :refs/tags/`: 删除一个远程标签 550 | - `git push origin `: 推送本地的指定分支到远程库 551 | - `git push`: 命令并不会传送标签到远程仓库服务器上,在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样 552 | - `git push origin --tags`:一次性推送全部尚未推送到远程的本地标签 553 | - 或者`git push origin master --tags`:可以把全部的标签打上去 554 | 555 | - `git config --global alias.xx abcde`: 全局设置abcde简写为xx 556 | - 注:可以直接在配置文件中修改alias的内容,与命令作用相同 557 | 558 | 559 | ### [返回目录](#目录) 560 | 561 | 562 | 563 | 564 | ## 常见问题: 565 | #### 1. 如果在远程库添加了文件A,然后在本地删除了文件B,现在想同步远程和本地,如何操作 566 | - 此时,远程库和本地不同步,先同步 567 | - 1. 首先本地pull远程库,把远程库添加的文件A同步到本地: 568 | - 此时status:会显示远程库添加和修改的文件,并且本地删除而远程库还在的文件B仍是删除状态; 569 | - 2. 本地查看status:会显示有删除文件,并且会提示可以add/rm或restore,此时add/rm,并commit 570 | - 3. 此时本地status:干净,无修改文件 571 | - 4. push修改到远程库:可以`git push origin master`等 572 | - 5. 此时再次查看status:working tree clean 573 | 574 | 575 | ### [返回目录](#目录) 576 | 577 | 578 | 579 | 580 | ## 参考链接: 581 | - [廖雪峰:Git教程](https://www.liaoxuefeng.com/wiki/896043488029600) 582 | - [远古学习笔记](https://www.cnblogs.com/anliux/p/9825219.html) 583 | - [博客笔记:Git小结 (Mac版)](https://www.cnblogs.com/anliux/p/16343061.html):同本文 584 | 585 | 586 | ### [返回目录](#目录) 587 | 588 | 589 | 590 | 591 | ### END 592 | -------------------------------------------------------------------------------- /src/Java-web/01-html/01-网站信息页面/网站信息页面.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 入门案例 6 | 7 | 8 | 14 |

    公司简介

    15 |
    16 |

    17 | “中关村黑马程序员训练营”是由传智播客联合中关村软件园、CSDN,并委托传智播客进行教学实施的软件开发高端培训机构,致力于服务各大软件企业,解决当前软件开发技术飞速发展,而企业招不到优秀人才的困扰。 目前,“中关村黑马程序员训练营”已成长为行业“学员质量好、课程内容深、企业满意”的移动开发高端训练基地,并被评为中关村软件园重点扶持人才企业。 18 |

    19 |

    20 | 黑马程序员的学员多为大学毕业后,有理想、有梦想,想从事IT行业,而没有环境和机遇改变自己命运的年轻人。黑马程序员的学员筛选制度,远比现在90%以上的企业招聘流程更为严格。任何一名学员想成功入学“黑马程序员”,必须经历长达2个月的面试流程,这些流程中不仅包括严格的技术测试、自学能力测试,还包括性格测试、压力测试、品德测试等等测试。毫不夸张地说,黑马程序员训练营所有学员都是精挑细选出来的。百里挑一的残酷筛选制度确保学员质量,并降低企业的用人风险。 21 |

    22 |

    23 | 中关村黑马程序员训练营不仅着重培养学员的基础理论知识,更注重培养项目实施管理能力,并密切关注技术革新,不断引入先进的技术,研发更新技术课程,确保学员进入企业后不仅能独立从事开发工作,更能给企业带来新的技术体系和理念。 24 |

    25 |

    26 | 一直以来,黑马程序员以技术视角关注IT产业发展,以深度分享推进产业技术成长,致力于弘扬技术创新,倡导分享、 开放和协作,努力打造高质量的IT人才服务平台。 27 |

    28 | 29 | 30 | -------------------------------------------------------------------------------- /src/Java-web/01-html/02-网页图片信息/图片demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/Java-web/01-html/03-友情链接/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
      9 |
    • 百度
    • 10 |
    • 新浪微博
    • 11 |
    • 新浪微博
    • 12 |
    • 新浪微博
    • 13 |
    • 黑马程序员
    • 14 |
    15 |
      16 |
    1. 百度
    2. 17 |
    3. GitHub: Anliux
    4. 18 |
    5. 黑马程序员
    6. 19 |
    20 | 21 | -------------------------------------------------------------------------------- /src/Java-web/01-html/04-网站首页/网站首页.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 网站首页-静态 6 | 7 | 8 | 9 | 21 | 22 | 23 | 28 | 29 | 42 | 43 | 44 | 49 | 50 | 57 | 58 | 59 | 63 | 64 | 67 | 68 | 69 | 79 | 80 | 144 | 145 | 146 | 149 | 150 | 153 | 154 | 155 | 159 | 160 | 224 | 225 | 226 | 229 | 230 | 233 | 234 | 235 | 241 | 242 | 255 | 256 |
    30 | 31 | 32 | 33 | 34 | 39 | 40 |
    35 | 登录 36 | 注册 37 | 购物车 38 |
    41 |
    51 | 首页 52 | 手机数码 53 | 电脑办公 54 | 香烟酒水 55 | 鞋靴箱包 56 |
    65 | 66 |
    81 | 82 | 83 | 86 | 87 | 88 | 91 | 94 | 99 | 104 | 109 | 110 | 111 | 116 | 121 | 126 | 131 | 136 | 141 | 142 |
    84 |

    最新商品

    85 |
    89 | 90 | 92 | 93 | 95 | 96 |

    冬瓜

    97 |

    ¥299

    98 |
    100 | 101 |

    冬瓜

    102 |

    ¥299

    103 |
    105 | 106 |

    冬瓜

    107 |

    ¥299

    108 |
    112 | 113 |

    冬瓜

    114 |

    ¥299

    115 |
    117 | 118 |

    冬瓜

    119 |

    ¥299

    120 |
    122 | 123 |

    冬瓜

    124 |

    ¥299

    125 |
    127 | 128 |

    冬瓜

    129 |

    ¥299

    130 |
    132 | 133 |

    冬瓜

    134 |

    ¥299

    135 |
    137 | 138 |

    冬瓜

    139 |

    ¥299

    140 |
    143 |
    151 | 152 |
    161 | 162 | 163 | 166 | 167 | 168 | 171 | 174 | 179 | 184 | 189 | 190 | 191 | 196 | 201 | 206 | 211 | 216 | 221 | 222 |
    164 |

    热门商品

    165 |
    169 | 170 | 172 | 173 | 175 | 176 |

    冬瓜

    177 |

    ¥299

    178 |
    180 | 181 |

    冬瓜

    182 |

    ¥299

    183 |
    185 | 186 |

    冬瓜

    187 |

    ¥299

    188 |
    192 | 193 |

    冬瓜

    194 |

    ¥299

    195 |
    197 | 198 |

    冬瓜

    199 |

    ¥299

    200 |
    202 | 203 |

    冬瓜

    204 |

    ¥299

    205 |
    207 | 208 |

    冬瓜

    209 |

    ¥299

    210 |
    212 | 213 |

    冬瓜

    214 |

    ¥299

    215 |
    217 | 218 |

    冬瓜

    219 |

    ¥299

    220 |
    223 |
    231 | 232 |
    243 | 关于我们 244 | 联系我们 245 | 招贤纳士 246 | 法律声明 247 | 友情链接 248 | 支付方式 249 | 配送方式 250 | 广告声明 251 | 联系我们 252 |
    253 | Copyright © 2005-2016 传智商城 版权所有 254 |
    257 | 258 | -------------------------------------------------------------------------------- /src/Java-web/01-html/04-网站首页/表格标签.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
    11131415
    21 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
    1111
    11
    1
    35 |
    2425
    313435
    41424344
    55 | 56 | -------------------------------------------------------------------------------- /src/Java-web/01-html/05-网站注册案例/网站注册案例.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 16 | 17 | 18 | 19 | 20 | 37 | 38 | 39 | 40 | 47 | 48 | 55 | 56 | 107 | 108 | 109 | 110 | 113 | 114 | 115 | 116 | 128 | 129 |
    21 | 22 | 23 | 26 | 29 | 34 | 35 |
    24 | 25 | 27 | 28 | 30 | 登录 31 | 注册 32 | 购物车 33 |
    36 |
    41 | 首页 42 | 手机数码 43 | 电脑办公 44 | 鞋靴箱包 45 | 米面粮油 46 |
    57 | 58 | 59 | 60 | 61 | 104 | 105 |
    62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |
    会员注册 USER REGISTER
    用户名
    密码
    确认密码
    Email
    姓名
    性别
    出生日期
    验证码
    103 |
    106 |
    111 | 112 |
    117 | 关于我们 118 | 联系我们 119 | 法律声明 120 | 支付方式 121 | 关于我们 122 | 联系我们 123 | 法律声明 124 | 配送方式 125 | 广告声明
    126 | Copyright © 2005-2016 传智商城 版权所有 127 |
    130 | 131 | -------------------------------------------------------------------------------- /src/Java-web/01-html/05-网站注册案例/表单demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 | 10 | 姓名:
    11 | 12 | 密码:
    13 | 确认密码:
    14 | 邮箱:
    15 | 手机号码:
    16 | 17 | 照片:
    18 | 19 | 性别: 20 | 男 21 | 女 22 |
    23 | 24 | 爱好: 25 | 敲代码 26 | 滑雪 27 | 宅在家 28 | 蹦迪 29 |
    30 | 31 | 自我介绍: 32 | 33 |
    34 | 35 | 籍贯: 36 | 43 |
    44 | 出生日期: 45 |
    46 | 验证码:
    47 | 48 | 49 | 50 | 51 | 52 |
    53 | 54 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/aaa.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 111 9 | 10 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/bbb.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 收件箱
    9 | 发件箱
    10 | 垃圾箱
    11 | 12 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/ccc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 333 9 | 10 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/data.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 这里是后台数据库 9 | 10 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/框架标签.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/Java-web/01-html/06-网站后台页面/网站后台.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/Java-web/01-html/img/ad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/ad.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/big01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/big01.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/footer.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/header.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/logo2.png -------------------------------------------------------------------------------- /src/Java-web/01-html/img/middle01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/middle01.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/part3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/part3.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/regist_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/regist_bg.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small01.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small02.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small03.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small04.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small05.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small06.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small07.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small08.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/small09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/small09.jpg -------------------------------------------------------------------------------- /src/Java-web/01-html/img/title2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/01-html/img/title2.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/03-引入方式/style1.css: -------------------------------------------------------------------------------- 1 | .fruit{ 2 | color: pink; 3 | } 4 | .vegetable{ 5 | color: green; 6 | } 7 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/03-引入方式/外部样式1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    橘子
    10 |
    西瓜
    11 |
    洋葱
    12 |
    菠萝
    13 |
    番茄
    14 | 15 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/03-引入方式/外部样式2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    桃子
    10 |
    苹果
    11 |
    茄子
    12 |
    菠萝
    13 |
    青椒
    14 | 15 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/03-引入方式/行内样式Demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    桃子
    9 |
    苹果
    10 |
    茄子
    11 |
    菠萝
    12 |
    青椒
    13 | 14 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/04-浮动/浮动.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 |
    10 |
    11 |
    12 |
    13 |
    14 |
    15 |
    16 | 17 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/05-css优先级/css优先级.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 36 | 37 | 38 | 39 | 40 |
    讲完这个真的可以去吃饭啦!
    41 | 42 | 43 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/1-块标签/divDemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    下雨了吗?
    9 |
    下雨了吗?
    10 |
    下雨了吗?
    11 |
    下雨了吗?
    12 |
    下雨了吗?
    13 |
    下雨了吗?
    14 | 15 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/1-块标签/spanDemo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 下雨了 9 | 下雨了 10 | 下雨了 11 | 下雨了 12 | 下雨了 13 | 14 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/ID选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 | 21 | 22 |
    java是世界上最好的语言
    23 |
    PHP是世界上最好的语言
    24 |
    c++是世界上最好的语言
    25 | 26 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/伪类选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 | 黑马程序员 18 | 19 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/元素选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 今天还下课吗?今天肝到地老天荒 14 | 今天还下课吗?今天肝到地老天荒 15 | 今天还下课吗?今天肝到地老天荒 16 | 今天还下课吗?今天肝到地老天荒 17 | 18 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/后代选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 15 | 16 |

    17 | this is a 18 | 儿子 19 | 20 | 孙子 21 | 22 | sentence. 23 |

    24 | 25 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/属性选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 第1段 20 | 第2段 21 | 第3段aaa 22 | 第3段bbb 23 | 第4段 24 | 25 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/类选择器.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 14 | 15 | 16 |
    桃子
    17 |
    苹果
    18 |
    茄子
    19 |
    菠萝
    20 |
    青椒
    21 | 22 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/选择器入门.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 |
    恭喜发财
    16 |
    红包拿来
    17 |
    年年有余
    18 | 19 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/2-选择器/选择器分组.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 |

    标题1

    15 |

    标题2

    16 |

    标题3

    17 |

    标题4

    18 | 19 | -------------------------------------------------------------------------------- /src/Java-web/02-css/01-网站首页的优化/网站首页css优化.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 33 | 34 | 35 | 46 | 47 | 48 |
    49 | 50 | 59 |
    60 | 63 | 66 | 71 |
    72 | 73 | 74 |
    75 | 76 | 85 |
    86 | 首页 87 | 手机数据 88 | 电脑办公 89 | 鞋靴箱包 90 | 米面粮油 91 |
    92 | 93 | 97 |
    98 | 99 |
    100 | 101 | 104 |
    105 | 106 |

    最新商品

    107 | 108 | 115 |
    116 | 117 | 118 |
    119 | 120 | 133 |
    134 |
    135 | 136 |
    137 | 138 |
    139 |
    140 |

    洗衣机

    141 |

    ¥999

    142 |
    143 |
    144 |
    145 |

    洗衣机

    146 |

    ¥999

    147 |
    148 |
    149 |
    150 |

    洗衣机

    151 |

    ¥999

    152 |
    153 |
    154 |
    155 |

    洗衣机

    156 |

    ¥999

    157 |
    158 |
    159 |
    160 |

    洗衣机

    161 |

    ¥999

    162 |
    163 |
    164 |
    165 |

    洗衣机

    166 |

    ¥999

    167 |
    168 |
    169 |
    170 |

    洗衣机

    171 |

    ¥999

    172 |
    173 |
    174 |
    175 |

    洗衣机

    176 |

    ¥999

    177 |
    178 |
    179 |
    180 |

    洗衣机

    181 |

    ¥999

    182 |
    183 | 184 |
    185 |
    186 | 187 | 188 |
    189 | 190 |
    191 | 192 | 193 |
    194 | 195 |

    热门商品

    196 | 197 | 204 |
    205 | 206 | 207 |
    208 | 209 | 222 |
    223 |
    224 | 225 |
    226 | 227 |
    228 |
    229 |

    洗衣机

    230 |

    ¥999

    231 |
    232 |
    233 |
    234 |

    洗衣机

    235 |

    ¥999

    236 |
    237 |
    238 |
    239 |

    洗衣机

    240 |

    ¥999

    241 |
    242 |
    243 |
    244 |

    洗衣机

    245 |

    ¥999

    246 |
    247 |
    248 |
    249 |

    洗衣机

    250 |

    ¥999

    251 |
    252 |
    253 |
    254 |

    洗衣机

    255 |

    ¥999

    256 |
    257 |
    258 |
    259 |

    洗衣机

    260 |

    ¥999

    261 |
    262 |
    263 |
    264 |

    洗衣机

    265 |

    ¥999

    266 |
    267 |
    268 |
    269 |

    洗衣机

    270 |

    ¥999

    271 |
    272 | 273 |
    274 |
    275 | 276 | 277 |
    278 | 279 |
    280 | 281 | 284 |
    285 | 关于我们 286 | 联系我们 287 | 招贤纳士 288 | 法律声明 289 | 友情链接 290 | 支付方式 291 | 配送方式 292 | 服务声明 293 | 广告声明 294 |
    295 | Copyright © 2005-2016 传智商城 版权所有 296 |
    297 | 298 |
    299 | 300 | 301 | -------------------------------------------------------------------------------- /src/Java-web/02-css/02-网站注册案例的优化/盒子模型.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    10 | 11 |
    肾7plus
    12 |
    华为P9
    13 | 16 |
    17 | 18 | 19 | -------------------------------------------------------------------------------- /src/Java-web/02-css/02-网站注册案例的优化/绝对定位.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 | 黑马程序员 10 |
    11 | 12 | 13 | -------------------------------------------------------------------------------- /src/Java-web/02-css/02-网站注册案例的优化/网站注册css优化.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 25 | 26 | 27 | 35 | 36 |
    37 | 38 |
    39 | 42 | 45 | 50 |
    51 | 52 | 53 |
    54 | 55 | 56 |
    57 | 首页 58 | 手机数据 59 | 电脑办公 60 | 鞋靴箱包 61 | 米面粮油 62 |
    63 | 64 | 82 |
    83 |
    84 | 85 | 86 | 87 | 88 | 89 | 90 | 93 | 94 | 95 | 96 | 99 | 100 | 101 | 102 | 105 | 106 | 107 | 108 | 111 | 112 | 113 | 114 | 117 | 118 | 119 | 120 | 124 | 125 | 126 | 127 | 130 | 131 | 132 | 133 | 136 | 137 | 138 | 139 | 142 | 143 | 144 |
    用户注册 USER REGISTER
    用 户 名: 91 | 92 |
    密 码: 97 | 98 |
    确认密码: 103 | 104 |
    email: 109 | 110 |
    姓 名: 115 | 116 |
    性 别: 121 | 男 122 | 女 123 |
    出生日期: 128 | 129 |
    验 证 码: 134 | 135 |
    140 | 141 |
    145 |
    146 |
    147 | 148 | 149 |
    150 | 151 |
    152 | 153 | 154 |
    155 | 关于我们 156 | 联系我们 157 | 招贤纳士 158 | 法律声明 159 | 友情链接 160 | 支付方式 161 | 配送方式 162 | 服务声明 163 | 广告声明 164 |
    165 | Copyright © 2005-2016 传智商城 版权所有 166 |
    167 |
    168 | 169 | -------------------------------------------------------------------------------- /src/Java-web/02-css/img/ad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/ad.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/big01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/big01.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/footer.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/header.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/logo2.png -------------------------------------------------------------------------------- /src/Java-web/02-css/img/middle01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/middle01.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/part3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/part3.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/regist_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/regist_bg.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small01.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small02.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small03.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small04.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small05.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small06.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small07.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small08.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/small09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/small09.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/img/title2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anliux/JAVALearning/c102bb4328d171fb4bda35257f3093eb8f90f31a/src/Java-web/02-css/img/title2.jpg -------------------------------------------------------------------------------- /src/Java-web/02-css/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------