Java自存笔记

本文档详细介绍了Java编程的基础知识,从预备知识如Markdown语法、DOS命令到Java核心概念,包括类、对象、数据类型、流程控制、数组、面向对象特性,再到异常处理和常用类库如Object、String、Date等。此外,还涵盖了I/O框架和集合框架的使用。内容深入浅出,适合Java初学者和进阶学习。
摘要由CSDN通过智能技术生成

预备知识

Markdown语法学习

Markdown 是一种最小标记语言,并且使用普通文本编辑器进行读取和编辑,但是有专门设计的编辑器可以预览具有样式的文件,这些样式可用于所有主要平台。可用于十几种编程语言,适用于每个主要的博客平台。

Typora使用方法

标题:ctrl+1 ~ ctrl+6

高光:== (内容)== 高光

加粗:** (内容) ** 加粗

斜体:* (内容)* 斜体

下划线: 内容 内容

删除线:~~ 内容 ~~ 删除线

标题序号(再按一次enter取消):1. + 空格

或- + 空格

图片:【图片】+(链接)(注意必须处于英文输入状态下)图片

超链接:和图片同理 【超链接】+(链接) 超链接

代码:

`+内容+` //单行代码
​```+代码名称+回车 //多行代码

可直接复制到想要发送的博客的编辑界面

快捷键

ctrl+A 全选

ctrl+S 保存

ctrl+delete 永久删除

ctrl+esc+shift 打开任务管理器

window+R 打开cmd窗口

Dos命令
打开cmd的方式
  1. 开始+系统+命令提示符
  2. window键+R,输入cmd,打开控制台(推荐)
  3. 在任意文件夹下,按住shift键+鼠标右键点击,在此处打开命令行窗口
  4. 资源管理器的地址栏前加上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
  1. 百度搜索JDK8,找到下载地址

  2. 同意协议

  3. 下载电脑对应的版本

  4. 双击安装JDK

  5. 记住安装的路径

  6. 配置环境变量

    • 我的电脑–>右键–>属性
    • 环境变量–>JAVA_HOME
    • 配置path变量
  7. 测试JDK是否安装成功

    • 打开cmd
    • java-version
卸载JDK
  1. 删除java的安装目录
  2. 删除JAVA_HOME
  3. 删除path下关于java的目录
  4. java-version
写程序时可能遇到的情况
  1. java大小写敏感
  2. 尽量使用英文
  3. 文件名与类名必须保持一致,首字母大写

Java基础

注释

//单行注释
/*
多行注释
*/
/**
文档注释
*/

标识符注意点

  1. 应该以字母,下划线,美元符开始
  2. 首字符之后可以是字母,下划线,美元符,数字
  3. 不能使用关键字作为变量名或方法名
  4. 可以使用中文和拼音命名,但不推荐

数据类型

  • 强数据类型(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){
   }//老手
//代码要精简易读

类型转换

强制转换:(类型)变量名 高–>低

自动转换: 低–>高

注意

  1. 不能对布尔值进行转换

  2. 不能把对象类型转换为不相关的类型

  3. 转换的时候可能存在内存溢出,或者精度问题

变量,常量

变量的命名规范
  1. 见名知意
  2. 类成员变量:首字母小写和驼峰原则
  3. 局部变量:首字母小写和驼峰原则
  4. 常量:大写字母和下划线:MAX_VALUE
  5. 类名:首字母大写加驼峰原则
  6. 方法名:首字母小写和驼峰原则
  7. 类名不能与要导的包重名
常量
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反编译方法

  1. 打开eclipse,选择Help —> Eclipse —> MarketPlace

  2. 打开插件市场后,搜索Decompiler,下载Enhanced Class Decompiler插件

  3. 默认全选,下一步

  4. 同意对应许可协议,Finish

  5. 重启eclipse,将需要反编译的Class文件右击,选择open with —> class Decompiler Viewer

  6. 反编译结果

    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;
	}

方法的定义和调用

定义
  1. 方法包含一个方法头和一个方法体

  2. 修饰符(可选):告诉编译器如何调用该方法,定义了该方法的访问类型

  3. 返回值类型:方法可能会返回值

  4. 方法名:方法的实际名称,方法名和参数表共同构成方法签名

  5. 参数类型(可选)

    • 形式参数:在方法调用时用于接收外界输入的数据
    • 实参:调用方法时实际传给方法的参数
  6. 方法体:具体的语句,定义该方法的功能

修饰符 返回值类型 方法名(参数类型 参数名){
   
    ...
    方法体
    ...
    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;
	}

命令行传参

  1. 打开当前java文件所在目录,用cmd打开
  2. 将java文件编译成class文件
  3. 直接使用类名,发现无法找到文件
  4. 退回上一级目录,使用包名.类名
  5. 成功运行
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]);
	}

递归

自己调用自己

递归结构包含两个部分:

  1. 递归头:什么时候不调用自身方法(如果没有头,将陷入死循环)
  2. 递归提:什么时候需要调用自身方法
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;
//数组的默认初始化
//数组是引用变量,一经分配空间,其中每个元素被按照实际变量同样的方式被隐式初始化
四个基本特点
  1. 其长度是确定的,数组一旦被创建,其大小不可改变
  2. 数组中元素必须是相同类型
  3. 可以是任何数据类型,包括基本类型和引用类型
  4. 数组变量属于引用变量,可以看成是对象,数组对象本身是在堆中的

内存分析

  • 存放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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值