【精简】Java笔记

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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值