方法
- Java里边叫方法,其实就是函数;自己编写一个函数定义好函数名,之后可以重复调用。
- 为什么要有方法?
觉得可以从重复性上来理解,段从程序需要重复使用,为了简洁高效,使用方法,只需调用方法,使得程序简洁高效; - 格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 …){
方法体;
return 返回值;
}
(1): 修饰符 比较多,后面会详细介绍。目前使用 public static
(2): 返回值类型 用于限定返回值的数据类型
(3): 方法名 就是一个名称,它的存在是为了方便我们调用方法
(4): 参数类型 限定调用方法时传入参数的数据类型
(5): 参数名 是一个变量,接收调用方法时传入的参数
这个参数其实有一个专业的名词,被称之为形式参数,它的作用是用来接收实际参数的.
(6): 方法体 完成功能的代码
(7): return 结束方法以及返回方法指定类型的值
(8): 返回值 就是功能的结果,由return带回,带回给调用者
案例
案例一:
package org.westos.demo2;
public class MyTest {
public static void main(String[] args) {
System.out.println("abc");
//直接调用我们自己定义的方法
fashe();
fashe();
fashe();
fashe();
fashe();
fashe();
fashe();
}
public static void fashe(){
//方法体,你具体要实现的功能
System.out.println("发射炮弹");
}
}
注意:
- 主方法,是一个程序的入口。主方法是JVM来调用的,一个类中只能有一个主方法
- 方法:就是对一段功能逻辑的封装,以实现重复调用。
- 方法定义在类中,方法跟方法是平级关系,不能嵌套定义
- 方法不调用不执行
案例二:
package org.westos.demo2;
public class MyTest2 {
public static void main(String[] args) {
//show();
//show();
int num = add2();
System.out.println(num);
}
//void 无明确反回值类型
public static void show() {
System.out.println("微微一笑,很倾城");
}
//定义一个相加的功能
public static void add() {
System.out.println(1 + 1);
}
//我明确了这个方法的返回值类型是int类型
//如果一个方法一旦明确了返回值类型,必须由 return 带回一个 与明确了类型一致的结果
public static int add2() {
int sum = 1 + 1;
return sum; //return 结束方法,并带回一个结果
}
}
注意
- void无明确返回值类型
- 如果一个方法一旦明确了返回值类型,必须由 return 带回一个 与明确了类型一致的结果;
案例三:
package org.westos.demo2;
public class MyTest3 {
public static void main(String[] args) {
System.out.println("主方法");
int r= add(1,2);//当我们去调用一个有参数的方法时,必须传入与之相对应的参数(参数个数要对应,数据类型要对应)
int aa=10;
int bb=20;
//当我们在调用方法时,传入的参数,叫做实际参数,简称实参,传常量,变量都可以
int r2 =add(aa,bb);
System.out.println(r);
System.out.println(r2);
}
//定义方法括号里面的参数,叫做形式参数,简称形参。
//形参的作用是,调用方法时,接收传过来的实参
//多个形参你用逗号隔开
public static int add(int a1,int b1){
System.out.println("add方法执行了");
int sum=a1+b1;
return sum ;
}
}
案例四:
package org.westos.demo2;
public class MyTest4 {
public static void main(String[] args) {
show();
int r=show2();
System.out.println(r);
//如果一个方法有返回值,我们可以输出调用,打印返回的结果
System.out.println(show2());
}
public static void show(){
System.out.println("我在人民广场,吃着炸鸡");
return; //结束方法 如果一个方法的返回值类型,是void 那么这个return 可以省略
}
public static int show2() {
return 100; //结束方法 如果一个方法的返回值类型,是void 那么这个return 可以省略
}
}
注意
- return功能是结束方法并且返回函数值;
- 对于返回的函数值,如果函数定义为void则为无明确返回值类型,return可以省略;
案例五:
需求:获取两个数中最大的数
package org.westos.demo3;
import java.util.Scanner;
public class MyTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个整数");
int num1 = scanner.nextInt();
System.out.println("请输入第二个整数");
int num2 = scanner.nextInt();
int max = getMax(num1, num2);
System.out.println("最大值是" + max);
}
public static int getMax(int a, int b) {
int max = a > b ? a : b;
return max;
}
}
注意
(IntelliJ idea_64)
- alt+enter 万能纠错键
- ctrl+alt+v 自动补全
- alt+enter 选第一项也会补全
案例六:
需求:输入两个值判断是否相等
package org.westos.demo3;
import java.util.Scanner;
public class MyTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数字");
int num1 = sc.nextInt();
System.out.println("请输入第二个数字");
int num2 = sc.nextInt();
//获取,输出 是两个概念
boolean flag = isEquals(num1, num2); //调用方法
if (flag) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
}
public static boolean isEquals(int a, int b) {
boolean flag = false;
if (a == b) {
flag = true;
} else {
flag = false;
}
return flag;
}
}
方法使用注意事项
- 方法不调用不执行
- 方法与方法是平级关系,不能嵌套定义
- 方法定义的时候参数之间用逗号隔开
- 方法调用的时候不用在传递数据类型
- 如果方法有明确的返回值,一定要由return带回一个值
案例七:
方法调用之新型输出
需求:根据键盘录入的数据输出对应的乘法表
package org.westos.demo3;
import java.util.Scanner;
public class MyTest3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个行数");
int i = sc.nextInt();
//调用方法
showChengFaBiao(i);
}
public static void showChengFaBiao(int a) {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (j * i) + "\t");
}
System.out.println();
}
}
}
注意“\t”为空一个tab距离
案例八:
需求:输入行列数并打印出指定行列的*阵
package org.westos.demo3;
import java.util.Scanner;
public class MyTest4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入行数");
int num= scanner.nextInt();
System.out.println("请输入列数");
int num2 = scanner.nextInt();
showStar(num,num2);
}
private static void showStar(int num, int num2) {
for (int i = 0; i <= num; i++) {
for (int i1 = 0; i1 <= num2; i++) {
System.out.print("*");
}
System.out.println();
}
}
}
方法的重载和基本使用
- 在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同,与返回值无关。
参数列表不同:
A:参数个数不同
B:参数类型不同
案例九:
package org.westos.demo4;
public class MyTest {
public static void main(String[] args) {
//求和案例
//2 个整数
//3 个整数
//4 个整数
int sum1=add1(1,2);
int sum2 = add2(1, 2,3);
int sum3 = add3(1, 2,3,4);
System.out.println(sum1);
System.out.println(sum2);
System.out.println(sum3);
}
private static int add(int i, int i1) {
System.out.println("两个int参数方法调用了");
return i + i1;
}
/**private static double add(int i, double i1) {
System.out.println("一个int 一个double调用了");
return i + i1;
}*/
private static int add(int i, int i1, int i2, int i3) {
return i + i1 + i2 + i3;
}
private static int add(int i, int i1, int i2) {
return i + i1 + i2;
}
}
注意
- 方法重载:允许一个类中,可以出现多个同名方法,只要他们的参数个数不同,或者参数类型不同,就构成重载,不拿返回值类型来区分
数组
- 数组的作用
现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,
用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。
为了解决这种问题,Java就提供了数组供我们使用
结论:
数组是存储多个变量(元素)的东西(容器)
这多个变量的数据类型要一致 - 数组定义:
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。 - 数组定义格式
格式1: 数据类型[] 数组名;
格式2: 数据类型 数组名[];
举例:
int[] a; 定义了一个int类型的数组a;
int a[]; 定义了一个int类型的a数组;
推荐使用第一种定义方式
数组初始化
- 为什么要初始化
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。 - 初始化分类:
a:动态初始化: 只指定长度,由系统给出初始化值
b:静态初始化: 给出初始化值,由系统决定长度
注意事项: 这两种方式,只能使用一种,不能进行动静结合 - 动态初始化格式:
数据类型[] 数组名 = new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。
举例: int[] arr = new int[3]; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值。
案例
package org.westos.demo2;
public class ArrayDemo {
public static void main(String[] args) {
//方式1:
//创建一个int类型的数组
int[] arr=new int[10];
//往数组中放入数据 通过数组的索引往里面存数据
arr[0]=10;
arr[1]=20;
arr[2]=30;
//取数组中的元素
int num=arr[2];
System.out.println(num);
System.out.println(arr[4]);
System.out.println(arr[5]);
//语法2
boolean bs[]=new boolean[2];
bs[0]=true;
System.out.println(bs[0]);
System.out.println(bs[1]);
}
}
注意
- 动态的定义方式,由我们规定数组的长度,由系统赋默认值
- 当我们创建好了数组后,系统会给分配索引(角标)从0开始(默认赋值)
Java中的内存分配以及栈和堆的区别
A:栈: 存放的是局部变量
局部变量:在方法定义中或者方法声明上的变量都是局部变量。
B:堆: 存放的是所有new出来的东西
特点:
a: 每一个new出来的东西都会为其分配一个地址值。
b: 每一个变量都有一个默认的值
byte,short,int,long – 0
float,double – 0.0
char – ‘\u0000’
boolean – false
引用数据类型 – null
c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收
C:方法区
案例
案例一;
package org.westos.demo3;
public class ArrayDemo {
public static void main(String[] args) {
double[] arr = new double[10]; //动态初始化
System.out.println(arr[0]);
System.out.println(arr[9]);
}
}
总结:由结果我们可以看出动态初始化:为数组中的数组元素分配内存空间,并为每个数组元素赋值默认值为0;
案例二:
package org.westos.demo4;
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arr1 = new int[3];
arr1[0]=10;
arr1[2]=200;
int[] arr2 = new int[3];
arr2[0]=11;
arr2[1]=19;
int[] arr3=arr1;
arr3[0]=108;
arr3[1]=106;
arr1[1]=177;
System.out.println(arr1[0]); // 108
System.out.println(arr1[1]); // 177
System.out.println(arr1[2]); // 200
System.out.println(arr2[0]); // 11
System.out.println(arr2[1]); // 19
System.out.println(arr2[2]); // 0
System.out.println(arr3[0]); // 108
System.out.println(arr3[1]); // 177
System.out.println(arr3[2]); // 200
}
}
注意
通过输出值我们可以理解数组栈、堆、方法区及内存分配过程。
数组操作的两个常见小问题越界和空指针
- a:ArrayIndexOutOfBoundsException:数组索引越界异常
原因:你访问了不存在的索引。 - b:NullPointerException:空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
案例
案例一:
package org.westos.demo5;
public class ArrayDemo {
public static void main(String[] args) {
//数组静态初始化,由我们赋值,由系统计算长度
//数组一旦定义号,长度就固定了
int[] arr = new int[]{10, 20, 30};
boolean[] arr2 = new boolean[]{true, false, true, true};
char[] arr3 = new char[]{'a', 100, 'b'};
byte[] bytes = new byte[]{127, 100, 0, -128};
long[] longs = new long[]{1L, 100L};
float[] floats = new float[]{1F, 2.9F};
//静态初始化的简写方式
int[] arr6 = {10, 20, 30};
//数组有一个长度属性
int length = arr.length;
System.out.println(length);
int length1 = arr2.length;
System.out.println(length1);
// 数组中最后一个元素的索引=数组长度-1;
int num=bytes[bytes.length-1];
System.out.println(num);
//关于数组的一些一异常
arr[3]=100;
// System.out.println(arr[3]); //ArrayIndexOutOfBoundsException 数组角标越界异常
}
}
案例二:
package org.westos.demo5;
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arr = new int[]{10, 20};
arr = null;// 人为置空
//NullPointerException 空指针异常
int length = arr.length;
System.out.println(length);
}
}
数组的遍历
案例一:
package org.westos.demo6;
public class ArrayDemo {
public static void main(String[] args) {
int[] arr={10,20,50,40,102};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("---------------------------");
//反向遍历
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
}
}
案例二:
求数组中元素极值
package org.westos.demo6;
public class ArrayDemo2 {
public static void main(String[] args) {
//获取数组中的最大值或最小值
int[] arr = {10, 20, 50, 40, 102};
int max = getMax(arr);
System.out.println("最大值是" + max);
int[] arr2 = {10, 20, 50, 40, 102,1000,1};
int max1 = getMax(arr2);
System.out.println("最大值是" + max1);
}
public static int getMax(int[] arr){
//定义一个参照值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}
案例三:
数组元素反转
package org.westos.demo6;
public class ArrayDemo3 {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50}; //50 40 30 20 10
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
//reverseArray(arr);
showArray(arr);
}
//数组元素反转
private static void reverseArray(int[] arr) {
//分析:首尾元素值交换,遍历一半
for (int i = 0; i < arr.length / 2; i++) {
//采用中间变量进行值交换
int t = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = t;
}
}
private static void showArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ",");
}
}
}
案例四:
需求:根据键盘录入索引, 查找对应星期
package org.westos.demo7;
import java.util.Scanner;
public class ArrayDemo8 {
public static void main(String[] args) {
String[] arr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数 1----7");
int index = scanner.nextInt();
String str = getElementByArray(index, arr);
System.out.println(str);
}
private static String getElementByArray(int index, String[] arr) {
if (index >= 1 && index <= 7) {
return arr[index - 1];
} else {
return "查无此元素";
}
}
}
案例五:
根据元素查索引
package org.westos.demo7;
import java.util.Scanner;
public class ArrayDemo9 {
public static void main(String[] args) {
String[] arr = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个星期");
String str = scanner.nextLine();//获取用户输入的字符串
int index = getIndex(str, arr);
System.out.println("该元素的索引是" + index);
}
private static int getIndex(String str, String[] arr) {
//遍历数组
for (int i = 0; i < arr.length; i++) {
if (str.equals(arr[i])) {
return i;
}
}
return -1; // 一般喜欢用 -1 代表没找到
}
}