黑马程序员-java基础第3、4天-函数和数组


-------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!--------------------------

函数
函数的定义

函数就是定义在类中的,具有特定功能的一段独立的小程序,函数又称为方法。
-------------------------------------------------------------------------------------------------
函数定义的格式

修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,、、、)
{
执行语句;
return 返回值;

}

1、修饰符:包括 private、public、static、final
当函数被private修饰时,表示此函数是私有的即只在被类中被调用,外部类不能调用。
当函数被public修饰时,表示此函数是公有的即除了可以在本类中被调用,外部类也可以直接调用此函数。
当函数被static修饰时,表示此函数为静态函数,则此函数中只能直接调用静态成员。并且静态函数随着
类的加载而加载,随着类的消失而消失。

2、返回值类型:函数运行结束之后,结果的数据类型。
3、参数类型:是形式参数的数据类型。
4、形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
5、实际参数:传递给形式参数的具体数值。
6、return :用于结束函数。当函数无返回值时,此时返回值类型用void关键字表示,并且return可以写可以
不写,不写的话系统会自动给加上。return的作用即结束函数、结束功能。
7、返回值:该值会返回给调用者。

例子:
public static int getMax(int x,int y)
{
return (x>y)?x:y;
}
-------------------------------------------------------------------------------------------------------
函数的分类
1、主函数:保证一个类能够独立运行,是一个程序运行的入口,被jvm调用,主要用来调用函数。
2、构造函数:给类的对象进行初始化。此函数名和类名一样。
3、函数(方法):定义在类中,并且当被别的函数调用时才能执行。注意,函数中不能再定义函数,只能是函
数调用函数。
--------------------------------------------------------------------------------------------------------
函数的作用
 
 1、用于定义一个功能。
 2、将代码进行封装,提高代码的复用性。
---------------------------------------------------------------------------------------------------------
函数的重载和复写
1、函数的重载:在一个类中,如果出现了一个或多个同名函数时,只要他们的参数列表(参数个数或者参数类型)不
同即为该函数的重载。
2、什么时候使用重载呢?
当函数的功能相同,但是参数运算的未知内容不同,那么,这时就定义一个函数名称以表示其功能,方便阅读,
而通过参数列表(参数个数或者参数类型)的不同,来区分多个同名函数。
3、区分函数的重载:当同名函数时,只看函数的参数列表而不看函数的返回值类型。
4、函数的复写:函数的复写出现在继承中,即子类和父类有相同的函数(即函数名、参数列表以及返回值都相同),
那么就叫做子类中的函数复写了父类中的函数。
5、复写的注意事项:
静态函数只能覆盖静态函数;
复写时子类的函数权限要等于或者大于父类中函数的权限。

例子

class OverLoadDemo 
{
	public static void main(String[] args) 
	{
		//print99(6);
		print99();
	}
	//打印所指定的num阶乘法表,具有扩展性。
	public static void print99(int num)
	{
		for (int x=1;x<=num ;x++ )
		{
			for (int y=1;y<=x ;y++ )
			{
				System.out.print(y+"*"+x+"="+y*x+"\t");
			}
			System.out.println();//换行
		}
	}
	//只能打印9阶乘法表。
	public static void print99()
	{
		for (int x=1;x<=9 ;x++ )
		{
			for (int y=1;y<=x ;y++ )
			{
				System.out.print(y+"*"+x+"="+y*x+"\t");
			}
			System.out.println();
		}
	}
} 
---------------------------------------------------------------------------------------------------------
数组
1、定义:同一种类型数据的集合,其实数组就是一个容器。一次装起来的数据的类型必须一样。
2、特点:自动给元素进行编号,且从0开始编号。
数组一旦被定义,其数组的长度固定,不可变,所以给数组增加元素的动作要小心。
数组中元素的类型一样。
3、数组的分类:一维数组、二维数组。
----------------------------------------------------------------------------------------------------------
数组定义格式
1、一维数组
元素类型[] 数组名=new 元素类型[元素个数或数组长度];
int[] arr=new int[3];

元素类型[] 数组名=new 元素类型[]{元素1,元素2,、、、};
int arr=new int[]{1,3,5};

元素类型[] 数组名={元素1,元素2,、、、};
int[] arr={1,3,5,7};

2、二维数组
元素类型[][] 数组名=new 元素类型[二维数组长度][二维数组中每一个一维数组的长度];
int[][] arr=new int[3][4];

元素类型[][] 数组名={{1,3,5,2},{4,3,1},{5,9,8,0}};
------------------------------------------------------------------------------------------------------
内存情况
arr 是变量,所以是存放在栈内存中的。当变量在范围内使用完了之后,自动释放内存,
new 即创建对象,是存放在堆内存中的。当对象使用完了之后,变成垃圾,并通过垃圾回收机制来释放内存空间。
-------------------------------------------------------------------------------------------------------
遍历数组
1、遍历一维数组
第一种遍历方式:利用普通for循环
 for (int x=0;x<arr.length ;x++ )
 {
System.out.println(arr[x]);
 }

 第二种遍历方式:利用高级for循环
  for (int arrs:arr )
  {
 System.out.println(arrs);
 
  }

2、遍历二维数组
for (int x=0;x<arr.length ;x++ )
{
for (int y=0;y<arr[x].length ;y++ )
{
System.out.println(arr[x][y]);
}
}
---------------------------------------------------------------------------------------------------------
数组的应用

包括:求最大值,最小值,冒泡排序,选择排序,折半查找,进制转换

/**
对数组的各种操作封装成类,以方便以后方便对数组的操作。
@author 贺利英
@version V1.1

*/

class ArrayTool 
{
	/**
	获取整型数组中元素的最大值,获取最大值是通过遍历数组比较得到的,
	所以每次比较之后最大值存起来,所以每次的最大值并不确定,所以
	最大值用一个变量来存储,将每次比较得到的最大值存放在此变量中。
	@param arr 接收一个int类型的数组。
	@return 会返回该数组中的最大值。
	
	*/
	public static int getMax(int[] arr)
	{
		int max=0;
		for (int x=1;x<arr.length ;x++)
		{
			if (arr[x]>arr[max])
			{
				swap(arr,x,max);
			}
		}
		return arr[max];
	}
	/**
	获取整型数组中元素的最大值。
	@param arr 接收一个int类型的数组。
	@return 返回此数组中元素的最小值。
	*/
	public static int getMin(int[] arr)
	{
		//定义一个变量,将每次比较的最小值得角标付给min来保存。
		int min=0;
		for (int x=1;x<arr.length;x++ )
		{
			if (arr[x]<arr[min])
			{
				swap(arr,x,min);
			}
		}
		return arr[min];
	}
	/**
	对int类型的数组进行选择排序。每次用数组中的元素以此与此元素
	后面的元素进行比较,将最值放在此元素处。
	@param arr 接收一个int类型的数组。
	*/
	public static void selectSort(int[] arr)
	{
		//外循环表示总共比较多少次
		for (int x=0;x<arr.length-1;x++ )
		{
			//内循环表示每次外循环需要进行多少次的比较
			for (int y=x+1;y<arr.length;y++ )
			{
				if (arr[x]>arr[y])
				{
					swap(arr,x,y);
				}
			}
		}
	}
	/**
	对数组进行冒泡排序。此排序原理,将数组中相邻的两个元素进行比较,
	每比较一圈之后,其最值都会出现在数组的最后的位置。
	@param arr 接收一个int类型的数组。
	*/
	public static void bubbleSort(int[] arr)
	{
		//外循环表示总共比较多少次
		for (int x=0;x<arr.length-1 ;x++ )
		{
			//内循环表示每次外循环需要进行多少次的比较
			for (int y=0;y<arr.length-x-1 ;y++ )
			{
				if (arr[y]>arr[y+1])
				{
					swap(arr,y,y+1);
				}
			}
		}
	}
	/**
	对数组中的元素进行位置置换。
	@param arr 接收一个int类型的数组。
	@param x 要置换的位置。
	@param y 要置换的位置。
	*/
	private static void swap(int[] arr,int x,int y)
	{
	
		int temp=arr[x];
		arr[x]=arr[y];
		arr[y]=temp;
	}
	/**
	给定一个元素,查找此数组中是否有此元素,若有的话
	则给出此元素在数组中的角标,否则的话,返回-1。
	利用折半查找法进行查找,前提:此数组是有序的。
	@param arr 接收一个int类型的数组。
	@param key 要进行查找的元素。
	*/
	public static int halfSearch(int[] arr,int key)
	{
		int min=0,max=arr.length-1,mid;
		//前提是min角标不能大于max角标
		while (min<=max)
		{
			//每次比较的时候找到中间位置
			mid=(min+max)/2;
			//让key和中间位置的元素进行比较
			if (key>arr[mid])
			{
				min=mid+1;
			}
			else if (key<arr[mid])
			{
				max=mid-1;
			}
			else
				return mid;
		}
		return -1;//若此处写成return min;则代表此函数的功能是在数组中插入一个给定的元素,
		          //插入之后,依然保持此数组是有序的,所以利用折半查找的方法,找出要插入此
				  //元素的位置。
	}
	/**
	利用查表法对数进行进制转换。
	@param num 要进行进制转换的数。
	@param base 在进制转换中要进行&的数
	@param offset 对num进行无条件右移的位数。
	*/
	public static void trans(int num,int base,int offset)
	{
		//定义一个数组,用来存放在数组转化的过程中出现的各种值。
		char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

		//定义一个数组,用来存放每次进行进制转换之后的值。
		char[] arr=new char[32];

		//定义一个指针,使得到的进制转换值从数组的最后位置开始存放。
		int pos=arr.length;
		while (num!=0)
		{
			//每次都将右移offset之后的数和base进行与运算,来得到相应的进制值
			int temp=num&base;
			arr[--pos]=chs[temp];
			//将num右移offset位
			num=num>>>offset;
		}
		//打印得到的进制值
		for (int x=pos;x<arr.length ;x++ )
		{
			System.out.println(arr[x]);
		}
	}
	/*
	进行优化之后的代码,即利用字符串缓存来进行存储每次得到的数。
	public static void trans(int num,int base,int offset)
	{
		char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		
		StringBuffer sb=new StringBuffer();
		while (num!=0)
		{
			int temp=num&base;
			sb.append(chs[temp]);

			num>>>offset;
		}
		
			System.out.println(sb.reverse());
		
	}
	
	
	*/
}


-------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!--------------------------


详情请查看:http://edu.csdn.net


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章