预备知识
Markdown语法学习
Markdown 是一种最小标记语言,并且使用普通文本编辑器进行读取和编辑,但是有专门设计的编辑器可以预览具有样式的文件,这些样式可用于所有主要平台。可用于十几种编程语言,适用于每个主要的博客平台。
Typora使用方法
标题:ctrl+1 ~ ctrl+6
高光:== (内容)== 高光
加粗:** (内容) ** 加粗
斜体:* (内容)* 斜体
下划线: 内容 内容
删除线:~~ 内容 ~~ 删除线
标题序号(再按一次enter取消):1. + 空格
或- + 空格
图片:【图片】+(链接)(注意必须处于英文输入状态下)图片
超链接:和图片同理 【超链接】+(链接) 超链接
代码:
`+内容+` //单行代码
```+代码名称+回车 //多行代码
可直接复制到想要发送的博客的编辑界面
快捷键
ctrl+A 全选
ctrl+S 保存
ctrl+delete 永久删除
ctrl+esc+shift 打开任务管理器
window+R 打开cmd窗口
Dos命令
打开cmd的方式
- 开始+系统+命令提示符
- window键+R,输入cmd,打开控制台(推荐)
- 在任意文件夹下,按住shift键+鼠标右键点击,在此处打开命令行窗口
- 资源管理器的地址栏前加上cmd路径
管理员方式运行:选择以管理员方式运行
常用的Dos命令
#查看当前目录下的所有文件 dir
#清理屏幕 cls
#查看电脑的ip ipconfig
#打开应用 calc -> mspaint -> notepad(例)
#ping命令 ping www.baidu.com
#文件操作 md 创建目录 rd 删除目录
# cd<文件名 创建文件 del 文件名 删除文件
计算机语言发展史
摩尔定律:当价格不变时,集成电路上可容纳的晶体管数目,约每隔十八个月便会增加一倍,性能也将提升一倍。
高级语言:c语言面向过程,c++,java面向对象
Java入门
特性和优势
简单性,面向对象,可移植性,高性能,分布式,动态性,多线程,安全性,健壮性
三大版本
JavaSE:标准版(桌面程序,控制台开发……)
JavaME:嵌入式开发(手机,小家电……)
JavaEE:E企业级开发(web端,服务器开发……)
JDK,JRE,JVM
JDK:Java Development Kit
JRE:Java Runtime Environment
JVM:Java Virtual Machine
安装JDK
-
百度搜索JDK8,找到下载地址
-
同意协议
-
下载电脑对应的版本
-
双击安装JDK
-
记住安装的路径
-
配置环境变量
- 我的电脑–>右键–>属性
- 环境变量–>JAVA_HOME
- 配置path变量
-
测试JDK是否安装成功
- 打开cmd
- java-version
卸载JDK
- 删除java的安装目录
- 删除JAVA_HOME
- 删除path下关于java的目录
- java-version
写程序时可能遇到的情况
- java大小写敏感
- 尽量使用英文
- 文件名与类名必须保持一致,首字母大写
Java基础
注释
//单行注释
/*
多行注释
*/
/**
文档注释
*/
标识符注意点
- 应该以字母,下划线,美元符开始
- 首字符之后可以是字母,下划线,美元符,数字
- 不能使用关键字作为变量名或方法名
- 可以使用中文和拼音命名,但不推荐
数据类型
-
强数据类型(Java)
要求变量的使用要严格符合规定,所有变量都必须定义后才能使用
-
弱数据类型
Java的数据类型分为:基本类型(整数,浮点,字符,布尔),引用类型(类,接口,数组)
//整数
int num1=10;
byte num2=20;
short num3=30;
long num4=30L;
//浮点数
float num5=50.1F;
double num6=3.14159265389;
//字符
char name1='岚';
String name2="阿岚";
//布尔值
boolean flag=true;
//boolean flag=false;
数据类型扩展
//整数扩展: 进制 二进制0b 十进制 八进制0 十六进制0x
int i=0;
int j=010; //八进制
int k=0x10; //十六进制
//布尔值扩展
boolean flag=true;
if(flag==true){
}//新手
if(flag){
}//老手
//代码要精简易读
类型转换
强制转换:(类型)变量名 高–>低
自动转换: 低–>高
注意:
-
不能对布尔值进行转换
-
不能把对象类型转换为不相关的类型
-
转换的时候可能存在内存溢出,或者精度问题
变量,常量
变量的命名规范
- 见名知意
- 类成员变量:首字母小写和驼峰原则
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写加驼峰原则
- 方法名:首字母小写和驼峰原则
- 类名不能与要导的包重名
常量
static final double PI = 3.14;
final static int PII = 3;
//修饰符不存在先后顺序
初识Math
double pow = Math.pow(2,3);
//幂运算 2*2*2 = 8
逻辑运算符,位运算符
//短路运算
//a&&b,a||b(前面判断完成要求后,不再执行后面的判断)
//a&b,a|b,a^b(任然执行后面的判断)
//位运算:2*8=16 2*2*2*2 效率极高
// << *2 >> /2
三元运算符
x?y:z;
//如果x==true,则结果为y,否则结果为z
int score=50;
String type=score<60?"不及格":"及格";//必须掌握
a+=b;//a=a+b;
a-=b;//a=a-b;
//字符串连接符 + ,String
System.out.print(""+a+b);
System.out.print(a+b+"");
包机制
- 一般利用公司域名倒置作为包名:www.baidu.com com.baidu.www
JavaDos生成文档
参数信息:(文档注释)
- @author 作者名
- @version版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
1.通过命令行生成文档 javadoc 参数 java文件
选中要生成文档的java文件,右键选择show in system Explorer,打开文件所在文件夹后,用cmd打开,输入如下指令
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
回车,生成index.html文档
2.通过eclipse生成文档
菜单栏选择:project->Generate Javadoc
Javadoc command选择:JDK目录下的javadoc.exe,勾选要生成Javadoc的工程
选中Document title,并命名
选择JDK版本
在VM option中输入如下指令
-encoding UTF-8 -charset UTF-8
Finish,生成index.html文档
Java流程控制
用户交互Scanner
通过Scanner类获取用户的输入:java.util.Scanner
//基本语法
Scanner s = new Scanner(System.in);
next() 和 nextLine() //获取输入的字符串
hasNext() 和 hasNextLine() //判断是否还有输入的数据
next()使用范例
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(s.hasNext()) {
//使用next方法接收
String str = s.next();//程序会等待用户输入完毕
System.out.println("输出的内容为:"+str);
}
//凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯用完就关
s.close();
}
/*运行结果
使用next方式接收:
hello world
输出的内容为:hello*/
/*next()
1.一定要读取到有效字符后才可以结束输入
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉
3.只有输入有效字符后才将其后面的空白作为分隔符或结束符
4.next()不能得到带有空格的字符串
*/
nextLine()使用范例
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断用户有没有输入字符串
if(s.hasNextLine()) {
//使用next方法接收
String str = s.nextLine();//程序会等待用户输入完毕
System.out.println("输出的内容为:"+str);
}
//凡是属于IO流的类如果不关闭,会一直占用资源,要养成好习惯用完就关
s.close();
}
/*运行结果
使用nextLine方式接收:
hello world
输出的内容为:hello world
*/
/*nextLine()
1.以Enter为结束符,返回的是输入回车之前所有的字符
2.可以获得空白
*/
Scanner进阶使用
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int i=0;
float f=0.0f;
System.out.println("请输入整数:");
if(scanner.hasNextInt()) {
i=scanner.nextInt();
System.out.println("输入的整数数据为:"+i);
}else{
System.out.println("输入的不是整数数据!");
}
System.out.println("请输入小数:");
if(scanner.hasNextFloat()) {
f=scanner.nextFloat();
System.out.println("输入的小数数据为:"+f);
}else {
System.out.println("输入的不是小数数据!");
}
scanner.close();
}
public static void main(String[] args) {
//输入多个数字,求其总和和平均数每输入一个字用回车确认,通过输入非数字来结束输入并输出执行结果
Scanner scanner = new Scanner(System.in);
//和
double sum=0;
//计算输入了多少个数字
int i=0;
//通过循环判断是否还有输入,并在里面对每一次进行求和统计
while(scanner.hasNextDouble()) {
double d=scanner.nextDouble();
i=i+1;//m++
sum=sum+d;
}
System.out.println(i+"个数的和为:"+sum);
System.out.println(i+"个数的平均值为:"+sum/i);
scanner.close();
}
Switch多选择结构
switch中的变量类型可以是
- byte,sgort.int,char
- 从java SE7开始,switch支持String类型
- 同时case标签必须为字符串常量或字面量
switch(expression){
case value:
//语句
break;//可选
case value:
//语句
break;//可选
//可以有任意数量的case语句
default://可选
//语句
}
public static void main(String[] args) {
//case穿透
char grade='C';
switch(grade) {
case'A':
System.out.println("优秀");
break;
case'B':
System.out.println("良好");
break;
case'C':
System.out.println("及格");
case'D':
System.out.println("不及格");
default:
System.out.println("未知等级");
}
}
//运行结果
//及格
//不及格
public static void main(String[] args) {
String s="你好";
switch(s) {
case"再见":
System.out.println("再见");
break;
case"你好":
System.out.println("你好");
break;
default:
System.out.println("哈哈");
}
反编译
编译:java —> class
反编译:class —> java
eclipse反编译方法
-
打开eclipse,选择Help —> Eclipse —> MarketPlace
-
打开插件市场后,搜索Decompiler,下载Enhanced Class Decompiler插件
-
默认全选,下一步
-
同意对应许可协议,Finish
-
重启eclipse,将需要反编译的Class文件右击,选择open with —> class Decompiler Viewer
-
反编译结果
public static void main(String[] args) { String s = "你好"; switch (s.hashCode()) { case 652829 : if (s.equals("你好")) { System.out.println("你好"); return; } break; case 682452 : if (s.equals("再见")) { System.out.println("再见"); return; } } System.out.println("哈哈"); }
循环结构
//输出乘法表
public static void main(String[] args) {
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();
}
//运行结果
/*
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
*/
增强for循环
//遍历数组元素
public static void main(String[] args) {
int[] numbers= {
10,20,30};
for(int x:numbers) {
System.out.println(x+"\t");
}
System.out.println("================");
for(int i=0;i<numbers.length;i++) {
System.out.println(numbers[i]+"\t");
}
}
/*运行结果
10
20
30
================
10
20
30
*/
break,continue,goto
break:强行退出循环
continue:终止某次循环过程
goto: java中没有goto;“标签”是后面跟一个冒号的标识符,例:label:
continue和break同标签使用,会中断到存在标签的位置(不建议使用)
练习:打印三角形
使用拆分思想:将长方形分解成几个三角形
public static void main(String[] args) {
//打印三角形
for(int i=1;i<=5;i++) {
for(int k=5;k>=i;k--) {
System.out.print(" ");//打印空格
}
for(int j=1;j<=i;j++) {
System.out.print("*");
}
for(int j=1;j<i;j++) {
System.out.print("*");
}
System.out.println();
}
}
/*运行结果
*
***
*****
*******
*********
*/
Java方法
什么是方法
概念:
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
设计方法原则:
保持方法的原子性,一个方法只完成一个功能,这样有利于后期的扩展
//main方法
public static void main(String[] args) {
int x=1,y=2;
System.out.println(add(x,y));//调用add方法
}
//add方法
public static int add(int a,int b) {
return a+b;
}
方法的定义和调用
定义
-
方法包含一个方法头和一个方法体
-
修饰符(可选):告诉编译器如何调用该方法,定义了该方法的访问类型
-
返回值类型:方法可能会返回值
-
方法名:方法的实际名称,方法名和参数表共同构成方法签名
-
参数类型(可选)
- 形式参数:在方法调用时用于接收外界输入的数据
- 实参:调用方法时实际传给方法的参数
-
方法体:具体的语句,定义该方法的功能
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法的重载
在一个类中,有相同的函数名称,但形参不同的函数
规则:
- 方法名必须相同
- 参数列表必须不同(个数不同,类型不同,参数排列顺序不同等)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不能作为方法的重载
public static void main(String[] args) {
int num1=2,num2=4;
double a=5,b=10;
System.out.println(max(a,b));
System.out.println(max(num1,num2));
}
//比大小
public static double max(double x,double y) {
double max;
if(x==y) {
System.out.println("两数相同");
return 0;
}
if(x>y) {
max=x;
}else {
max=y;
}
return max;
}
//比大小方法重载
public static int max(int x,int y) {
int max;
if(x==y) {
System.out.println("两数相同");
return 0;
}
if(x>y) {
max=x;
}else {
max=y;
}
return max;
}
命令行传参
- 打开当前java文件所在目录,用cmd打开
- 将java文件编译成class文件
- 直接使用类名,发现无法找到文件
- 退回上一级目录,使用包名.类名
- 成功运行
public static void main(String[] args) {
for(int i=0;i<args.length;i++) {
System.out.println("args["+i+"]="+args[i]);
}
}
F:\ecli\demo\src\code1>javac Demo01.java
F:\ecli\demo\src\code1>cd ../ //返回上一级目录
F:\ecli\demo\src>java code1.Demo01
F:\ecli\demo\src>java code1.Demo01 this is kj
args[0]=this
args[1]=is
args[2]=kj
可变参数
- JDK1.5开始,java支持传递同类型的可变参数给一个方法
- 在方法声明中,在指定参数类型后面加一个省略号(…)
- 一个方法中只能指定一个可变参数,且必须是方法的最后一个参数,任何普通的参数必须在它之前声明
public static void main(String[] args) {
Demo01 demo = new Demo01();
demo.test(3,6,5,7,8);
}
public void test(int ...i) {
//可变参数i
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
System.out.println(i[3]);
System.out.println(i[4]);
}
递归
自己调用自己
递归结构包含两个部分:
- 递归头:什么时候不调用自身方法(如果没有头,将陷入死循环)
- 递归提:什么时候需要调用自身方法
public static void main(String[] args) {
Demo01 test = new Demo01();
System.out.println(test.j(3));
}
//求阶乘
public int j(int n) {
if(n==1) {
//递归头
return 1;
}else {
return n*j(n-1);//递归体
}
}
练习:简单计算器
package code1;
import java.util.Scanner;
public class Compute {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
Compute test=new Compute();
while(true) {
System.out.println("输入数字:"); //获取第一个数字
int x=s.nextInt();
System.out.println("输入运算符:"); //获取运算符
String str=s.next();
System.out.println("输入数字:"); //获取第二个数字
int y=s.nextInt();
switch(str) {
//通过switch方法判断运算类型
case"+":
System.out.println(test.add(x, y));
break;
case"-":
System.out.println(test.subtract(x, y));
break;
case"*":
System.out.println(test.multiply(x, y));
break;
case"/":
System.out.println(test.divide(x, y));
break;
default:
System.out.println("不支持此运算");
}
}
// s.close();
//加,减,乘,除四种方法
}
public int add(int x,int y) {
return x+y;
}
public int subtract(int x,int y) {
return x-y;
}
public int multiply(int x,int y) {
return x*y;
}
public int divide(int x,int y) {
return x/y;
}
}
//运行结果
/*
输入数字:
3
输入运算符:
+
输入数字:
5
8
输入数字:
3
输入运算符:
+
输入数字:
4
7
输入数字:
*/
//后期改进
Java数组
定义
- 相同类型数据的有序集合
- 相同类型的若干个数据,按照一定的先后顺序排列组合而成
- 每个数据元素可以通过一个下标来访问它们
声明和创建
- 必须先声明数组变量,才能在程序中使用数组
dataType[] arrayRefVar; //首选方法
dataType arrayRefVar[];//效果相同,但不是首选方法
- 使用new操作符来创建数组
dataType[] arrayRefVar=new dataType[arraySize];
- 数组索引从0开始
三种初始化
//静态初始化 创建+赋值
int[] a={
1,2,3};
Man[] mans={
new Man(1,1),new Man(2,2)};
//动态初始化 包含默认初始化
ine[] a=new int[2];
a[0]=1;
a[1]=2;
//数组的默认初始化
//数组是引用变量,一经分配空间,其中每个元素被按照实际变量同样的方式被隐式初始化
四个基本特点
- 其长度是确定的,数组一旦被创建,其大小不可改变
- 数组中元素必须是相同类型
- 可以是任何数据类型,包括基本类型和引用类型
- 数组变量属于引用变量,可以看成是对象,数组对象本身是在堆中的
内存分析
堆
- 存放new的对象和数组
- 可以被所有的线程共享,不会存放别的数据引用
栈
- 存放基本变量类型(会包含这个基本类型的具体数值)
- 引用对象的变量(会存放这个引用在堆里的具体地址)
方法区
- 可以被所有的线程共享
- 包含了所有的class和static变量
数组使用
For-Each循环
public static void main(String[] args) {
//For-Each循环
int[] arrays={
1,3,5,7,9};
//JDK1.5,没有下标
for(int array:arrays) {
System.out.println(array);
}
}
数组作方法入参
public static void main(String[] args) {
int[] arrays= {
1,2,3,4,5};
printArray(arrays);//静态方法可直接使用
}
public static void printArray(int[] array){
//数组为参数
for(int i=0;i<array.length;i++) {
System.out.println(array[i]);
}
}
数组作返回值
public static void main(String[] args) {
int[] arrays= {
1,2,3,4,5};
int[] result=reverse(arrays);
printArray(result);
}
//翻转数组
public static int[] reverse(int[] array) {
int[] result=new int[array.length];
for(int i=0,j=result.length-1;i<result.length;i