java进阶必备知识

泛型

泛型的本质是数据类型的参数化,可以理解为数据类型的一个占位符(形参),即告诉编译器,在调用泛型时必须传入实际类型。这种参数类型可以用在类,方法和接口中,分别被称为泛型类,泛型方法,泛型接口。

泛型的作用:

  1. 起到约束和规范的作用,约束类型属于某一个,规范使用只能用某一种类型。可以让我们业务变得更加清晰和明了并得到了编译时期的语法检查。

  1. 使用泛型的类型或者返回值的方法,自动进行数据类型转换。

//泛型类
修饰符 class 类名<代表泛型的变量>{}

//泛型方法
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){}

//泛型接口
修饰符 interface 接口名 <代表泛型的变量> {}

容器

容器是装其他对象的对象,主要分为两大类,即Collection和Map。Collection代表着集合,类似数组,只保存一个数字。而Map则是映射,保留键值对两个值

数组也是一种容器,优势是一种简单的线性序列,可以快速地访问数组元素,效率高;劣质是不灵活,容量需要事先定义好,不能随着需求的变化而扩容

Collection

  1. List--有顺序可重复

  1. Set--无顺序不可重复

Map

Map中键不能重复,如果重复,会被覆盖

注解Annotation

注解是附加再代码中的一些元信息,用于一些工具再编译、运行时进行解析和使用,起到说明、配置的功能

注解可以附加再package,class,method,field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问

作用:

  1. 不是程序本身,可以对程序作出解释。(这一点和注释一样)

  1. 可以被其他程序读取(如编译器等)(注解信息处理流程,是注解和注释的重大区别)

格式:@注解名 还可以添加一些参数值,如@SuppressWarnings(value="unchecked")

JDK中的内置注解:

@Override

只适用修饰方法,表示一个方法声明打算重写超类中的另一个方法声明

@Deprecated

标记过时方法,可用于修饰方法、属性、类,通常是因为很危险或存在更好的选择

@SuppressWarnings

抑制编译时的警告

@Functionallnterface

java8支持,标识一个匿名函数或函数式接口

@SuppressWarnings注解的常见参数值:

deprecation

使用了不赞成使用的类或方法的警告

unchecked

执行了未检查的转换时的警告,如当使用集合时没用用泛型来指定集合保存的类型

fallthrough

当Switch程序快直接通往下一种情况而没有Break的警告

path

再类路径、源文件路径等有不存在的路径时的警告

serial

再可序列化的类上确实serialVersionUID定义的警告

fianlly

任何fianlly子句不能正常完成时的警告

all

所有的警告


元注解:

  1. @Target--描述注解的使用范围

如@Target(value=ElementType.TYPE)

  1. @Retention--描述注解的生命周期,表示需要在什么级别保存该注释信息

  1. @Documented--生成文档信息的时候保留注解,对类作辅助说明

  1. @Inherited--说明子类继承父类中的该注解

  1. @Repeatable--表示注解可以重复使用

自定义注解

//元注解
public @interface 注解名称{
    //属性列表
}

其中的每一个方法实际上是声明了一个配置参数

  • 方法的名称就是参数的名称

  • 返回值类型(只能是基本类型、Class、String、enum)就是参数的类型

  • 可以通过default来声明参数的默认值

  • 如只有一个参数成员,一般参数名为value

反射机制

java不是动态语言,但有一定的动态性,可以用反射机制、字节码操作获得类似动态语言的特性

**反射机制:**在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

Class class = Class.forName(类名)

  • 加载完类之后,在堆内存中,就产生了一个Class类型的对象,这个对象包含了完整的类的结构信息,我们可以通过这个Class对象看到类的结构。

  • 对象是表示或封装一些数据,一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。这个对象就像一面镜子,透光镜子看到类的结构。

  • Class类的实例表示正在运行的java应用程序中的类和接口

常用方法:

//获取包名、类名
clazz.getPackage().getName()//包名
clazz.getSimpleName()//类名
clazz.getName()//完整类名
 
//获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)
 
//获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)
 
//获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,int.class,String.class)
 
//反射新建实例
clazz.newInstance();//执行无参构造创建对象
clazz.newInstance(222,"韦小宝");//执行有参构造创建对象
clazz.getConstructor(int.class,String.class)//获取构造方法
 
//反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量
clazz.setAccessible(true);//使私有成员允许访问
f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null
 
//反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
m.setAccessible(true);//使私有方法允许被调用
m.invoke(实例,参数数据);//让指定实例来执行该方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java之弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值