数组:
用来保存一组相同数据类型的容器。
声明数组 语法:
1、数据类型[] 变量名; int[] a;
2、数据类型 变量名[]; int a[];
初始化长度:
数组必须初始化长度之后才能使用,并且长度一旦定义之后不能修改。
变量名 = new 数据类型[数组长度];
a =new int[3];
赋值与使用
下标:数组中元素的编号。下标是从0开始到数组长度-1。
可以通过下标来访问数组元素。
a[0]:数组第一个元素
a[a.length-1]:数组的最后一个元素。
length为数组的长度属性,a.length代表数组的长度(数组中元素的个数)。
数组元素的默认值:
int类型-----0
double类型----0.0
String类型------null
boolean类型-----false
char类型-----空
显示初始化:
1、int[] a;
a=new int[]{1,2,3,4};
2、int[] a=new int[]{1,2,3,4};
注意:上两点”=”后的[]中不能加数组长度,否则编译出错。
3、int[] a={1,2,3,4};
数组遍历:
即访问数组中所有的元素。
可以使用for循环、数组的下标来遍历数组元素。
例:
for(int i=0;i<a.length;i++){
System.out.print(a[i]);
}
JVM内存组成:
方法区:存储.class文件信息
栈(stack):存储局部变量和基本数据类型的值。
堆(heap):存储数组值以及对象类型的值。
数组扩容:
因为一个数组的长度一旦定义之后 遍不可以再修改,所以要再想向数组中添加元素需要创建一个新的长度较大的数组,然后把之前数组的所有元素以及新元素拷贝进新数组即可。
方法一:直接赋值:b[i]=a[i];
方法二:System.arraycopy(Object src,Object srcPos,Object dest,Object destPos,int length);
第一个参数:源数组变量名
第二个参数:源数组的起始位置(下标)
第三个参数:目标数组变量名
第四个参数:目标数组其实位置(下标)
第五个参数:要复制的数组长度(元素个数)
方法三:Arrays.copyOf(源数组变量名,目标数组的长度);
该方法返回一个新的数组。
Arrays是java.util包下的类,使用时要先导入包。
import java.util.Arrays;
数组排序:
冒泡排序:相邻元素进行比较,每次总会有或大或小的元素沉底。
例:升序冒泡
public static void main(String[] args){
int[] a={4,3,2,1};
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-i-1;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
print(a);
}
public static void print(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+”\t”);
}
}
选择排序:固定下标取值,与其他元素进行比较。
例:升序排序
public static void main(String[] args){
int[] a={4,3,2,1};
for(int i=0;i<a.length-1;i++){
for(int j=i;j<a.length-1;j++){
if(a[i]>a[j+1]){
int temp=a[i];
a[i]=a[j+1];
a[j+1]=temp;
}
}
}
print(a);
}
快速排序:已经封装好的一个方法。
Arrays.sort(a);//是按升序排序。
二维数组
二维数组声明:
1、数据类型[][] 变量名; int[][] a;
2、数据类型 变量名[][]; int a[][];
初始化数组长度
变量名 =new 数据类型[行的长度][];
赋值:
a[0]=new int[]{1,2,3};//给二维数组第一行赋值。
a[a.length-1]=new int[]{4,5};//给二维数组最后一行赋值。
面向对象
面向过程的编程思想:
把解决问题的思路看成一个过程,一步一步执行逐步求解。
面向对象的编程思想:
对现实世界中的事物进行抽象,进行编程的思想。
生活中的对象:生活中的一切事物都可以看成众多不同的对象。
属性:对象共有的特征。
方法:对象的行为。
类:是对象的一个模板,将对象共有的特征和行为提取出来写成一个类。类是对对象的抽象。
Java中的对象:表示同一个对象数据的集合。
类 class
格式: class 类名{}
属性(成员变量)
成员变量定义在类内部,方法体的外部。
格式:修饰符 数据类型变量名;
通过对象变量来访问成员变量和成员方法。
格式:对象名.成员变量名
对象名.成员方法名();
创建对象语法:
类名 变量名=new 类名();//无参,还可以new有参。
构造方法:
构造方法定义在类的内部。最大的用处就是用来在创建对象时进行初始化。
语法:
1、构造方法名和类名必须一致。
2、构造方法没有方法三要素中的返回值部分,即没有返回值。
3、构造方法在创建对象时调用。如果为有参构造方法,则会在创建对象时进行赋值。
如果在类中没有写任何构造方法,则编译时系统会默认添加一个无参的构造方法。如果写了构造方法,则不会默认添加。
成员方法:
语法:修饰符 返回值方法名(参数表){}
成员方法内部默认有一个this对象,代表的是当前对象。
成员方法从属于对象,所以要用对象来访问成员方法。
对象名.成员方法名;
创建对象的执行流程
1、先执行类加载(只在第一次使用时加载一次)
2、分配空间,进行默认赋值
3、初始化初值
4、调用构造方法创建对象。
参数传递:
Java中的参数传递只有值传递,没有引用传递。
一个对象可以有多个引用,多个引用指向同一个对象,每一个引用都有权修改该对象的值。
参数传递如果传递的变量是基本数据类型,那么传递的是基本数据类型的值;若果传递的变量是对象类型,那么传递的是该对象的地址。
this关键字
this出现在类的内部,代表当前对象。
1、可以通过this关键字访问成员变量和成员方法。(本类内部的成员变量和成员方法默认添加有this)
2、可以通过this关键字访问本类内其他的构造方法。
语法:this(...);
访问本类内构造方法时,只能出现在构造方法的第一句。
局部变量和成员变量的区别:
局部变量:必须先赋值后使用;局部变量有作用域,作用域为定义变量开始到变量所在代码块结束;在同一个作用域,变量名不能重复定义。
成员变量:有默认值;有作用范围,至少在本类内部可以访问;可以与局部变量重名,局部变量有限访问。此时如果想访问成员变量就要用this对象调用成员变量。