Java语言基础(方法、数组、内存分析)
第一部分:方法
1.1 方法定义
1.2 方法的格式
[修饰符] 返回值类型方法名([参数类型 形式参数1,参数类型形式参数2,……])
{
执行语句; [return返回值;]//需要的话
}
当函数没有具体的返回值时,返回的返回值类型用void关键字表示。
如果函数的返回值类型是void时,return语句可以省略不写的,系统会帮你自动加上。
return的作用:结束函数。结束功能。
1.3方法特点
它可以实现独立的功能;
必须定义在类里面;
它只有被调用才会执行;
它可以被重复使用;
方法结束后方法里的对象失去引用;
如何定义一个功能,并通过方法体现出来:
① 明确该功能运算后的结果.明确返回值类型;
② 明确在实现该功能过程中是否有未知内容参与运算,确定参数列表;
package reviewDemo;
/**
* player 的值分别是1,2,3或者其他值时,该方法返回“大明”,“二明”,“小明”,“我没有这个孩子”。
*/
public class Demo2 {
public static void main(String[] args) {
int player = 5;
System.out.println("返回的结果是:"+show(player));
}
public static String show(int p){
switch (p) {
case 1:
return "大明";
case 2:
return "二明";
case 3:
return "小明";
default:
return "我没有这个孩子!";
}
}
}
1.4方法重载(Overload)
概念:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可。
存在的原因:
屏蔽了一个对象的同一类方法由于参数不同所造成的差异。
特点:
与返回值类型无关,只看参数列表。
以下是方法重载的示例:(以下3个方法是不同的)
publicvoid person(int a){}
public intperson (){}
publicvoid person (int a,String s){}
class Chongzai
{
public static void main(String[] args)
{
int ret = name(3,4,5);
System.out.println(ret);
}
public static int name(int a, int b)
{
int c = a+b;
return c;
}
public static int name(int a, int b, int m)//这就叫做方法的重载,只要参数列表不一样。好处:用户使用时限制很小;
{
int c = a+b+m;
return c;
}
}
2、数组的应用
2.1、数组的声明
用“[]”符号声明一个数组,声明的格式为:
数据类型 [] 数组名;
或 :数据类型 数组名[];
2.2、数组的赋值
(1)直接在声明时赋值:
声明数组时赋值有3种形式:
数据类型 [] 数组名 = {元素1,元素2,···};
或者:数据类型[] 数组名 = new 数据类型[数组长度];
或者:数据类型[] 数组名 = new 数据类型[]{元素1,元素2···};
(2)先声明后赋值:
数据类型[] 数组名;
数组名 = {元素,元素···};
或者:数据类型[] 数组名;
数组名= new 数据类型[数组长度];
数组名[0] = 元素1;
数组名[1] = 元素2;
......
或者:数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2};
注意:这种赋值方式new后面的[]内不可以写数组的长度,数组长度由元素个数而定。
2.2.1、数组的元素带有编号,我们通常称为数组角标,数组角标从0开始到数组长度减一,数组的编号方便对数组的单个元素进行操作,不可以对超出定义范围的角标进行操作,否则系统会发生异常。
2.2.2、数组有一个长度属性,可以调用“数组名.length”获取
代码展示如下:
//创建一个类,命名ArrayDemo(数值演示)
class ArrayDemo
{
//主函数
public static void main(String[] args)
{
//声明一个int型的数组的几种方式
int[] arr = {1,2,3};
int[] arr1 = new int[]{4,5,6,7};
//下面两种是先声明后赋值
int arr2[] = new int[2];
arr2[0] = 9;
arr2[1] = 10;
int[] arr3;
arr3 = {11,12,13};
//定义打印语句,将数组中的数值打印到控制台
//注意:直接打印打印的是数组的内存地址的哈希码值
System.out.println(arr);
//定义循环语句通过操作角标打印,通过数组的length长度属性限定循环条件
for (int x =0;x<arr.length ;x++ )
{
System.out.println(arr[x]);
}
}
}
2.5根据数组的这些属性,可以对数组内的元素进行排序和查找数组内特定元素的操作
(1)数组元素的查找
顺序查找:按数组角标顺序查找
折半查找:每次查找排除上一次查找的一半的数据,这种查找比顺序查找快,但需要数组元素的排列是有序
3、数组的工具类Array
3.1数组工具类是专门用于对数组进行操作的工具类,里面封装了一些对数组进行复制、查找、排序等静态方法。
3.2Arrays方法
sort:对数组元素进行排序
equals:比较数组
binarySearch:折半查找
copyOf:复制数组
copyOfRange:指定范围复制数组
fill:将数组中指定范围的元素替换成同一个指定元素
equals:比较数组
toString:返回数组的字符串表示形式
toString:如果数组中的元素都是对象,那么将元素转到集合中,如果数组中的元素是基本数据类型,那么将数组转成集合中的一个对象
/*
需求:数组工具类
*/
//使用工具类需要在Java类库中导入该工具类
import java.util.Arrays;
//创建一个类,命名Arrayss
class ArraysDemo
{
//主函数
public static void main(String[] args)
{
//声明一个个数组
int[]arr = {2,3,1,5,4,6,9};
//使用数组工具类中的toString方法获得数组的字符串形式
String arrStr = Arrays.toString(arr);
//打印数组元素
System.out.println(arrStr);
//用数组工具类中的Sort方法排序
Arrays.sort(arr);
//排序后打印元素
arrStr = Arrays.toString(arr);
System.out.println(arrStr);
//使用fill方法替换元素
Arrays.fill(arr,8);
System.out.println(Arrays.toString(arr));
}
}
第三部分:内存分析
1、java内存结构
组成结构:栈内存、堆内存、方法区、本地方法区、寄存器
三个个需要重点关注的内存区:
栈内存:方法和局部变量存放的地方,分层,每层的方法独立串行运行,数据使用完,空间自动释放
堆内存:大致分为老生代、新生代和持久层,是存放对象的地方,数组和对象通过new关键字在堆内存中建立存放空间,每个对象实体都有内存地址值,实体中的变量都有默认初始化值,实体不再被引用,内存会在不确定的时间内被垃圾回收器回收。
方法区:存放静态数据、常量、字节码文件对象的区域。
2、内存操作原理
java虚拟机通过调用方法实现程序的运行,被调用的方法存放在栈内存中,每一个方法在栈内存中都有一个独立的栈帧,在方法中需要创建对象时,虚拟机会在堆内存中为对象开辟一块内存空间,将该内存的地址值引用给创建对象的方法,方法运行完毕内存会被释放用于重新加载数据。
3、垃圾回收机制
内存垃圾,即一些被创建的数据使用完后就不会在被使用了,但该数据依然占据着内存空间。java语言有很完善的内存管理机制,程序运行时JVM会不定时的启动垃圾回收机制对JVM运行时产生的不再被使用却占据着内存空间的数据进行清除,JVM使用的是混合的垃圾回收算法,在不同的情况下采用不同的算法对内存垃圾进行管理,垃圾回收算法有:标记垃圾回收、分代垃圾回收和增量垃圾回收。这使得java程序员可以不必耗费大量的时间和精力对内存进行管理,可以投入更多的精力在算法的优化上,当然java还会存在内存溢出的现象,这些将在深入学习后深入分析。
本章总结:
1)、方法是一段可重复使用的代码段,程序中完成独立功能的一段代码的集合
2)、方法重载,方法名相同,但是参数列表不一致!(和方法覆写不一样,方法覆写的方法名和参数列表都必须一样),注意方法重载和方法覆写的不同!
3)、在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可。
4)、数组是利用new关键字用来实现为数组或对象分配内存 (堆内存)
5)、数组的初始化=定义数组+分配空间+赋值