Java语言基础下

Java语言基础

一,函数:

1,函数的定义

●什么是函数?

①函数就是定义在类中的具有特定功能的一段独立小程序。

②函数也称为方法。

2,函数的格式:

修饰符  返回值类型  函数名(参数类型  形式参数1,参数类型  形式参数2)

{

执行语句;

return 返回值;

}

返回值类型:函数运行后的结果的数据类型。

参数类型:是形式参数的数据类型。

形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。

实际参数:传递给形式参数的具体数值。

return:用于结束函数。

返回值:该值会返回给调用者。

3,函数的特点:

①定义函数可以将功能代码进行封装

②便于对该功能进行复用

③函数只有被调用才会被执行

④函数的出现提高了代码的复用性

⑤对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

★注意:

①函数中只能调用函数,不可以在函数内部定义函数。

②定义函数时,函数的结果应该返回给调用者,交由调用者处理。

●两个明确

①明确要定义的功能最后的结果是什么?

②明确在定义该功能的过程中,是否需要未知内容参与运算

示例:/*
需求:定义一个功能,完成3+4的运算,并将结果返回给调用者。
1.明确功能的结果,是一个整数的和。
2.在实现该功能的过程中是否有未知内容参与运算,没有。
其实这两个功能就是在明确函数的定义
1.是在明确函数的返回值类型。
2.明确函数的参数列表(参数的类型和参数的个数)
*/


class FunctionTest 
{
public static void main(String[] args) 
{
int sum = getsum(4 , 6);
System.out.println("sum="+sum);
sum = getsum(2,7);
System.out.println("sum="+sum);
}
/*
public static int getsum()
{
return 3 + 4;

}
*/
/*
如何定义一个函数呢?
1.既然函数是一个独立的功能,那么该功能的运算结果是什么先明确
因为这是在明确函数的返回值类型。
2.在明确在定义该功能的过程中是否需要未知的内容参与运算。
因为是在明确函数的参数列表(参数的类型和参数的个数)。
*/
/*
以上这个函数的功能,结果是固定的,毫无扩展性而言。
为了方便用户需求,由用户指定加数和倍加数,这样,功能才有意义。
思路:
1.功能结果是一个和,返回值类型是int。
2.有未知内容参与运算,有两个,这两个未知内容的类型都是int。
*/
public static int getsum(int x,int y)
{
return x + y;

}





需求:判断两个数是否相同。
思路:1.明确功能的结果;结果是一个:boolean。
2.功能是否有未知内容参与运算,有,两个数。
×/
public static boolean bijiao(int a,int b)
{
/*
if (a==b)
return true;
else//可以不写。
return false;
*/
//return (a==b)?true:false;
return a==b;

}
/*
需求;定义功能,对两个数进行比较,获取较大的数。
*/
public static int getMAX(int a ,int b)
{
/*
if(a>b)
return a;
else
return b;
*/
return (a>b)?a:b;
}
}
4,函数的重载

①重载的概念:在同一个类中,允许存在一个以上同名函数,只要他们的参数个数或者参数类型不同即可。

②重载的特点:与返回值类型无关,只看参数列表。

③重载的好处:方便于阅读,优化了程序设计。

示例:

/*
什么时候用重载?
当定义的功能相同,但参与运算的未知内容不同。
那么,这时就定义一个函数名称以表示其功能,方便阅读,而通过参数列表的不同啦区分多个同名函数。


*/


class FunctionOverload 
{
public static void main(String[] args) 
{
//add(4,5);
//add(4,5,6,);
}
//打印九九乘法表


//定义一个加法运算,获取两个整数的和。
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;
}


}

二,数组

1,数组的定义

●概念:同一种类型数据的集合。其实数组就是一个容器。

●数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

2,数组的内存结构

●Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

●栈内存

用于存储局部变量,当数据使用完,所占空间会自动释放。

●堆内存

①数组和对象,通过new建立的实力都存放在堆内存中

②每一个实体都有内存地址值

③实体中的变量都有默认初始化值

④实体不在被使用,会在不确定的时间内被垃圾回收器回收

●方法区,本地方法区,寄存器

3,数组常见操作

●数组的遍历:

依次访问数组中的每个元素这种操作叫做数组的遍历。

例如:

class ArrayDemo
{
public static void main(String[] args) 
{


//元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

//需求:想定义一个可以存储3个整数的容器。
//int [] x = new int[3];
//打印数组中角标为0的元素的值
//System.out.println(x[0]);
//数组的操作;
//获取数组中的元素,通常会用到遍历;
//int[] arr = new int[3];
int[] arr = {3,6,5,4,8,9};
//数组中有一个属性可以直接获取到数组元素个数。length。
//使用方式:数组名称.length = 
//int sum = 0;
/*
for (int x=0;x < arr.length ;x++ )
{
//sum += arr[x];
System.out.println("arr["+x+"]="+arr[x]+";");//arr[0]=0;
}
*/
daying(arr);
daying(arr);
}
//定义功能,用于打印数组中的元素。元素间用逗号隔开。
public static void daying(int [] arr)
{
System.out.print("[");
for(int x = 0;x <arr.length;x++)
{

if(x!=arr.length - 1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+"]");
}

}
}

●获取最值(最大值,最小值)

例:

*
给定一个数组{5,1,6,4,2,8,9}.
1.获取数组中的最大值,以及最小值。


*/
class ArrayTest 
{
/*
获取数组中的最大值。
思路:
1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为改制不确定,
通过一个变量进行临储。
2.让数组中的每一个元素都和这个变量中的值进行比较。
如果大于了变量中的值,就用该变量记录最大值。
3.当所有的元素都比较完成,那么变量中存储的就是数组中的最大值。
步骤:
1.定义变量,初始化为数组中的任意一个元素即可。
2.通过循环语句对数组进行遍历。
3.在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。

需要定义一个功能来完成,以便提高复用性。
1.明确结果,数组中的最大元素 int。
2.未知内容:一个数组。int []
*/
public static void main(String[] args) 
{
int []arr = {5,1,6,4,2,8,9};
int max = getMax(arr);
System.out.println("max="+max);
}
public static int getMax(int [] arr)
{
int max = arr[0];
for(int x=1;x<arr.length;x++)
{
if(arr[x]>max)
max=arr[x];
}
return max;
}
}

●数组排序

/*
冒泡排序


*/
class BubbleDemo 
{
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++ )//-x: 让每一次比较的元素减少,-1:避免角标越界。
{
if (arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
public static void main(String[] args) 
{
int []arr = {5,1,6,4,2,8,9};
daying(arr);
bubbleSort(arr);
daying(arr);
}
public static void daying(int [] arr)
{
System.out.print("[");
for(int x = 0;x <arr.length;x++)
{

if(x!=arr.length - 1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]+"]");
}

}

/*
数组的查找操作。
练习:有一个有序的数组,想要将一个数组元素插入到这个数组中。
还要保证该数组是有序的。如何获取该元素在数组中的位置。
把查找后返回的-1改成min就是插入元素的躲在位置。
*/
class ArrayChaZhao 
{
public static void main(String[] args) 
{
//int[] arr={3,1,5,4,2,9,};
//int index = chazhao(arr,2);
//System.out.println("intdex="+index);
int[]arr = {2,4,6,8,10,32,45,56};
int index = halfSearch_1(arr,32);
System.out.println("intdex="+index);
}
/*
折半的第二种方式。
*/
public static int halfSearch_1(int []arr,int key)
{
int min = 0,max=arr.length-1,mid;
while(min<=max)
{
mid=(min+max)>>1;
if(key<arr[mid])
max=mid-1;
else if(key>arr[mid])
min=mid+1;
else
return mid;


}
return -1;
}
/*
折半查找,提高效率,但是必须要保证该数组是有序的数组。
*/
public static int halfSearch(int []arr,int key)
{
int min ,max,mid;
min = 0;
max = arr.length-1;
mid = (max + min)/2;


while(arr[mid]!=key)
{
if(key<arr[mid])
max=mid-1;
else if(key>arr[mid])
min=mid+1;
if(min>max)
return -1;
mid = (max + min)/2;


}
return mid;
}












//定义功能,获取key第一次出现在数组的位置。如果返回是-1,那么代表该key在数组中不存在。
public static int chazhao(int [] arr,int key)
{
for(int x=0;x<arr.length;x++)
{
if(arr[x]==key)
return x;
}
return -1;
}


}


4,数组操作常见问题

●数组角标越界异常(ArrayIndexOutOfBoundsException)

int[] arr = new int[2];

System.out.println(arr[3]);

访问到了数组中的不存在的角标时发生。

●空指针异常(NullPointerException)

int[] arr = null;

System.out.println(arr[0]);

arr引用没有指向实体,却在操作实体中的元素时。

三,多维数组

1,数组中的数组

●格式1:int[][] arr = new int[3][2];

×定义了名称为arr的二维数组

×二维数组中有3个一维数组

×每个一维数组中有2个元素

×一维数组的名称分别为arr[0],arr[1],arr[2]

×给第一个一维数组1角标位赋值为78写法是:arr[0][1] = 78;

●格式2:int[][]arr = new int[3][];

×二维数组中有3个一维数组

×每个一维数组都是默认初始化值null

×可以对这三个一维数组分别进行初始化

arr[0] = new int[3];

arr[1] = new int[1];

arr[2] = new int[2];

●格式3:int[][]arr = {{3,8,7},{2,7},{9,6,4,1}};

×定义一个名称为arr的二维数组

×每一个一维数组中具有元素也都已初始化

×第三个一维数组的长度表示方式:arr[2].length;

●●注意:特殊写法情况:int[]x,y[];x是一维数组,y是二维数组。

例:进制转换:

class ArrayTest4 
{
public static void main(String[] args) 
{
toBin(6);
}
/*
十进制------>二进制
*/
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer();
while(num>0)
{
//System.out.println(num%2);
sb.append(num%2);
num = num /2;


}
System.out.println(sb.reverse());
}
}


class ArrayTest5 
{
public static void main(String[] args) 
{
toHex(60);
}
/*
0 1 2 3 4 5 6 7 8 9  A   B  C  D  E  F    ==十六进制中的元素。
0 1 2 3 4 5 6 7 8 9  10  11 12 13 14 15 


查表法:将所有的元素临时存储起来,建立对应关系。
每一次&15后的值作为索引去查建立好的表,就可以找到对应的元素。
这样比-10+‘A’简单的多。


这个表怎么建立呢?
可以数组的形式来定义。


发现终于出结果了,但是是反着的,想要正过来呢?可以通过StringBeffer reverse功能来完成。
但是这个工具我们还没有学习。


所以可以使用已经学习过的容器,数组来完成存储。
*/


public static void toHex(int num )
{
//StringBuffer sb = new StringBuffer();
char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F',};
//定义一个临时容器。
char [] arr = new char [8];
int pos = arr.length-1;


while(num !=0)
//for(int x=0;x<8;x++)
{
int temp = num&15;
//sb.append(chs[temp]);
arr[pos--] = chs [temp];
num = num >>>4;
}
//存储数据的arr数组遍历。
for(int x = pos+1;x<arr.length;x++)
{
System.out.print(arr[x]+",");
}
//System.out.println(sb.reverse());
}
}


class ArrayTest6 
{
public static void main(String[] args) 
{
//toBin(6);
//toBa(60);
toShiLiu(60);
}
/*
十进制------》二进制
*/
public static void toBin(int num )
{
trans(num ,1,1);
}
/*
十进制------》八进制
*/
public static void toBa(int num)
{
trans(num,7,3);
}
/*
十进制------》十六进制
*/
public static void toShiLiu(int num)
{
trans(num,15,4);
}

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)
{
int temp = num & base;
arr[--pos] = chs[temp];
num=num >>> offset;
}

for(int x = pos;x<arr.length;x++)
{
System.out.print(arr[x]);
}
}


}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值