Java【持续更新中】
文章目录
跳转链接(学习路线)及前言(更新中)
Java
↓
MySql
↓
jdbc
↓
Tomcat
↓
Servlet
↓
html
css
javascript
javascriptDOM操作
vue
react
基础部分、供复习和平日查询使用,快速复习!!!
内容有误,可以评论区指出,随时改正
IO流
泛型
约束数据类型,把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
java泛型是伪泛型,也就是说是假的泛型,只在编译期间有效,称之为泛型擦除,在编译为class文件后,会将泛型的内容强转至所需类型。
注意:
1、泛型中是不能存储基本类型的,因为有泛型擦除,最终还是会变成Object类型,而基本类型是无法转成Object类型的。
2、指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型。
3、如果不写泛型,类型默认是Object类型。
格式<数据类型>
泛型只支持引用数据类型
ArrayList<String> arrayList = new ArrayList<>();
泛型类
把泛型写到类后面,那么就是泛型类
当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
修饰符 class 类名<类型>{
}
public class myArrayList<E> {
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
public E get(int index){
return (E)obj[index]
}
}
// 此处E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写成:T、E、K、V等。
// E代表一个不确定的类型,不确定的类,并且可以当做类型使用(形参,变量)。
// 当我们在类名后申明一个泛型时,在类中所有的地方都可以使用这个泛型当做不确定的类型。
使用时:
myArrList<String/Intger...> arrlist = new myArrList;
泛型方法
把泛型写到方法后面,那么就是泛型方法。
之前我们说过,当我们在类名后申明一个泛型时,在类中所有的地方都可以使用这个泛型当做不确定的类型。
而在方法上申明泛型,只有本方法才能使用。
把泛型写到接口后面,那么就是泛型接口,同样这个泛型可以写成:T、E、K、V等。
public static <E> void fun(ArrayList<E> list ,E e1.E e2... ){}
// 使用时,在传递第一个参数的时候,就能够确定后面所有形参所需要传递的类型了,
// 也就是说,后面的形参类型要根据第一个的类型来定。(方法被使用时,泛型的类型就定义下来了)
泛型接口
修饰符 interface 接囗名<类型> {}
public interface List<E> {}
泛型接口创建时非常简单,主要说明使用的方式。
方式1:实现类给出具体类型
// 一个个泛型接口
public interface List<E> {
// ...
}
// 实现类,在这里确定类型
public class MyArrayList implements List<String>{}
方式2:实现类延续泛型,创建对象时再确定(如果实现类还是没有明确类型)
// 实现类还是没有确定泛型类型
public class MyArrayList<E> implements List<E> {
}
// 使用
MyArrayList<String> list = new MyArrayList<>();
泛型通配符
泛型不能继承,但是数据具备继承性
? extends Fu:表示可以传递Fu或者Fu的所有子类
? super Zi:表示可以传递Zi或者Zi所有的父类
反射
反射允许对封装类的字段,方法和构造函数的信息进行编程访问。
获取Class对象
1、Class.forName(“全类名”);
源码阶段使用这种方式,这时java文件编译为.class字节码文件,这时是没有加载到内存当中的。
最为常用
2、类名.class
加载阶段使用这种方式
一般作为参数传递
3、类名.getClass();
运行阶段使用这种方式
已经有了这个类的对象时,才能使用
获取构造方法
Class类中用于获取构造方法的方法
Constructor<?>[] getConstructors() //返回所有公共构造方法对象的数组
public void fun() throws ClassNotFoundException {
Class aClass = Class.forName("test.xia.Student");
Constructor[] constructors = aClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor<?>[]getDeclaredConstructors() //返回所有构造方法对象的数组
public void fun() throws ClassNotFoundException {
Class aClass = Class.forName("test.xia.Student");
Constructor[] constructors = aClass.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor<T> getConstructor(Class<?>.. parameterTypes) //返回单个公共构造方法对象
public void fun() throws ClassNotFoundException {
Class aClass = Class.forName("test.fanshe.xia.Student");
Constructor declaredConstructor = null;
try {
declaredConstructor = aClass.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.out.println(declaredConstructor);
}
Constructor<T>getDeclaredConstructor(Class<?>.. parameterTypes) //返回单个构造方法对象(多个参数)
public void fun() throws ClassNotFoundException {
Class aClass = Class.forName("test.fanshe.xia.Student");
Constructor declaredConstructor = null;
try {
declaredConstructor = aClass.getDeclaredConstructor(int.class,String.class);
// 获取权限修饰符
int modeifiers = declaredConstructor.getModifiers();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
System.out.println(declaredConstructor);
}
// 获取参数
declaredConstructor = aClass.getDeclaredConstructor(int.class,String.class);
Parameter[] parameters = declaredConstructor.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
Constructor类中用于创建对象的方法
T newlnstance(0bject...initargs) //根据指定的构造方法创建对象
setAccessible(boolean flag) //设置为true,表示取消访问检查
// 使用反射获取构造器并创建对象(暴力反射)
declaredConstructor.setAccessible(true);
Student u = (Student) declaredConstructor.newInstance(18,"李四");
权限修饰符对应的数字
获取成员变量
Class类中用于获取成员变量的方法:
// Field[]getFields():返回所有公共成员变量对象的数组
Class aClass = Class.forName("test.fanshe.xia.Student");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
// Field[]getDeclaredFields():返回所有成员变量对象的数组
Class aClass = Class.forName("test.fanshe.xia.Student");
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
// Field getField(String name):返回单个公共成员变量对象
Class aClass = Class.forName("test.fanshe.xia.Student");
Field name = aClass.getField("name");
System.out.println(name);
// Field getDeclaredField(String name):返回单个成员变量对象
Class aClass = Class.forName("test.fanshe.xia.Student");
Field name = aClass.getDeclaredField("name");
System.out.println(name);
// 获取修饰符getModifiers()
// 获取成员变量名getName()
// 获取变量类型getType()
// 获取变量的值get(传入实例化后的对象) (私有变量需要暴力反射setAccessible)
Object get(0bject obj)
// 设置变量的值set(传入实例化对象,要改变的值)
void set(Object obj, Object value)
获取成员方法
Class类中用于获取成员方法的方法
Methodl]getMethods():返回所有公共成员方法对象的数组,包括继承的(包含父类的)
Class aClass = Class.forName("test.fanshe.xia.Student");
Method[] declaredMethods = aClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
Method[l getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的(不能获取父类,但是可以获取本类中私有的方法)
Class aClass = Class.forName("test.fanshe.xia.Student");
Method[] declaredMethods = aClass.getMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
Method getMethod(String name, Class<?>... parameterTypes):返回单个公共成员方法对象
Class aClass = Class.forName("test.fanshe.xia.Student");
Method student = aClass.getMethod("fun",String.class);
System.out.println(student);
System.out.println(student.getModifiers());
Method getDeclaredMethod(String name, Class<?>... parameterTypes):返回单个成员方法对象(私有的也可以获取到)
Class aClass = Class.forName("test.fanshe.xia.Student");
Method student = aClass.getDeclaredMethod("fun",String.class);
System.out.println(student);
System.out.println(student.getModifiers());
// 获取方法的形参个数
int parameterCount = student.getParameterCount();
// 获取方法形参的类型
Class<?>[] parameterTypes = student.getParameterTypes();
// 获取形参列表
Parameter[] parameters = student.getParameters();
Method类中用于创建对象的方法
Object invoke(Object obj, Object... args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)返回值:方法的返回值(如果没有就不写)
Class aClass = Class.forName("test.fanshe.xia.Student");
Method student = aClass.getDeclaredMethod("fun",String.class);
System.out.println(student);
Student std = new Student();
//传递参数并且接收返回值
Object ret = student.invoke(std, "啦啦啦");
获取方法中抛出的异常和返回值
// 获取方法的异常
Class aClass = Class.forName("test.fanshe.xia.Student");
Method student = aClass.getMethod("fun",String.class);
Class[] exceptionTypes = student.getExceptionTypes();
for (Class exceptionType : exceptionTypes) {
System.out.println(exceptionType);
}
//
2024年3月5日18:11:59