1、方法的重载:
我们假设要在程序中实现一个对数字求和的方法,
由于参与求和数字的个数和类型都不确定,因此要针对不同的情况去设计不同的方法。
接下来通过一个案例来实现对两个整数相加、对三个整数相加以及对两个小数相加的功能
class DEMO01 { public static void main(String[] args) { //(分开调用) /* System.out.println(add1(1,2)); System.out.println(add2(1.1,2.2)); System.out.println(add3(1.2,2.3,3.4)); */ //调用(方法重载)
//为了解决这个问题,Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
System.out.println(add(1,2)); System.out.println(add(1.1,2.2)); System.out.println(add(1.2,2.3,3.4)); } //求和(分开) /*public static int add1(int a,int b){ return a+b; } public static double add2(double a,double b){ return a+b; } public static double add3(double a,double b,double c){ return a+b+c; } */ //求和(方法重载); public static int add(int a,int b){ return a+b; } public static double add(double a,double b){ return a+b; } public static double add(double a,double b,double c){ return a+b+c; } }
重载的注意事项:
重载方法参数必须不同:
参数个数不同,如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)不同
重载只与方法名与参数类型相关与返回值无关
如void method(int x)与int method(int y)不是方法重载,不能同时存在
重载与具体的变量标识符无关
如method(int x)与method(int y)不是方法重载,不能同时存在
参数传递:
参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,
传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,
在方法中运算了。这种传递方式,我们称为参数传递。
注意:!!!!
基本数据类型:
class DEMO2 { public static void main(String[] args) { int a=5; int b=10; change(a, b);//调用方法时,传入的数值称为实际参数 System.out.println("a=" + a); System.out.println("b=" + b); } public static void change(int a, int b){//方法中指定的多个参数称为形式参数 a=200; b=500; } } /*D:workspase20180915>javac DEMO2.java D:workspase20180915>java DEMO2 a=5 b=10*/
引用数据类型:
class DEMO3 { 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; } } } /*D:workspase20180915>javac DEMO3.java D:workspase20180915>java DEMO3 2 4 6*/
(1)当调用方法时,如果传入的数值为基本数据类型(包含String类型),
形式参数的改变对实际参数不影响[进栈 - 传递的是值]
(2)当调用方法时,如果传入的数值为引用数据类型(String类型除外),
形式参数的改变对实际参数有影响[进堆 - 传递的是地址]
图解:
基本数据类型:
引用数据类型:
2、引用数据类型(类):
⦁ 引用数据类型分类:
⦁ 第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用。
⦁ 第二种,我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用。
⦁ 自定义数据类型概述:
类,它是引用数据类型,与之前学习的所有引用数据类型相同,自定义类也是一种数据类型。
只是自定义类型并非Java为我们预先提供好的类型,而是我们自己定义的一种引用数据类型用来描述一个事物。
⦁ 类的定义与使用:
⦁ 类的定义格式:
创建java文件,与类名相同
public class 类名{
数据类型 属性名称1;
数据类型 属性名称2;
…
}
举个例子:
public class Phone { //属性 String color; double size; String brand; }
⦁ 类的使用格式 :
导包:我们将所有的类放到同一个文件夹下,可以避免导包。
创建对象:数据类型 变量名 = new 数据类型();
调用方法:目前我们定义的自定义类不涉及方法,只是属性(自定义类中的方法部分在面向对象部分讲解)
访问属性:变量名.属性 (这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问。)
public class Test { public static void main(String[] args) { //创建对象(实例化一个手机) Phone p = new Phone();//当Test编译时Phone也编译 p.color = "红色"; p.size = 5.8; p.brand = "iphonexs"; System.out.println("这是一个颜色为"+p.color+"尺寸为"+p.size+"品牌为"+p.brand+"的手机"); } } /* D:workspase20180915>javac Test.java D:workspase20180915>java Test 这是一个颜色为红色尺寸为5.8品牌为iphonexs的手机 */
⦁ 自定义类型注意事项与内存图:
⦁ 通过 p.属性名 就可以对属性进行操作
⦁ 与引用类型数组类似,引用类型的自定义类型的变量,直接变量时,结果为对象地址值
⦁ ArrayList集合
ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。
在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,
ArrayList会在内存中分配一个更大的数组来存储这些元素,
因此可以将ArrayList集合看作一个长度可变的数组。
集合的创建
导包:import java.util.ArrayList;
创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:
ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();
⦁ 集合中存储的元素,只能为<>括号中指定的数据类型元素;
⦁ “<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;
下面给出8种基本数据类型所对应的引用数据类型表示形式:
基本数据类型 对应的引用数据类型表示形式
byte Byte
short Short
Int Integer
long Long
float Float
double Double
char Character
boolean Boolean
我们通过举几个例子,来明确集合的创建方式:
⦁ 存储String类型的元素
ArrayList<String> list = new ArrayList<String>();
⦁ 存储int类型的数据
ArrayList<Integer> list = new ArrayList<Integer>();
⦁ 存储Phone类型的数据
ArrayList<Phone> list = new ArrayList<Phone>();
⦁ 集合中常用方法:
ArrayListDemo01.java
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)); } }
//ArrayList集合相当于是一个长度可变的数组,所以访问集合中的元素也是采用索引方式访问,
//第一个元素存储在索引0的位置,第二个元素存储在索引1的位置,依次类推。
⦁ 集合的遍历:
ArrayListDemo02.java 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); } } }
集合的常用方法:
⦁boolean add(Object obj)
⦁ 功能:将指定元素obj追加到集合的末尾
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用add(“javaWeb”)后,集合list中的元素为[“java”,“JavaEE”,“javaWeb”]。
⦁ Object get(int index)
⦁ 功能:返回集合中指定位置上的元素
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用get(1)后,返回集合list中的元素 JavaEE。
⦁ int size()
⦁ 功能:返回集合中的元素个数
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用size()后,返回集合list中的元素的个数(或长度) 2。
⦁ boolean add(int index, Object obj)
⦁ 功能:在集合中指定index位置,添加新元素obj
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用add(1,“javaWeb”)后,集合list中的元素为[“java”,“javaWeb”,“JavaEE”]。
⦁ Object set(int index, Object obj)
⦁ 功能:用指定元素obj替代集合中指定index位置的元素
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用set(0,“javaWeb”)后,集合list中的元素为[“javaWeb”,“JavaEE”]。
⦁ Object remve(int index)
⦁ 功能:从集合中删除指定index处的元素,返回该元素
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用remove(0)后,集合list中的元素为[“JavaEE”],返回值为“java”。
⦁ void clear()
⦁ 功能:清空集合中所有元素
⦁ 功能说明:假设集合list中有元素[“java”,“javaEE”],当使用clear()后,集合list中的元素为空[]。