欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础补习Day4

程序员文章站 2022-07-14 18:49:52
...

一、数组

1.数组的创建方式:

  • 静态创建:(使用{}来设置数组)
    Object[] array = {1, true, "A"} ;

    String[] str = new String[]{"abc","123"};
  • 动态创建:(通过new关键字创建,数组是在内存上分配的一个固定长度的区间,所以一定要确定内容的长度)
Object[] array = new Object[5] ;

动态创建的数组,其中是没有数据的
- 如果是基本数据类型,会配置初始值:int=0,double=0.0,char=”\u0000”,boolean=false
- 如果是引用类型,则统一为null

2.数组的操作

数组的取值和赋值都是通过下标进行的,所以数组可以使用循环方式进行遍历。

3.二维数组和多维数组

3.1 二维数组的创建

和一维数组类似,二维数组的创建也有两种方式:

//静态
int[][] arrArray = {{1,2,3},{4,5,6},{7,8}} ;
//动态
int[][] arrArray = new int[3][4] ; 
//最后一维的数组长度可以不去设定,如果设定了,那么就必须全部是这个长度。

3.2二维数组的操作

赋值、取值、遍历如下:

//赋值
arrArray[2][2] = 100 ;
//取值
int i = arrArray[2][2] ;
System.out.println("第3个数组中第3个格子存放的数据:"+i);
//遍历二维数组
System.out.println("foreach 遍历二维数组") ;
for(int[] arr:arrArray){
    for(int value:arr){
        System.out.println("value = "+value);
    }
}

二、反射机制

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射机制的主要使用对象:

Class 、 Field 、 Method 、Constructor

1.反射机制创建对象

a.获取目标类的类对象
Class clazz = Target.class ;
b.获取构造器
Constructor constructor = clazz.getConstructor(int.class) ;//获取指定一个构造器对象(以参数类型作为判断条件),如果无法访问,则获取不到
//clazz.getConstructors() ;//获取所有能访问的构造器对象
constructor = clazz.getDeclaredConstructor() ;
//获取指定构造器对象,无论他是否能被访问到(无视访问控制)
c.通过构造器对象,创建对象
Object obj = constructor.newInstance() ;
//其中的参数后面有三个点,代表这是可变参数,填入的数量不定,可填,可不填。

2.反射机制操作属性

a.获取属性
Field field = clazz.getField("a");
//获取指定名称的属性,如果无法访问,则抛出异常。
b.获取修饰词
int modifiers = field.getModifiers() ;
//获取修饰词
c.获取类型
Class paramClazz = field.getType() ;
d.获取名称
String name = field.getName() ;
e.获取数据
Object value = field.get(obj) ;

3.反射机制操作方法

反射机制操作方法和操作属性类似,在此不再重复

主要实现代码如下:

//通过反射创建对象(Target为一个类)
//1.获取目标类的类对象
Class clazz = Target.class ;
//2.获取构造器
Constructor constructor = clazz.getConstructor(int.class) ;//获取指定一个构造器对象(以参数类型作为判断条件),如果无法访问,则获取不到
//clazz.getConstructors() ;//获取所有能访问的构造器对象
constructor = clazz.getDeclaredConstructor() ; //获取指定构造器对象,无论他是否能被访问到(无视访问控制)
//clazz.getDeclaredConstructors() ;//获取所有的构造器对象(无视访问控制),但是得到了可能会无法使用。
//如果是私有的成员,我们可以利用反射来破坏封装
constructor.setAccessible(true); //填true代表我们可以访问使用,填false则相反。
//3.通过构造器对象,创建对象
Object obj = constructor.newInstance() ; //其中的参数后面有三个点,代表这是可变参数,填入的数量不定,可填,可不填。
System.out.println(obj instanceof Target);

//4.我们还可以通过反射对属性和方法做操作,整个操作过程与构造器的操作差不多
//eq:属性
Field field = clazz.getField("a") ;//获取指定名称的属性,如果无法访问,则抛出异常。
//修饰词
int modifiers = field.getModifiers() ;//获取修饰词
System.out.println("modifiers = "+modifiers);

//      Modifier.PUBLIC//修饰词是有int类型数值组合而成,因为一个属性可以同时拥有多个修饰词。
//类型
Class paramClazz = field.getType() ;
System.out.println(paramClazz.getName());
//名称
String name = field.getName() ;
//数据
Object value = field.get(obj) ; //由于我们现在的操作,其实时基于类型的对象,而不是这个类的实例对象,所以我们是无法获取到真实的数值的,所以我们必须在参数中传入真实的此类型实例对象,从而获取他的参数值。
System.out.println("obj的属性a = "+value);

三、容器集合(Collection)

1.ArrayList

ArrayList和数组一样是数据的容器,ArrayList提供了可以变化的容量。
ArrayList空参构造器设定的初始容量是10,如果超出,那么ArrayList会自动扩容

1.1继承关系:

    抽象父类:AbstractList
接口:Serializable,Cloneable,List, RandomAccess

1.2常用的方法:

add(E e) : 将指定的元素添加到此列表的尾部。
add(int index, E element) :将指定的元素插入此列表中的指定位置
get(int index) :返回此列表中指定位置上的元素
remove(int index) :移除此列表中指定位置上的元素
remove(Object o):移除此列表中首次出现的指定元素(如果存在)。
set(int index, E element) :用指定的元素替代此列表中指定位置上的元素。

对于ArrayList的补充:

ArrayList就是对数组的封装;在构造器中获得了一个Object类型的空数组。

1.为什么大小变化呢?
因为在add方法中,ArrayList会判断当前容量,如果超出,即会创建一个比现在数组大1.5倍的数组,然后把数据统统装入新数组

2.删除的时候,那么这些空位去哪里了?
删除操作时,不会留下空位,这个空位会被之后的数据占据。删除的函数主要做了数组的拷贝移动,如下函数:

System.arraycopy(elementData, index+1, elementData2, index, numMoved);
//将elementData这个数组从indnex+1开始数nuMOve个数据,移动的到elementData2中的index下标开始的numMove的数量的各自种,这就是把index+1开始的数据,前移一位

2.泛型

在编写代码时,我们无法确定类型,所以暂时使用一个标记进行占位,到使用时,才设置真是的类型.在类定义时,类型后面<>填写的字母或字符串就是泛型,多个反省用逗号隔开。

注意:如果在使用时,没有明确设定,那么泛型用Object类型替换,否则,在创建对象时,替换泛型,如下:

ArrayList<String> arrayList = new ArrayList<String>() ;

父类中定义的泛型,如果子类不确认,默认看做Object,如果子类还不能确定,需要重新定义泛型,并对父类泛型进行替换。

3.LinkedList

 ArrayList和LinkedList功能非常相似,因为它们有共同的父类和父接口

继承关系:

1.抽象父类:AbstractSequentialList
2.接口:Serializable,Cloneable,List,Deque, Queue

4.补充

4.1 父类父接口:

  • 最大父接口:collection,对整个类族共有的方法,进行了限定和规范
  • 最大的父类:AbstractCollection,对接口定义的的方法和功能,进行了初步实现

4.2 补充:

List接口是ArrayList和LinkList的共同的关键父接口,它提供了对这两个类数据容器功能的规范。如果有新功能,他们会接入对应的父接口,进行功能扩展。

在软件系统中,我们会利用接口对系统进行功能规范,抽象父类能帮助我们一层一层对具体功能进行完善和统一实现

在这套完整的规则中,我们可以使用这些父接口和利用这些父类来完成我们自己数据结构容器的封装。并且可以融入使用这套规则的数据容器的软件系统