java基础

本文详细介绍Java编程的基础知识,包括计算机基础概念、Java环境搭建、数据类型与运算符、控制结构、数组与方法等内容,深入浅出地讲解面向对象编程的封装、继承和多态特性。
第一章 计算机基础
  • 位(bit):一个数字0或者一个数字1,代表一位
  • 字节(Byte):每逢8位是一个字节,这是数据存储的最小单位
  • 命令指示符
    • windows盘符切换c:/C:
    • cd ** 加tab键自动补全
    • cd 文件夹名称
    • cd 文件夹1\文件夹2\文件夹3
    • 直接回根路径cd \
    • 查看当前内容dir
    • 清屏cls
    • 退出exit
第二章 Java语言开发语言环境搭建
  • JVM(Java Virtual Machine):java虚拟机,是运行所有java程序的假想计算机,是java程序的运行环境
  • 跨平台:任何软件的运行,都必须要运行在操作系统之上,我们用java编写的软件可以运行在任何的操作系统上,这个特性称为java语言的跨平台特性,该特性是有JVM实现的,编写的程序是运行在JVM上,而JVM运行在操作系统上
  • JRE(Java Runtime Environment):是java程序的运行是环境,包含JVM和运行所需要的的核心类库
  • JDK(Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具
第三章 入门程序
  • 程序开发步骤说明
  • java程序开发三步骤:编写、编译、运行
  • 编写java源程序
  • javac xxx.java生成xxx.class
  • java xxx 执行java程序
// 第一行的第三个单词必须和所在的文件名称完全一样,大小写也要一样
// public class后面代表定义一个类的名称,类是java当中所有源代码的基本组织单位
public class HelloWorld {
	// 第二行的内容是万年不变的固定写法,代表main方法
	// 这一行代表程序执行的起点
	public static void main(String[] args){
		// 第三行代表打印输出语句(其实就是屏幕显示)
		// 希望显示什么东西,就在小括当中填写什么内容
		System.out.println("Hello,World!!");
	}
}
  • 关键字的特点:
    • 完全小写的字母
    • 在增强版的记事本当中有特殊的颜色
  • 标识符:是指在程序中,我们自己定义的内容,比如类的名字、方法的名字和变量的名字等等,都是标识符
    • HelloWorld案例中,出现的标识符有类名字HelloWorld
  • 命名规则:硬性要求
    • 标识符可以包含字母、数字、$、和下划线_
    • 标识符不能以数字开头
    • 标识符不能是关键字
  • 命名规范:软性建议
    • 类名规范:首字母大小,后面每个单词首字母大写
    • 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)
    • 方法名规范:同变量名
第四章 常量
  • 常量:是指在java程序运行期间固定不变的数据
  • 常量的分类:
    • 字符串常量:凡是用双引号引起来的部分,叫做字符串常量,例如:“abc”,“123”
    • 整数常量:直接写上的数字
    • 浮点数常量:直接写上的数字,有小数点
    • 字符常量:凡是用单引号引起来的单个字符,就叫做字符常量,例如:‘a’,‘9’,‘中’
    • 布尔常量:只有两种取值,true、false
    • 空常量:null,代表没有任何数据
public class Demo01Const{
	public static void main(String[] args){
		//字符串常量
		System.out.println("ABC");
		System.out.println("");//字符串两个双引号中间的内容为空
		System.out.println("XYZ");
		//整数常量
		System.out.println(30);
		//浮点数常量
		System.out.println(3.14)
		//字符常量
		System.out.println('a');
		System.out.println('6');
		// System.out.println('');//两单引号中间必须有且仅有一个字符,没有不行
		//布尔常量
		System.out.println(true);
		System.out.println(false);
		//空常量 空常量不能直接用来打印输出
		// 错误写法 System.out.println(null)
	}
}
  • 基本数据类型
    • 整数型 byte short int long
    • 浮点型 float doule
    • 字符型 char
    • 布尔型 boolean
  • 引用数据类型
    • 字符串
    • 数组
    • 接口
    • Lambda
  • 注意事项:
  1. 字符串不是基本类型,而是引用类型
  2. 浮点型可能只是一个近视值,并非精确的值
  3. 数据范围与字节数不一定相关
  4. 浮点数当中默认类型是double,如果一定要使用float类型,需要加上一个后缀F,如果是整数,默认是int类型,如果一定要使用long类型,需要加上后缀L,推荐使用大写字母后缀
  • 变量:程序运行期间,内容可以发生改变的量
public class Demo02Variable {
	public static void main(String[] args){
		//创建一个变量
		//格式:数据类型 变量名称;
		int num1;
		//向变量当中存入一个数据
		//格式:变量名称 = 数据值
		num1 = 10;
		System.out.println(num1);//10
		//改变变量当中本来的数字,变成新的数字
		num1 = 20;
		System.out.println(num1);//20
		
		//使用一步到位的格式来定义变量
		//格式:数据类型 变量名称 = 数据值;
		int num2 = 25;
		System.out.println(num2);//20
		System.out.println("=======");
		byte num3 = 30;//注意:右侧数值的范围不能超过左侧数据类型的取值范围
		System.out.println(num3);//30
		//byte num4 = 400; //右侧超出了byte数据范围,错误;
		short num5 = 50;
		System.out.println(num5);//50
		float num7 = 2.5F;
		System.out.println(num7);//2.5
		char zifu = 'A';
		System.out.println(zifu);//A
		zifu = '中';
		System.out.println(zifu);//中
		boolean var1 = true;
		System.out.println(var1);//true
		//将一个变量的数据内容,赋值交给另一个变量
		//右侧的变量名称var赋值给var2进行存储
		boolean var2 = var1;
		System.out.println(var2);//false
		
	}
}
  • 数据类型转换
  1. 自动类型转换
/*
当数据类型不一样时,将会发生数据类型转换
自动类型转换(隐式)
1.特点:代码不需要进行特殊处理,自动完成
2.规则:数据范围从小到大
强制类型转换(显式)
*/

public class Demo01DataType{
	public static void main(String[] args){
		System.out.println(1024);//这就是一个整数(byte,int,short,long),默认就是int类型
		System.out.println(3.14);//这就是一个浮点数,默认就是double类型
		//左边是long类型,右边是默认的int类型,左右不一样
		//一个等号代表赋值,将右侧的int常量,交给左侧的long变量进行存储	
		//int-->long,符合了数据范围从小到大的要求
		//这一行代码发生了自动类型转换
		long num1 = 100;
		System.out.println(num1);//100
		//左边是double类型,右边是float类型,左右不一样
		//float-->double,符合从小到大的规则
		//也发生了自动类型转换
		double num2 = 2.5F;
		System.out.println(num2);//2.5
		//左边是float类型,右边long类型,左右不一样
		//long-->float,范围是float更大一些,符合从小到大原则
		//也发生了自动类型转换
		float num3 = 30L;
		System.out.println(num3);//30.0
	}
}
  1. 强制类型转换
/*
强制类型转换:1.特点:代码需要进行特殊的格式处理,不能自动完成
2.格式:范围小的类型 范围小的变量 = (范围小的类型)原本范围大的数据;
注意事项:1.强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出
2.byte/short/char这三种类型都可以发生数学运算
3.byte/short/char这三种类型在运算的时候,都会被首先提升为Int类型,然后再进行计算
4.boolean类型不能发生数据类型转换
*/


public class Demo02DataType{
	public static void main(String[] args){
		//左边是int类型,右边是long类型,不一样
		//long-->int,不是从小到大,不能发生自动类型转换
		//格式:范围小的类型 范围小的变量 = (范围小的类型)原本范围大的数据;
		int num = (int)100L;
		System.out.println(num);
		//long强制转换成为int类型
		int num2 = (int)6000000000L;
		System.out.println(num2);
		//double-->int 强制类型转换
		int num3 = (int)3.5;
		System.out.println(num3);//3,这并不是四舍五入,所有的小数位都会被舍弃掉
		
		char zifu = 'A';//这是一个字符型变量,里面是大写字母A
		System.out.println(zifu + 1);//66,也就是大写字母A被当成65进行处理	
		
		byte num4 = 40;//注意:右侧的数值大小不能超过左侧的类型范围
		byte num5 = 50;
		//byte + byte -->int + int --> int
		int result = num4 + num5;
		System.out.println(result);//90
		
		short num6 = 60;
		//byte + short --> int+int-->int
		//int强制转换成short:注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出
		short result1 = (short) (num4 + num6);
		System.out.println(result1);
	}
}
  • ASCII码

/*
ASCII码表:American Standard Code for Information Interchange,美国信息交换标准代码
Unicode码表:万国码,也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含更多的字符
48 - ’0‘
65 - ’A‘
97 - ’a‘
*/
public class Demo03DataTypeChar{
	public static void main(String[] args){
		char zifu1 = '1';
		System.out.println(zifu1 + 0);//49
		char zifu2 = 'A';//其实底层保存的是65数字
		char zifu3 = 'c';
		//左侧是int类型,右边是char类型
		//char-->int,确实是从小到大
		//发生了数据类型转化
		int num = zifu3;
		System.out.println(num);//99
		char zifu4 = '中';//正确写法
		System.out.println(zifu4 + 0);//20013
	}
}
  • 算术运算符
  • 进行特定操作的符号,例如:+
  • 表达式:用运算符连起来的式子叫做表达式,例如:20+5,又例如:a+b
  • 四则运算:
    • 取模

/*
首先计带到表达式的结果,然后再打印输出这个结果
对于一个整数的表达式来,除法用的是整除,整除除以整数,结果仍然是整数,只看商 不看余数
取模(取余数):%
注意事项:1.一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种

*/
public class Demo04perator{
	public static void main(String[] args){
		System.out.println(20+30);
		//两变量之间也可以进行数学运算
		int a = 20;
		int b = 30;
		System.out.println(a - b);//-10
		//变量和常量之间可以混合运算
		System.out.println(a * 10);//200
		
		int x = 10;
		int y = 3;
		int result1 = x / y;
		System.out.println(result1);//3
		int result2 = x % y;
		System.out.println(result2);//余数,模,1
		//int + double --> double + double -->double
		double result3 = x + 2.5;
		System.out.println(result3);//12.5
	}
}
  • 注意事项
/*
四则运算当中的加号“+”有常见的三种用法
1.对于数值来,那就是加法
2.对于字符char类型来,在计算之前,char会被提升成int类型,然后再计算
char类型字符,和int类型数字,之间的对照关系表,ASCII、Unicode
3.对于字符串String(首字母大写,并不是关键字)来,如加号代表字符串连操作
任何数据类型和字符串进行连的时候,都会变成字符串
*/

public class Demo05Plus{
	public static void main(String[] args){
		//字符串类型的变量基本使用;
		//数据类型 变量名称 = 数据值;
		String str1 = "Hello";
		System.out.println(str1);//Hello
		System.out.println("Hello" + "World");//HelloWorld
		//String + int -->
		String str2 = "java";
		System.out.println(str2 + 20);//java20
		//优先级问题
		System.out.println(str2 + 20 + 30);//java2030
		System.out.println(str2 + (20 + 30));//java50
	}
}
  • 自增自减运算符
  • 自增运算符:++
  • 自减运算符:–
  • 含义:让一个变量涨一个数字1,或者让一个变量降一个数字1
/*使用格式:写在变量之前,或者写在变量之后,例num++,num--,--num,++num
使用方式:
1.单独使用:不和其他任何操作混合,自己独立成为一个步骤
2.混合使用:和其他操作混合,例与赋值混合,或者与打印操作混合等
使用区别:
1.在单独使用的时候,前++和后++没有任何区别
2.在混合使用的时候,有重大区别
	a.如果是前++,那么变量立+1,然后拿着结果进行使用    【先加后用】
	b.如果是后++,那么首先使用变量本来的数值,然后再让变量+1 【先用后加】
注意事项:
只有变量才能使用自增、自减运算符,常量不可以发生改变,所以不能用
*/
public class Demo06Operator{
	public static void main(String[] args){
		int num1 = 10;
		System.out.println(num1);//10
		++num1;//单独使用 前++
		System.out.println(num1);//11
		num1++;//单独使用,后++
		System.out.println(num1);//12
		//与打印操作混合使用
		int num2 = 20;
		System.out.println(++num2);//混合使用,先++,变量立马上变成21,然后打印结果21
		System.out.println(num2);//21
		//混合使用:后++,首先使用变量本来30,然后再让变量+1得到31
		int num3 = 30;
		System.out.println(num3++);
		System.out.println(num3);
	}
}
  • 赋值运算符
    • +=
    • -=
    • *=
    • /=
    • %=
  • 比较运算符
    • ==、<、>、<=、>=、!=
    • 比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值true或者false
/*
注意事项:
1.比较运算符的结果一定是boolean值,成立就是true,不成立就是false
2.如果进行多次判断,不能连写 数学当中的写法 例1<x<3 程序当中不允许这种写法
*/

public class Demo08OPerator{
	public static void main(String[] args){
		System.out.println(10 > 5);//true
		int num1 = 10;
		int num2 = 20;
		
		System.out.println(num1 <= num2);//true
	}
}
  • 逻辑运算符
    • 与 && 全都是true,才是true,否则就是false
    • 或 || 至少一个是true,就是true,全都是false,才是false
    • 非 ~ 本来是true,变成false,本来是false,变成true
注意事项:
1.逻辑运算符只能用于boolean值
2.与、或需要左右各有一个boolean值,但是取反只要唯一的一个boolean值即可
3.与、或两运算符,如果有多个条件,可以连
两个条件:条件a && 条件b
多个条件:条件a && 条件b && 条件c


public class Demo09Logic{
	public static void main(String[] args){
		System.out.println(true && false);//false
		System.out.println(true && true);//true
		
		System.out.println(true || false);//false
		System.out.println(true || true);//true
		
		System.out.println(!false);//true
		System.out.println(false);//false
	}
}
  • 三元运算符
/*
一元运算符:只需要一个数据就可以进行操作的运算符,例如:取反、自增++、自减--
二元运算符:需要两数据才可以进行操作的运算符,例如:加法+,赋值
三元运算符:需要三个数据才可以进行操作的运算符
格式:数据类型 变量名称 = 条件判断 ? 表达式a:表达式b;
流程:首先判断条件是否成立:
如果成立为true,那么将表达式a的值赋值给左侧的变量;
如果不成立为false,那么将表达式b的值赋值给左侧的变量;
二者选其一
注意事项:
1.必须同时保证表达式a和b都符合左侧数据类型要求
2.三元运算符的结果必须被使用
*/
public class Demo10Operator{
	public static void main(String[] args){
		int a = 10;
		int b = 20;
		//判断a>b是否成立,如果成立将a的值赋值给max,否则b赋值给max
		int max = a > b ? a : b;//最大值的变量
		System.out.println("最大值:"+max);//20
	}
}
第四章 判断语句
  • 选择结构
  1. 单if语句
public class Demo02If{
	public static void main(String[] args){
		
		
		System.out.println("今天天气不错,正在压马路...突然发现一个快乐的地方:网吧");
		int age = 20;
		if(age >= 18){
			System.out.println("进入网吧,开始high!");
			System.out.println("妈妈让回家吃饭");
			System.out.println("结账走人");
		}
		System.out.println("继续玩");
		
	}
}
  1. 标准if-else语句
if(关系表达式){
    语句体1:
}else{
    语句体2:
}

// 标准的if-else语句
public class Demo03Ifelse{
	public static void main(String[] args){
		int num = 7;
		if (num%2==0){//如果除以2能够余数为0,说明是偶数
			System.out.println("偶数");
		}else{
			System.out.println("奇数");
		}
	}
}
  1. if语句的第三种格式 if…else if…else
if(判断条件1){
    执行语句1;
}else if(判断语句2){
    执行语句2;
}...

//x和y的关系满足如下
//如果x >= 3, 那么y = 2x + 1;
//如果-1 <x < 3, 那么y = 2x;
//如果x <= -1, 那么y = 2x - 1;
public class Demo04IfElseExt{
	public static void main(String[] args){
		int x = 10;
		int y;
		if (x >= 3){
			y = 2*x + 1;
		}else if (-1 < x && x < 3){
			y = 2 * x + 1;
		}else{
			y = 2 * x - 1;
		}
		System.out.println(y);
	}
}
  • 用if语句替换三元运算符
//题目:使用三元运算符和标准的if-else语句分别实现:取两数字当中的最大值
public class Demo06Max{
	public static void main(String[] args){
		int a = 10;
		int b = 20;
		//首先使用三元运算符
		//int max = a > b ? a:b;
		//System.out.println("最大值:"+ max);
		int max;
		if (a > b) {
			max = a;
		} else {
			max = b;
		}
		System.out.println("最大值:"+ max);
	}
}
  • 选择语句 --swich
  • swich语句格式
swich(表达式){
    case常量值1:
    语句体1;
    break;
    case常量值2:
    语句体2;
    break;
}
  • 执行流程
    • 首先计算出表达式的值
    • 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
    • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后流程结束掉
public class Demo07Swich{
	public static void main(String[] args){
		int num = 10;
		switch (num) {
			case 1:
				System.out.println("星期一");
				break;
			case 2:
				System.out.println("星期二");
				break;
			case 3:
				System.out.println("星期三");
				break;
			case 4:
				System.out.println("星期四");
				break;
			case 5:
				System.out.println("星期五");
				break;
			case 6:
				System.out.println("星期六");
				break;
			case 7:
				System.out.println("星期日");
				break;
			default:
				System.out.println("数据不合理");
				break;//最后一个break语句可以省略,但是强烈建议不要省略
		}
	}
}
  • switch注意事项
  1. 多个case后面的数值不可以重复
  2. switch后面小括当中只能是下列数据类型 基本数据类型:byte/short/char/int
    引用数据类型:String字符串、enum枚举
  3. switch语句格式可以很灵活,前后顺序可以颠倒,而且break语句还可以忽略
    匹配哪一个case就从哪个位置向下执行,直到遇到break或者整体结束为止
第四章 循环语句
  • 循环语句可以满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成四循环
  • for循环语句
for(初始化表达式1;布尔表达式2;布进表达式4){
    循环体3
}
  • 执行流程
    • 执行顺序:1234》234》234…2不满足为止
    • 1负责完后循环变量初始化
    • 2负责判断是否满足循环条件,不满足则跳出循环
    • 3具体执行的语句
    • 4循环后,循环条件所涉及变量的变化情况
public class Demo09For {
	public static void main(String[] args) {
		for (int i = 1; i <=100; i++) {
			System.out.println("我错啦" + i);
		}
		System.out.println("程序停止");
	}
}
  • while循环
/*
while循环有一个标准格式,还有一个扩格式

标准格式:
while (条件判断) {
	循环体
}
扩格式:
初始化语句:
while (条件判断) {
	循环体
	步进语句;
}

*/
public class Demo10While {
	public static void main(String[] args) {
		int i = 1;//1 初始化语句
		while (i <= 10) {
			System.out.println("我错啦" + i);//循环体
			i++;//步进语句
		}
		
	}
}
  • do…while循环
/*
do-while循环的标准格式
do {
	循环体
}while (条件判断);

扩格式:
初始化语句
do {
	循环体
	步进表达式
}while(布尔表达式);

先执行一次再执行
*/
public class Demo11Dowhile {
	public static void main(String[] args) {
		int i = 1; //1
		do {
			System.out.println("原谅你啦" + i);
			i++;
		}while (i <= 10);
	}
}
  • 求1到100的偶数和
/*
求出1-100的偶数和
*/
public class Demo12 {
	public static void main(String[] args) {
		int sum = 0;//用来累加的存钱罐
		for (int i = 1; i <= 100; i++) {
			if (i % 2 == 0) {
				sum += i;
			}
		}
		System.out.println("结果是:" + sum);
	}
}
  • 三种循环的区别
  1. 如果条件判断从来没有满足过,那么for循环将会执行0次,但是do-while循环会执行至少一次
  2. for循环的变量在小括内定义,只有循环内部才可以使用,while循环和do_while循环初始化语句本来就在外边,所以出来循环外边也可以使用
  • break关键字的用法有常见的两种:
  1. 可以用在switch语句当中,一旦执行,整个switch语句立刻结束
  2. 还可以用在循环语句当中,一旦执行,整个循环语句立刻结束,打断循环
  • 注意:凡是次数确定的场景多用for.循环,否则多用while循环
public class Demo14Break {
	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			if (i == 4) {
				break;
			}
			System.out.println("Hello" + i);
		}
	}
}
  • 循环控制语句 continue:一旦执行,立刻跳出当前次循环剩余内容,马上开始下一次循环
public class Demo15Continue {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i == 4) {
                continue;
            }
            System.out.println(i + "层到了")
        }
    }
}
  • 开发工具intellij IDEA
  • IDEA常用快捷键
快捷键功能
Alt+Enter导入包,自动修正代码
ctrl+Y删除光标所在行
ctrl+D复制光标所在行的内容,插入光标位置下面
ctrl+Alt+L格式化代码
ctrl+/单行注释,再取消注释
ctrl+shift+/选中代码注释,多行注释,再取消注释
Alt+Insert自动生成代码,toString,get,set等方法
Alt+Shift+上下箭头移动当前代码行
第五章 方法
  • 方法的定义和调用
/*五行20个矩形
定义格式:
public static void 方法名称() {
    方法体
}
调用格式:
方法名称();

注意事项:
1.方法定义的先后顺序无所谓
2.方法定义必须是挨着的,不能在一个方法的内部定义另外一个方法
3. 方法定义之后,自己不会执行,如果希望执行,一定要进行方法的调用

*/
package cn.day01.demo02;

import java.sql.SQLOutput;

//public class Demo01Method {
//    public static void main(String[] args) {
//        for (int j = 0; j < 5; j++) {
//            for (int i = 0; i < 20; i++) {
//                System.out.print("*");
//            }
//            System.out.println();
//        }
//    }
//}

public class Demo01Method {
    public static void main(String[] args) {
        printMethod();
    }
        public static void printMethod() {
            for (int j = 0; j < 5; j++) {
                for (int i = 0; i < 20; i++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }
}
  • 方法的定义格式
package cn.day01.demo02;
/*方法其实就是若干语句的功能集合
定义方法的完整格式:
返回值(产出的):就是从方法中出来的数据
定义方法的完整格式:
修饰符 返回值类型 方法名称(参数类型 参数名称,...) {
    方法体
    return 返回值;
}
修饰符,现阶段的固定写法 public static
返回值类型,也就是方法最终产生的数据结果是什么类型
方法名称:方法的名字,规则和变量一样,小驼峰
参数类型:进入方法的数据是什么类型
参数名称:进入方法的数据对应的变量名称
ps:参数如果有多个,使用逗号进行分割
方法体:方法需要做的事情,若干行代码
return:两个作用,第一停止当前方法,第二将后面的结果数据返回值还给调用处
返回值:也就是方法执行后最终产生的数据结果
注意:return后面的返回值必须和方法前面的返回值类型,保持对应

定义一个两个int数字相加的方法
三要素:
返回值类型:int
方法名称:sum
参数列表:int a; int b;

方法的三种调用格式:
1.单独调用:方法名称
2.打印调用:System.out.println(方法名称(参数))
3.赋值调用:数据类型 变量名称 = 方法名称(参数);
注意:此前学习的方法,返回值类型固定写为void,这个方法只能够单独调用,不能进行打印调用和赋值调用
* */
public class Demo02MethodDefine {
    public static void main(String[] args) {
        //单独调用
        sum(10, 20);
        //打印调用
        System.out.println(sum(10,20));

        //赋值调用
        int number = sum(15, 25);
        System.out.println("变量的值:" + number);
    }
    public static int sum(int a, int b) {
        int result = a + b;
        return result;
    }
  • 有参数无参数方法
package cn.day01.demo02;
/*
有参数:小括号当中有内容,当一个方法需要一些数据条件,才能完成任务,就是有参数
例如两个数字相加,必须知道两个数字各自是多少
无参数:小括号当中留空,一个方法不需要任何数据条件,自己就能独立完成条件,就是元参数
例如定义一个方法,打印固定10次HelloWorld
*/

import java.sql.SQLOutput;

public class Demo03MethodParam {
    public static void main(String[] args) {
        method(10,20);
        method2();
    }
    //两个数字相乘
    //有参数
    public static void method(int a, int b) {
        int result = a + b;
        System.out.println("结果是:" + result);

    }
    //打印输出固定10次字符串
    public static void method2() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Hello,World!" + i);
        }
    }

}

package cn.day01.demo02;
/*
题目要求:定义一个方法,用来求出两个数字之和
题目变形:定义一个方法,用来打印两个数字之和
注意事项:
对于有返回值的方法,可以使用单独调用、打印调用或者赋值调用
但是对于无返回值方法,只能使用单独调用,不能使用打印调用或者赋值调用
*/

public class Demo04MethodReturn {
    public static void main(String[] args) {
        //main方法,负责调用
        int num = getSum(10,20);
        System.out.println("返回值是:" + num);
        System.out.println("=====");
        printSum(100,200);
        System.out.println(getSum(2,3));//打印调用
        getSum(3,5);//单独调用
        //d对于void没有返回值的方法,。只能单独调用,不能打打印或者赋值调用
    }
    public static int getSum(int a, int b) {
        int result = a + b;
        return result;
    }
    public static void printSum(int a, int b) {
        int result = a + b;
        System.out.println("结果是:" + result);
    }
}
  • 方法练习1
package cn.day01.demo02;
/*
题目要求:
定义一个方法:用来判断两个数字是否相同
三要素:
返回值类型:boolean
方法名称:isSame
参数列表:int a, int b
*/
public class Demo01MethodSame {
    public static void main(String[] args) {
        System.out.println(isSame(10,20));
    }
    public static boolean isSame(int a, int b) {
        // 4
//        boolean same;
      /*  if (a == b) {
            same = true;
        } else {
            same = false;
        }*/
        // 1 
//      boolean same = a == b ? true : false;
        // 2 
//        boolean same = a == b;
//        return same;
        // 3
        return a == b;
    }
}
  • 方法练习2
package cn.day01.demo02;
/*
题目要求:
定义一个方法,用来求出1到100之间所有的数字和值
*/

public class Demo02MethodSum {
    public static void main(String[] args) {
        //打印调用
        System.out.println("结果是:" + getSum());
    }
    /*
    三要素
    返回值:有返回值,计算结果是int
    方法名称:getSum
    参数列表:数据范围已经确定,所以不需要参数
    */
    public static int getSum() {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum += 1;
        }
        return sum;
    }
}

  • 方法练习3
package cn.day01.demo02;
/*
题目要求:
定义一个方法,用来打印指定次数的Helloworld
*/
public class Demo03MethodPrint {
    public static void main(String[] args) {
        printCount(5);
    }
    /*
    三要素
    返回值类型,只是进行一大堆打印操作,没有计算,,也没有结果要dayin
    方法名称:printCount
    参数列表:到底要打印多少次,次数:int
    */
    public static void printCount(int num) {
        for (int i = 0; i < num; i++) {
            System.out.println("Hello,World!" + (i + 1));
        }
    }
}

  • 使用方法的时候,注意事项
  1. 方法应该定义在类当中,但是不能再方法中再定义方法,不能嵌套
  2. 方法定义的前后顺序无所谓
  3. 方法定义之后不会执行,如果希望执行,一定要调用,单独调用、打印调用、赋值调用
  4. 如果方法有返回值,那么必须写上return返回值,不能没有
  5. return后面的返回值数据,必须和方法的返回值类型,对应起来
  6. 对于一个void没有返回值的方法,不能写return后面的返回值,只能写returnz自己
  7. 对应方法当中最后一行的return可以省略不写
  8. 一个方法当中可以有多个return语句,但是必须保证同时只有一个被执行到,两个return不能连写
package cn.day01.demo02;

public class Demo04MethodNotice {
    public static int Method() {
        return 10;
    }
    public static void method2() {
//        return 10;错误的写法,方法没有返回值,return后面就不能写返回值
        return;//没有返回值,只是结束方法的执行而已
    }
    public static void method3() {
        System.out.println("AAA");
        return;//最后一行的return可以省略不写,有返回值必须要写
    }
    public static int getMax(int a, int b) {
        int max;
        if (a > b) {
            max = a;
        } else {
            max = b;
        }
        return max;
    }
}

  • 方法重载:方法的重载(Overload),多个方法的名称一样,但是参数不一样
  • 好处:只需要记住唯一一个方法名称,就可以实现类型的多个功能
  • 方法重载与下列因素相关
  1. 参数个数不同
  2. 参数类型不同
  3. 参数的多类型顺序不同
  • 方法重载与下列因素无关
  1. 与参数的名称无关
  2. 与方法的返回值类型无关
package cn.day01.demo02;

public class Demo05MethodOverload {
    public static void main(String[] args) {
        System.out.println(sum(10,20));//两个参数的方法
        System.out.println(sum(10,20, 30));//三参数的方法
    }
    public static int sum(int a, int b) {
        return a + b;
    }
    public static int sum(int a, int b, int c) {
        return a + b + c;
    }
}
  • 重载方法练习
//比较两个数值大小
package cn.day01.demo02;

public class Demo02MethodOverloadSame {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        System.out.println(isSame(a, b));
        System.out.println(isSame((short) a, (short) b));
        System.out.println(isSame(11,20));
        System.out.println(isSame(10L, 20L));
        
    }
    public static boolean isSame(byte a, byte b) {
        System.out.println("两个byte参数的方法执行");
        boolean same;
        if (a == b) {
            same = true;
        } else {
            same = false;
        }
        return same;
    }
    public static boolean isSame(short a, short b) {
        System.out.println("两个short参数的方法执行");
        boolean same = a == b ? true:false;
        return same;
    }
    public static boolean isSame(int a, int b) {
        System.out.println("两个int参数的方法执行");
        return a == b;
    }
    public static boolean isSame(long a, long b) {
        System.out.println("两个long参数的方法执行");
        if (a == b) {
            return true;
        } else {
            return false;
        }
    }
}
  • 在调用输出语句的时候,println方法其实就是进行了多种数据类型的重载形式
package cn.day01.demo02;

public class Demo04OverloadPrint {
    public static void main(String[] args) {
        myPrint(100);
        myPrint(100);
    }
    public static void myPrint(byte num) {
        System.out.println(num);
    }
    public static void myPrint(short num) {
        System.out.println(num);
    }
    public static void myPrint(int num) {
        System.out.println(num);
    }public static void myPrint(long num) {
        System.out.println(num);
    }public static void myPrint(float num) {
        System.out.println(num);
    }public static void myPrint(double num) {
        System.out.println(num);
    }
    public static void myPrint(boolean is) {
        System.out.println(is);
    }
    public static void myPrint(String num) {
        System.out.println(num);
    }
}
  • 第五章 数组的概念
  • 数组:数组是一种容器,可以同时存放多个数据值
  • 特点:
    • 数组是一种引用数据类型
    • 数组当中的多个数据,类型必须统一
    • 数组的长度在程序运行期间不可改变
  • 数组的初始化方式:
  1. 动态初始化(指定长度)
    • 在创建数组的时候,直接指定数据当中的数据元素个数
    • 动态初始化数组的格式:
    • 数据类型[] 数据名称 = new 数据类型[数据长度];
    • 左侧数据类型:也就是数组当中保存的数据,全都是统一的数据类型
    • 左侧的括号,代表我是一个数组
    • 左侧数据名称,给数组取一个名字
    • 右侧数据类型,必须和左侧数据类型保持一致
    • 右侧中括号的长度,也就是数组中,到底可以保存多少个数据,是一个int数字
  2. 静态初始化(指定内容)
    • 在创建数组的时候,不直接指定数据个数的多少,而是直接将具体的数据内容进行指定
  • 静态初始化基本格式
    • 数据类型[] 数组名称 = new 数据类型 [] {元素1, 元素2,…}
  • 注意事项:虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出长度
  • 静态初始化标准格式可以拆分成两个步骤
  • 使用建议:如果不确定数据当中的具体内容,使用动态初始化,否则,用静态初始化
//动态初始化数组
public class Demo01Array {
    public static void main(String[] args) {
        int[] arrayA = new int[300];
        double[] arrayB = new double[10];
        String[] arrayC = new String[5];
    }
}
//静态初始化
public class Demo01Array {
    public static void main(String[] args) {
        int[] arrayA = new int[] {5, 15, 25};
        String[] arrayB = new String[] {"Hello", "World", "Java"}
    }
}
//静态初始化省略格式
public class Demo01Array {
    public static void main(String[] args) {
        int[] arrayA;
        int[] arrayA = new int[] {10, 20, 30}
        String[] arrayB = {"Hello", "World", "Java"}
    }
}
  • 数据元素获取
  • 直接打印数组名称,得到的是数组对应的:内存地址哈希值
  • 访问数组元素的格式:数组的名称[索引值]
  • 索引值:就是一个int数字,代表数组当中元素的编号
  • 索引值从0开始,一直到“数组的长度-1”为止
//静态初始化下访问数组元素
public class Demo04ArrayUse {
    public static void main(String[] args) {
        int[] array = {10, 20, 30};
        System.out.println(array[0]);
    }
}
//动态初始化数组访问
//使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值,规则如下
如果是整数类型,默认值0
如果是浮点类型,默认值0.0
如果是字符类型,默认值\u0000
如果是布尔类型,默认值false
如果是引用类型,默认值null
注意事项:静态初始化其实也有默认值,只不过系统马上将默认值替换成为了大括号当中的具体数值
public class Demo04ArrayUse {
    public static void main(String[] args) {
        int[] array = new int[3];
        System.out.println(array);//内存地址值
        System.out.println(array[0]);//0
        System.out.println(array[1]);//0
        System.out.println(array[2]);//0
        //将数据123数值赋值给array当中的一号元素
        array[1] = 123
        System.out.println(array[1]);//123
    }
}
  • Java内存划分
  1. 栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈当中
    • 局部变量:方法的参数或者是方法{}内存的变量
    • 作用域:一旦超出作用域,立刻从栈内存当中消失
  2. 堆 (Heap): 凡是new出来的东西,都在堆里面,堆内存里面的都系都有一个地址值:16进制
    • 堆内存里面的数据都有默认值,规则
    • 如果是整数,默认值0
    • 如果是浮点数,默认值0.0
    • 如果是字符 默认’\u0000’
    • 如果是布尔 false
    • 如果是引用类型,null
  3. 方法区(Method Area):存储.class相关信息,包含方法的信息
  4. 本地方法栈(Native Method Stack):与操作系统相关
  5. 寄存器(pc Register):与CPU相关
    在这里插入图片描述
  • 数组越界异常:如果访问数组元素的时候,索引编号并不存在,那么将会发生数组索引越界异常:ArrayIndexOutOfBoundsException
  • 空指针异常:数据必须进行new初始化才能使用其中的元素,如果只是赋值了一个null,没有进行new创建,那么将会发生控制住异常nullPointerException
  • 获取数组的长度,格式:数组名称.length,将会得到一个int数字,代表数组的长度
  • 数组一旦创建,程序运行期间,长度不可改变
public class Demo04ArrayUse {
    public static void main(String[] args) {
        int[] arrayA = {10, 20, 30};
        int len = arrayA.length;
        System.out.println(len);
        int[] arrayC = new int[3];
        System.out.println(arrayC.length);
        arrayC = new int[5];
        System.out.println(arrayC.length);
        
    }
}

  • 练习 求数组最值
//求数组最大值
public class Demo06ArrayMax {
    public static void main(String[] args) {
        int[] array = {5, 10, 15, 12, 35, 85};
        int max = array[0];
        for (int i =1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        System.out.println(max);
    }
}
  • 数组元素反转
public class Demo07ArrayReverse {
    public static void main(String[] args) {
        int[] array = {10,20,30,40,50};
        for (int min = 0, max = array.length - 1; min < max; min++, max--) {
            int temp = array[min];
            array[min] = array[max];
            array[max] = temp;
        }
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

}
  • 数组作为方法参数
    • 当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值
public class demo01ArrayParam {
    public static void main(String[] args) {
        int[] array = {10, 20, 30, 50};
        printArray(array);
    }
    //任何数据类型都可以作为方法的参数
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}
  • 数组作为方法的返回值
package cn.day01.demo02;
// 一个方法可以有0,1,2多个返回值,但是只能有0或者1个返回值,不能有多个返回值
//如果希望一个方法中产生多个结果数据进行返回,使用一个数组作为返回值即可
//数组作为方法的参数,传递进去的其实是数组的地址值
//数组作为方法的返回值,返回的其实也是数组的地址值
public class Demo02ArrayReturn {
    public static void main(String[] args) {
        int[] result = calculate(10, 20, 30);
        System.out.println(result[0]);
        System.out.println(result[1]);

    }
    public static int[] calculate(int a, int b, int c) {
        int sum = a + b + c;
        int avg = sum / 3;
        /*
        int[] array = new int[2];
        array[0] = sum;
        array[1] = avg;

         */
        int[] array = { sum, avg};
        return array;
    }
}
第五章 面向对象
  • 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节
  • 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人来帮我做事儿
package cn.day01.demo02;
import java.util.Arrays;

public class Demo01PrintArray {
    public static void main(String[] args) {
        int[] array = {10, 20, 30, 50};
        // 要求打印格式为: [10, 20, 30, 50]
        // 使用面向过程,每一个步骤细节都要亲力亲为
        System.out.print("[");
        for (int i = 0; i < array.length; i++) {
            if (i == array.length - 1) {//如果是最后一个元素
                System.out.println(array[i] + "]");
            } else { //如果不是最后一个元素
                System.out.print(array[i] + ",");
            }
        }
        System.out.println("========");
        // 面向对象
        // 找一个JDK给我们提供好的Arrays类
        // 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));
    }
}
  • 面向对象语言中,三大基本特征
    • 封装
    • 继承
    • 多态
  • 类:是一组相关属性和行为的集合,可以看成一类事物的模板,使用事物的属性特征和行为特征来描述该类书事物
  • 属性:就是该事物的状态信息
  • 行为:就是该事物能够做什么
  • 对象:是一类事物的具体表现。对象是类的一个实例,必然具备该类事物的属性和行为
  • 定义一个类,用来模拟学生事物,其中有两个组成部分
    • 属性
      • 姓名
      • 年龄
    • 行为
      • 吃饭
      • 睡觉
      • 学习
  • 对应到java的类当中:
    • String name;
    • int age;
  • 成员方法(行为):
    • public void eat() {}
    • public void sleep() {}
    • public void study() {}
public class Student {
    //成员变量
    String name;
    int age;
    public void eat() {
        System.out.println("");
    }
    public void sleep() {
        System.out.println("");
    }
    public void study() {
        System.out.println("");
    }
}
  • 注意事项:
    • 成员变量是直接定义在类当中的,在方法外边
    • 成员方法不要写static关键字
  • 通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用
  • 导包:也就是指出需要使用的类,在什么位置:import 包名称.类名称
  • 创建 格式:类名称.对象名称 = new 类名称();
  • 使用,分为两种情况
    • 使用成员变量,对象名.成员变量名
    • 使用成员方法,对象名.成员方法名(参数)
  • 注意事项:如果成员变量没有进行赋值,那么将会有一个默认值、规则和数组一样
  • 两个引用指向同一个对象
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 成员变量和局部变量的区别
package cn.day01.demo02;
/*局部变量和成员变量
1. 定义的位置不一样
局部变量,在方法的内部
成员变量,在方法的外部,直接写在类当中

2. 作用范围不一样
局部变量:只有方法当中才可以使用,出了方法就不能再用
成员变量:整个类全都可以通用

3. 默认值不一样
局部变量:没有默认值,如果要想使用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,规则和数组一样

4. 内存的位置不一样
局部变量,位于栈内存成员变量,
成员变量,位于堆内存
5. 生命周期不一样
局部变量,随着方法进栈而诞生,随着方法出栈而消失
成员变量,随着对象创建而诞生,随着对象被垃圾回收而消失
*/
public class demo03 {
    String name; // 成员变量
    public void methodA() {
        int num = 20; // 局部变量
        System.out.println(num);
        System.out.println(name);
    }
    public void methodB(int param) {// 方法的参数就是局部变量
        // 参数在方法调用的时候,必然会被赋值的
        System.out.println(param);
        int age;
        // System.out.println(age); 局部变量无默认值
        //System.out.println(num); // 错误写法
        System.out.println(name);
    }
}

  • 面向对象的三大特征
package cn.day01.demo02;
// ,面向对象三大特征:封装、继承、多态
//封装性在java当中的体现
/*1. 方法就是一种封装
2. 关键字private也是一种封装
封装就是将一些细节信息隐藏起来,对于外界不可见
*/

public class Demo02Method {
    public static void main(String[] args) {
        int[] array = {5, 10, 15, 25};
        int max = getMax(array);
        System.out.println(max);
    }
    public static int getMax(int[] array) {
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }
}

  • private关键字使用及作用
package cn.day01.demo02;
/*对于基本类型当中的boolean值,Getter方法一定要写成isXxx的形式,而setXxx规则不变*/

public class Student {
    private String name; //
    private int age;
    private  boolean male;
    public void setMale(boolean b) {
        male = b;
    }
    public boolean isMale() {
        return male;
    }

    public void setName(String str) {
        name = str;
    }
    public String getName() {
        return name;
    }
    public void setAge(int num) {
        age = num;
    }
    public int getAge() {
        return age;
    }
}

package cn.day01.demo02;

public class Demo04Student {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("鹿晗");
        stu.setAge(20);
        stu.setMale(true);

        System.out.println(stu.getName());
        System.out.println(stu.getAge());
        System.out.println(stu.isMale());
    }
}
  • this关键字
package cn.day01.demo02;
// 当方法的局部变量和类的成员变量重名的时候,根据“就近原则",优先使用局部变量
// 如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
// 通过谁调用的方法,谁就是this
public class Person {
    String name; // 成员变量
    public void sayHello(String name) {
        System.out.println(name + ",你好,我是" + this.name);
        System.out.println(this);
    }
}


package cn.day01.demo02;

public class Demo01Person {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "马云";
        person.sayHello("马化腾");
        System.out.println(person); // 地址值
    }
}

  • 构造方法:是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
  • 格式:public 类名称(参数类型 参数名称){
    方法体
    }
  • 注意事项:
    • 构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
    • 构造方法不要写返回值类型,连void都不写
    • 构造方法不能return一个返回值
    • 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做 public Student() {}
    • 一旦编写了至少一个构造方法,那么编译器将不再赠送
    • 构造方法也是可以进行重载的 重载:方法名称相同,参数列表不同
package cn.day01.demo02;

public class One {
    //成员变量
    private String name;
    private int age;
    public One() {
        System.out.println("构造方法执行啦!");
    }
    public One(String name, int age) {
        System.out.println("全参构造方法执行啦!");
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}

package cn.day01.demo02;

public class Two {
    public static void main(String[] args) {
        One one = new One(); // 无参构造
        One two = new One("赵丽颖", 20); // 全参构造
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge());
    }
}

  • 定义一个标准的类
package cn.day01.demo02;
// 一个标准的类通常要满足拥有下面四个组成部分
/*所有的成员变量都要使用private关键字修饰
2.为每一个成员变量编写一对儿Getter/Setter方法
3.编写一个无参数的构造方法
4.编写一个全参数的构造方法 85+

标准的类也叫java Bean
* */
public class StudentOne {
    private String name;
    private int age;

    public StudentOne(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public StudentOne() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值