一、方法
在java中,方法就是用来完成解决某件事情或实现某个功能的办法。
1、语法格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){
执行语句 ……… return 返回值; }
l 修饰符:方法的修饰符比较多,有对访问权限进行限定的,有静态修饰符static,还有最终修饰符final等,这些修饰符在后面的学习过程中会逐步介绍public
l 返回值类型:用于限定方法返回值的数据类型void,与返回值数据类型相同
l 参数类型:用于限定调用方法时传入参数的数据类型
l 参数名:是一个变量,用于接收调用方法时传入的数据
l return关键字:用于结束方法以及返回方法指定类型的值
l 返回值:被return语句返回的值,该值会返回给调用者,只有返回值类型为void时,没有返回值
通过一个图例演示getArea()方法的整个调用过程,如下图所示。
2、方法定义练习
l 无返回值无参数方法,如打印3行,每行3个*号的矩形
public static void printRect(){ //打印3行星 for (int i=0; i<3; i++) { //System.out.println("***"); 相当于是打印3颗星,换行 //每行打印3颗星 for (int j=0; j<3; j++) { System.out.print("*"); // *** } System.out.println(); } }
l 有返回值无参数方法,如键盘录入得到一个整数
public static int getNumber(){ Scanner sc = new Scanner(System.in); int number = sc.nextInt(); return number; }
l 无返回值有参数方法,如打印指定M行,每行N个*号的矩形
public static void printRect2(int m, int n){ //打印M行星 for (int i=0; i<m; i++) { //每行中打印N颗星 for (int j=0; j<n; j++) { System.out.print("*"); } System.out.println(); } }
有返回值有参数方法,如求三个数的平均值
public static double getAvg(double a, double b, double c) { double result = (a+b+c)/3; return result; }
3、方法的重载
Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
条件:方法的,修饰符 返回值类型 方法名,都相同,
只能是参数类型不同、或者参数数量不同、或者参数顺序不同
下面的三个方法互为重载关系:
l public static int add(int x,int y) {逻辑} //两个整数加法
l public static int add(int x,int y,int z) {逻辑} //三个整数加法
l public static int add(double x,double y) {逻辑} //两个小数加法
public class MethodDemo03 { public static void main(String[] args) { // 下面是针对求和方法的调用 int sum1 = add(1, 2); int sum2 = add(1, 2, 3); double sum3 = add(1.2, 2.3); // 下面的代码是打印求和的结果 System.out.println("sum1=" + sum1); System.out.println("sum2=" + sum2); System.out.println("sum3=" + sum3); } // 下面的方法实现了两个整数相加 public static int add(int x, int y) { return x + y; } // 下面的方法实现了三个整数相加 public static int add(int x, int y, int z) { return x + y + z; } // 下面的方法实现了两个小数相加 public static double add(double x, double y) { return x + y; } }
上述代码中定义了三个同名的add()方法,它们的参数个数或类型不同,从而形成了方法的重载。
注意事项:
l 重载方法参数必须不同:
参数个数不同,如method(int x)与method(int x,int y)不同
参数类型不同,如method(int x)与method(double x)不同g
参数顺序不同,如method(int x,double y)与method(double x,int y)不同
l 重载只与方法名与参数类型相关与返回值无关
如void method(int x)与int method(int y)不是方法重载,不能同时存在
l 重载与具体的变量标识符无关
如method(int x)与method(int y)不是方法重载,不能同时存在
4、参数传递
当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了。这种传递方式,我们称为参数传递。
- 在这里,定义方法时,参数列表中的变量,我们称为形式参数
- 调用方法时,传入给方法的数值,我们称为实际参数
例:
public class ArgumentsDemo02 { public static void main(String[] args) { int[] arr = { 1, 2, 3 }; change(arr);// 调用方法时,传入的数值称为实际参数 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void change(int[] arr) {// 方法中指定的多个参数称为形式参数 for (int i = 0; i < arr.length; i++) { arr[i] *= 2; } } }
运行结果:
参数传递内存图解:
结论:
l 当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响
l 当调用方法时,如果传入的数值为引用数据类型(String类型除外),形式参数的改变对实际参数有影响
只有:数组、集合、对象、成员变量可以进堆
二、引用数据类型
1、分类
我们可以把类的类型为两种:
l 第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用。
l 第二种,我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用。
2、类的定义格式
不需要有 main 方法
创建java文件,与类名相同 public class 类名{ 数据类型 属性名称1; 数据类型 属性名称2; … }
3、类的使用格式
格式如下: 导包:我们将所有的类放到同一个文件夹下,可以避免导包。 创建对象:数据类型 变量名 = new 数据类型(); 调用方法:目前我们定义的自定义类不涉及方法,只是属性(自定义类中的方法部分在面向对象部分讲解) 访问属性:变量名.属性 (这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问。)
例:
//定义一个类:Phone public class Phone { /*属性 */ String brand;// 品牌型号 String color;// 颜色 double size; // 尺寸大小 }
使用类
public class Test { public static void main(String[] args) { //定义了一个Phone类型的变量p Phone p = new Phone(); /* * 通过p,使用Phone中的属性 */ //访问p中的brand品牌属性 p.brand = "苹果6s";[为p中brand属性赋值为”苹果6s”] //访问p中的color颜色属性 p.color = "白色";[为p中color属性赋值为”白色”] //访问p中的size尺寸大小属性 p.size = 5.5;[为p中size属性赋值为5.5] System.out.println("手机品牌为" + p.brand[使用p中brand属性值参与运算]); System.out.println("手机颜色为" + p.color[使用p中color属性值参与运算]); System.out.println("手机尺寸大小为" + p.size[使用p中size属性值参与运算]); } }
运行结果:
4、自定义类型注意事项与内存图
上述代码中,通过类Phone创建出来的变量p,它相当于我们生活中的盒子,里面包含了它能够使用的属性。
l 通过 p.属性名 就可以对属性进行操作
l 与引用类型数组类似,引用类型的自定义类型的变量,直接变量时,结果为对象地址值,这里可以通过内存图简单解释。
三、集合 ArrayList
数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。
为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为集合。
在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。
1、集合的创建
导包:import java.util.ArrayList; 创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型: ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();
注意:
l 集合中存储的元素,只能为<>括号中指定的数据类型元素;
l “<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;
下面给出8种基本数据类型所对应的引用数据类型表示形式:
2、 集合中常用方法
例:
import java.util.ArrayList; public class ArrayListDemo01 { public static void main(String[] args) { // 创建ArrayList集合 ArrayList<String> list = new ArrayList<String>(); // 向集合中添加元素 list.add("stu1"); list.add("stu2"); list.add("stu3"); list.add("stu4"); // 获取集合中元素的个数 System.out.println("集合的长度:" + list.size()); // 取出并打印指定位置的元素 System.out.println("第1个元素是:" + list.get(0)); System.out.println("第2个元素是:" + list.get(1)); System.out.println("第3个元素是:" + list.get(2)); System.out.println("第4个元素是:" + list.get(3)); } }
补充方法:
l boolean add(int index, Object obj)
n 功能:在集合中指定index位置,添加新元素obj
n 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用add(1,“javaWeb”)后,集合list中的元素为[“java”,“javaWeb”,“JavaEE”]。
l Object set(int index, Object obj)
n 功能:用指定元素obj替代集合中指定index位置的元素
n 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用set(0,“javaWeb”)后,集合list中的元素为[“javaWeb”,“JavaEE”]。
l Object remve(int index)
n 功能:从集合中删除指定index处的元素,返回该元素
n 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用remove(0)后,集合list中的元素为[“JavaEE”],返回值为“java”。
l void clear()
n 功能:清空集合中所有元素
n 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用clear()后,集合list中的元素为空[]。
3、集合的遍历
用for循环
补充:长度的获取:集合:size()、数组:length属性、字符串:length()
import java.util.ArrayList; public class ArrayListDemo02 { public static void main(String[] args) { //创建ArrayList集合 ArrayList<Integer> list = new ArrayList<Integer>(); //添加元素到集合 list.add(13); list.add(15); list.add(22); list.add(29); //遍历集合 for (int i = 0; i < list.size()[获取集合中元素的个数]; i++) { //通过索引,获取到集合中每个元素 int n = list.get(i)[获取集合中指定位置上的元素值]; System.out.println(n); } } }