java学习笔记53-93: Idea中的java基本语法和小案例

前言
b站java课程学习笔记整理。
b站视频: 黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程
53. Idea安装
略
54. Idea中的hello world
54.1 初始化
Create new project
- Empty project
- next
- 取名然后finish
- ok
- Modules
- +
- new module
- Java
- 选JDK路径 - 命名- finish
- ok
54.2 流程
src
中选中src
邮件新建package
- 输入包的名称 - 选中包右键-新建一个类HelloWorld
- 写Helloworld
代码 - 右键 run
55. Idea中的项目结构
项目 - 模块 - 包 - 类
56. Idea中的快捷键
热键 | 作用 |
---|---|
psvm |
快速生成main方法 |
sout |
快速生成输出语句 |
Ctrl+ Alt+ 空格 |
内容提示,代码补全 |
Ctrl+ / |
单行注释 |
Ctrl+ Shift+ / |
多行注释 |
Ctrl+ Alt+ L |
缩进格式化,最后代码变得美观 |
57. Idea中的模块操作
File
- Project structure
- Modules
- 新建就行了。删除直接右键 Remove
。
导入模块: File
- Project structure
- Modules
- import module
- 选择模块名称 ok
58. 数组定义格式
要存储的数据都是同类型的大量数据,这种情况下用数组存储。
58.1 数组的定义格式
格式如下:
int[] arr //定义了一个int数组,名为arr
int arr[] //定义了一个int变量,为arr数组
59. 数组初始化之动态初始化
Java中的数组必须先初始化,然后才能使用。所谓的初始化就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
动态初始化:初始化时指定数组长度,由系统分配数组初始值。 格式如下:
int[] arr = new int[3]; // 数据类型[]变量名 = new 数据类型[数组长度];
new
表示为数组申请内存空间。
60. 数组元素访问
数组名[索引]
, 索引是从零开始,连续的整数。
61. 内存分配
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分。因为没一片区域都有特定的处理数据方式和内存管理方式。
左边是栈内存,右边是堆内存。左边存储局部变量,右边存储new
出来的对象。
62. 单个数组内存图
63. 多个数组内存图
64. 多个数组指向相同的内存图
首先,new
生成了一个数组地址,并把这个地址赋值给了arr
。然后,把arr
赋值给了arr2
,也就是说arr2
的地址和arr
的地址相同,所以改变arr2[0]
的值,arr[0]
也会变。
65. 数组初始化之静态初始化
静态初始化: 初始化时指定每个数组元素的初始值,由系统决定长度。
格式如下:
//数据类型[]变量名 = new 数据类型[]{数据1,数据2,数据3, ...};
int[] arr = new int[]{1, 2, 3};
// 简化格式(虽然省略了new但是new的操作还是存在的。)
// 数据类型[]变量名 = {数据1,数据2,数据3, ...};
int[] arr = {1, 2, 3};
66. 数组操作中两个常见小问题
66.1 索引越界
填错了索引。
66.2 空指针异常
arr
的地址错误。
67. 遍历
用循环。 数组名.length
可以获取数组元素的数量。
通用格式:
public class bianli {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 0; i < arr.length; i++){
System.out.println("第"+(i+1)+"个元素是"+arr[i]);
}
}
}
68. 获取最值
public class zuizhi {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 0, 5, 6, 77, 8, 9};
int temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
System.out.println("最大值为" + temp);
}
}
69. 方法概述
其实就是打包成一个自定义function
, 这就是方法。方法要先定义,后调用。
70. 方法的定义和调用
定义:
public static void 方法名(){
//方法体
}
调用:
方法名();
// 范例:isEvenNumber();
实战,把求最值包装成方法:
public class zuizhi {
public static void main(String[] args) {
maxi();
}
public static void maxi(){
int[] arr = {1, 2, 3, 0, 5, 6, 77, 8, 9};
int temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
System.out.println("最大值为" + temp);
}
}
71. 方法调用过程
先进main
方法,然后发现了maxi()
这个方法,然后进入到maxi()
里面,然后执行maxi()
的内容,执行完后返回main
接着执行。
72. 方法的练习
需求:设计一个方法打印两个数中的较大数。
public class GetMax {
public static void main(String[] args) {
getMax();
}
public static void getMax(){
int a =10;
int b = 20;
if (a>b){
System.out.println(a);
}else {
System.out.println(b);
}
}
}
73. 带参数方法的定义和调用
格式与调用:
// 格式:public static void 方法名 (数据类型 变量名){...}
public static void isEvenNumber (int number){...}
public static void isEvenNumber (int number1, int number2){...}
// 调用:方法名 (参数);
// 常量调用
isEvenNumber(5);
// 变量调用
int number = 5;
isEvenNumber(number);
//多变量调用
getMax(5 , 6);
参数的数量和类型要匹配。
74. 形参和实参
形参:方法中定义的参数。 实参:方法调用时的参数。
75. 带参数方法练习
需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数。
public class exercise {
public static void main(String[] args) {
int a = 10;
int b = 20;
getMax(a, b);
}
public static void getMax(int Num1, int Num2) {
if (Num1 > Num2) {
System.out.println(Num1);
} else {
System.out.println(Num2);
}
}
}
76. 带返回值方法的定义和调用
格式:
// 定义
/* public static 数据类型 方法名(参数){
return 数据
}*/
public class notebook {
// 定义布尔值返回
public static boolean isEvenNumber(int number){
return true;
}
}
// 调用
// 数据类型 变量名 = 方法名(参数);
boolean flag = isEvenNumber(5);
返回时注意返回数据和定义返回值的类型要匹配。返回值要定义一个变量来接受。
77. 带返回值方法的练习
需求:设计一个方法可以获取两个数的较大值,数据来自于参数。
package 带返回值的方法练习;
public class exercise {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(getMax(a, b));
}
public static int getMax(int Num1, int Num2) {
if (Num1 > Num2) {
return Num1;
} else {
return Num2;
}
}
}
78. 方法的注意事项
-
方法不能嵌套定义。方法里面不能定义方法。
-
void
表示无返回值。如果写return
,return
后面不能写东西。 return
表示方法结束了,后面不能写代码。79. 方法的通用格式
通用格式:
/* public static 返回值类型 方法名(参数){ 方法体; return 数据; }*/ // public static 修饰符,目前先记住这个格式。
定义方法时,要做到两个明确:
-
明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写
void
;如果有,写对应的数据类型。 - 明确参数:主要是明确参数的类型和数量。
80. 方法重载
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载:
- 多个方法再同一个类中。
- 多个方法具有相同的方法名。
- 多个方法的参数不相同,类型不同或者数量不同。
注意:
- 重载就看方法名称和参数就行,和返回值与返回值类型无关。
- 重载与方法的调用无关。
项目:定义一个求和的方法,要求方法重载。
package 方法重载;
public class chongzai {
public static void main(String[] args) {
// 调用
int result = sum(10,20,30);
System.out.println(result);
}
// 需求1: 求两个int类型数据和
public static int sum(int num1, int num2){
return num1 + num2;
}
// 需求2: 求两个double类型数据和
public static double sum(double num1, double num2){
return num1 + num2;
}
// 需求3: 求三个int类型数据和
public static int sum(int num1, int num2 , int num3 ){
return num1 + num2 + num3;
}
}
总结:方法重载实际上就是通过合体的方法让方法功能更强大。在调用的时候,java虚拟机会通过参数来区分同名的方法。
81. 方法重载的练习
需求: 使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte
, short
, int
, long
)。
package 方法重载;
public class exercise {
public static void main(String[] args) {
System.out.println(isSame((byte)10, (byte)20));
System.out.println(isSame((short)10, (short)20));
System.out.println(isSame(10, 20));
System.out.println(isSame(10L, 20L));
}
public static boolean isSame(byte a, byte b){
System.out.println("byte:");
return a == b;
}
public static boolean isSame(short a, short b){
System.out.println("boolean:");
return a == b;
}
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:");
return a == b;
}
}
总结: 大转小,要注意使用强转。
82. 方法的参数传递
形参number=200
的改变是在栈中change()的块中进行的,不会影响在栈中实参number = 100
。
83. 方法的参数传递
栈内存中change()
方法通过访问arr[1]
进入堆内存,改变了堆内存中数组的某元素的值。在之后栈内存的main
方法访问这个元素时,元素的值已经发生了改变。
84. 数组遍历
需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如[11,22,33,44,55]
。
小知识:
System.out.println("a"); // 输出,并换行。
System.out.print("a"); // 输出,不换行
System.out.println(); // 直接换行
具体的作业代码:
package 数组遍历;
public class bianli {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
bianli(array);
}
public static void bianli(int[] arr){
System.out.print("[");
for(int i = 0 ; i < arr.length; i++ ){
System.out.print(arr[i]);
if (i != arr.length-1){
System.out.print(",");
}
}
System.out.print("]");
}
}
个人认为思路比老师的简单一点。
85. 案例:数组最大值
需求:设计一个方法用于获取数组中元素的最大值,调用方法并输出结果。
代码:
package 数组最大值;
public class getMax {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 55, 8};
System.out.println(getMax(array));
}
public static int getMax(int[] arr){
int temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
return temp;
}
}
86. Debug使用
-
step into
:单步执行,遇到子函数就进入并且继续单步执行(简而言之,进入子函数); -
step over
:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。有一点,经过我们简单的调试,在不存在子函数的情况下是和step into效果一样的(简而言之,越过子函数,但子函数会执行)。 -
step out
:当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数
(转自单步调试 step into/step out/step over 区别)
87. Debug查看偶数求和
一个小练习,不记了。
88. Debug查看方法调用
如果数据来自键盘输入,输入后debug继续。
89. 减肥计划if版
需求: 输入星期数,显示今天的减肥活动(用if)。
package 减肥计划;
import java.util.Scanner;
public class ifversion {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
ifversion(day);
}
public static void ifversion(int day){
if (day == 1){
System.out.println("跑步");
}else if(day == 2){
System.out.println("游泳");
}else if(day == 3){
System.out.println("慢走");
}else if(day == 4){
System.out.println("动感单车");
}else if(day == 5){
System.out.println("拳击");
}else if(day == 6){
System.out.println("爬山");
}else if(day == 7){
System.out.println("好好吃一顿");
}else{
System.out.println("输入日期有误");
}
}
}
一分钟搞定!
90. 减肥计划switch版
用switch写一遍。
package 减肥计划;
import java.util.Scanner;
public class SwitchVersion {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
SwitchVersion(day);
}
public static void SwitchVersion(int day){
switch (day){
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("输入有误");
}
}
}
快捷键导包: Alt + Enter
91. 逢七过
案例:包含7或者是7的倍数。打印1-100之间需要过的数。
package 逢七过;
public class SevenPass {
public static void main(String[] args) {
SevenPass();
}
public static void SevenPass() {
for (int i = 1; i < 101; i++) {
if (i % 7 == 0 || i % 10 == 7 || i /10 %10 == 7 ){
System.out.println(i);
}
}
}
}
92. 不死神兔
需求:有一对兔子,从出生后第3个月其每个月都生一对兔子,小兔子长到第三个月后又生一对兔子,假如兔子都不死,问第二十个月的兔子的对数是多少?
package 不死神兔;
public class rabbit {
public static void main(String[] args) {
int rabbits = 1;
int result = rabbit(rabbits);
System.out.println("第二十天的兔子数量是" + result);
}
public static int rabbit(int num) {
int[] arr = new int[20];
arr[0] = num;
arr[1] = num;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[19];
}
}
92. 案例:百钱百鸡
案例: 公鸡五块钱,母鸡三块钱,小鸡一块钱三只。如何用一百块钱买一百只鸡?
package 百钱百鸡;
public class chicken {
public static void main(String[] args) {
chicken();
}
public static void chicken() {
for (int x = 0; x <= 20; x++) {
for (int y = 0; y <= 33; y++) {
for (int z = 0; z <= 100; z++) {
if (z % 3 == 0) {
if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100) {
System.out.print(x + ",");
System.out.print(y + ",");
System.out.print(z + ",");
System.out.println();
}
}
}
}
}
}
}
总结:注意去除z不是3倍数的时候!否则z/3会生成错误数。