数组 (数组长度不可改变)
长度: 指的就是这个容器的容量, 表示这个数组中能存储多少个数据
元素: 指的就是数组中存储的数据
索引,下标: 某一个元素在数组中的一个位置索引,从0开始。
遍历数组: 依次获取到数组中的每一个元素
格式: 数据类型[ ] 数组名; 数据类型 数组名[ ];
动态初始化:
初始化时只指定数组长度,由系统(jdk)为数组分配初始值。
int[ ] arr =new int[5];
//int:数组中数据类型 []:代表数组 arr:变量名 new:代表在内存开辟存储空间 5:数组的长度,数组长度一旦确定了,不能修改
arr[ 1] = 5;给arr数组中的第二个元素赋值
静态初始化:给出元素的初始值,系统决定你的长度
int[] number = new int[]{1, 2, 3, 5, 8};
int[] number = {1,2,3,5,8};
异常:
indexOutOffBoundsException:索引越界
索引的取值范围超出了数组长度、
nullPointException:空指针异常
数组本身这个遍历在内存中就没有给开辟出地址,数组是引用数据类型,默认值的null
遍历
遍历数组就是一次获取数组中的每一个元素;可以通过索引获取指定位置的元素,索引从0开始到长度-1结束
int [] arr={1,2,3};
for (int index =0 ; index<arr.length ; index++){
System.out.println(arr[index]);
}
例题1:
最大值、最小值
public static void main(String[] args) { int[] arr ={2,333,652,65426,551,662}; /** * 数组中的第一个元素默认最大值 * 开始遍历 * 索引初始值是1 * 判断条件:遍历什么时候结束,数组的长度-1 * 步长+1 * 循环体:判断当前最大值与数组中的元素比较 * 当前最大值:max * 数组中的元素:arr[index] * 如果max<arr[index] ; max=arr[index] * 否则什么也不干 */ int max =arr[0]; for(int index =1;index<arr.length;index++){ System.out.println(); if(max<arr[index]){ max=arr[index]; } } System.out.println(max);
int min = arr[0]; for(int index =1;index<arr.length;index++){ System.out.println(); if(min>arr[index]){ min=arr[index]; } }System.out.println(min);
}
例题2:
/**
* 数组的翻转
* 给的:int[] arr={4,7,6,2}
* 期望:int[] arr={2,6,7,4}
*/
/*创造一个数组用来互换数字,总结规律将其封装为方法
* int tmp=0;
* tmp=arr[3];
* arr[3]=arr[0];
* arr[0]=tmp;
*
* tmp=arr[2];
* arr[2]=arr[1];
* arr[1]=tmp;
* */
public static void main(String[] args) {
int [] arr={4,7,6,2};
int [] reverce=reverce(arr);
printArray(reverce);
for(int index_left=0,index_right=arr.length-1;index_left<index_right;index_left++,index_right--){
int tmp=0;
tmp =arr[index_right]; //将最后一位放到数组tmp中
arr[index_right]=arr[index_left]; //将最后一位重新赋值
arr[index_left]=tmp; //将tmp中的数赋值到第一位
} //此时数组结构已经发生变化
for(int index=0;index<arr.length;index++){ //将结构变化后的数组遍历
System.out.println(arr[index]);
}
}
/**
* 为避免麻烦可以将重复使用的部分封装
*/
//接例2
public static int[] reverce(int[] arr){
for(int index_left=0,index_right=arr.length-1;index_left<index_right;index_left++,index_right--){
int tmp=0;
tmp =arr[index_right];
arr[index_right]=arr[index_left];
arr[index_left]=tmp;}
return arr;
}
public static void printArray(int[] arr){
for (int index = 0; index < arr.length; index++) {
System.out.println(arr[index]);
}
}
//调用方法从而得到结果
public static void main(String[] args) {
int [] arr={6,5,2,4,25,2,85,2,64};
int [] reverce=reverce(arr); //可直接写为printArray(reverce(arr));
printArray(reverce);}
二维数组
int[] [] arr={{1,2,3},{4,5,6},{7,8,9}};
例题:
public static void main(String[] args) {
//二维数组
int[][] arr={{1,2,3},{4,5,6},{7,8,9}};
//遍历二维数组
for (int index_w=0;index_w<arr.length;index_w++){
for (int index_l=0;index_l<arr.length;index_l++){
System.out.print(arr[index_w][index_l]);
}
System.out.println();
}
}
方法的定义
[访问权限修饰符] [其他的修饰符] 返回值类型 方法名 ([参数类型 参数名,...]) { // 方法体 } 注意:[]里的内容,不是必须的 (如果没有返回值类型就写void)
修饰符 目前记住 public static
返回值类型 用于限定返回值的数据类型
方法名 一个名字,为了方便我们调用方法
参数类型 用于接收调用方法时传入的数据的类型
参数名 用于接收调用方法时传入的数据的变量
方法体 完成功能的代码 return 结束方法,把返回值带给调用者
方法的重载:
与返回值类型无关,只看方法名和参数列表 在调用时,
虚拟机通过参数列表的不同来区分同名方法
方法重载:在同一个类中,出现了方法名相同的情况。
方法重载的特点: 方法名相同,参数列表不同。方法重载与返回值无关。
方法的递归:方法自己调用自己,并要有方法的出口。
创建类:
class Student_3{
private String name;
private int age;
//给name设置值
public void setName(String a){
name = a;
} //获取name的值
public String getName(){
return name;
}public void setAge(int a){
age = a;
}
public static void main(String[] args) {
Student_3 s = new Student_3();
s.setName("老六");
类:属性,行为
创建对象:类 s =new 类();
局部变量与成员变量的区别
1.在类中的位置不同:局部变量在方法内部;成员变量在类的内部,方法外部。
2.在内存中的位置不同:局部在栈,成员变量在堆里。
3.初始值:
局部变量:没有默认的初始值,需要赋值才能使用
成员变量:有默认的初始值
如果局部变量和成员变量的名字一样,在方法的调用过程中,采用就近原则
private关键字
//被private 修饰的成员变量,只能在本类中使用;
private String name;
//由于成员变量被private修饰,只能在本类中使用
//所以需要提供公共的getXxx()和setXxx();
静态成员:(static关键字)
静态变量与成员变量区别:
1. 静态成员是属于类的, 在访问的时候, 需要用类来访问 方法区的静态区
非静态成员是属于对象的, 在访问的时候, 需要用对象来访问
2.- 静态方法中, 不能直接访问非静态成员: 静态只能访问静态
- 在非静态的方法中, 可以直接访问静态的成员 非静态,什么都可访问
3.生命周期不同:
静态变量:随着类的加载而加载,随着类的消失而消失;
成员变量:随着对象创建而创建,随着对象的消失而消失;
4.调用方式不同:
静态变量:可以通过类名调用,也可以通过对象调用;
成员变量:只可以通过对象调用。
5.共享:
静态变量:被所有对象共享
成员变量:每个对象有自己的。
特点:
优先于对象存在;随着类的加载而加载;被类的所有对象共享;可以通过类名调用(如果用对象调用静态变量或者方法,那静态变量将会改变,因为它被所有对象共享【公共饮水机被老6破坏后老7也只能用破坏的饮水机】)
注意:
静态的只能调用静态的(变量或者方法) ;静态方法中不能有this,因为静态变量或者是方法,优先于对象而存在,随着类的加载而加载在共享区域。
非静态的方法,既可以使用静态的又可以使用非静态的。
常量要放到静态区!
匿名对象:没有名字的对象
匿名对象使用场景
A:调用方法 仅仅只调用一次的时候使用
注意:调用多次不合适
这样仅仅调用一次的时候使用 有什么好处
使用完毕之后就变成垃圾了,等待垃圾回收器回收
B:可以作为实际参数传递
StudentDemo_1 studentDemo_1 = new StudentDemo_1();(没匿名)
studentDemo_1.method(new Student_1());(匿名)
构造方法:(创建对象的时候调用)
权限修饰符 没有返回值,连void也没有,并且方法名和类名相同。
系统默认有无参数构造方法,但是我们构造了有参数的构造方法后,系统将不再提供无参数(自己要加上)。这两个构造方法是重载
public class Student {
public Student() {
System.out.println("这是构造方法");
}}
public class StudentDemo {
public static void main(String[] args) {
//如何调用构造方法呢?
//通过new关键字调用
//格式:类名 对象名 = new 构造方法(...);
Student s = new Student();
}
}