Java基础复习(第四次)
Java异常(Throwable)
在程序运行过程中出现的错误,称之为异常
。异常就是程序运行过程中出现了不正常现象导致程序中断。
在Java中,把各种异常现象进行了抽象形成了异常类。
异常类结构图
异常的分类
异常主要分为:错误
,一般性异常(受控制异常)
,运行时异常(非受控制异常)
- 错误:Error三种常见报错,如果程序中出现了Error,那么将无法恢复。
- 受控异常:这种异常属于一般异常,出现了这种异常必须显示的处理,不显示处理Java程序就正常编译不了。编译器强制普通异常必须 try…catch处理,或用throws声明,或者throws声明继续抛给上层调用方法处理。所以普通异常也称为checked异常。
- 非受控异常:非受控异常也就是运行时异常(RuntimeException),这种系统异常可处理也可以不处理,所以编译器不强制使用
try.....catch
处理,或用throws声明,这种异常称为unchecked
。
异常的处理
运行时异常(系统异常)
:不需要处理,可以通过规范代码来避免这种异常
受检异常(编译时异常)
:必须预处理,否则编译报错,有两种预处理方式
- 捕获处理
- 抛出处理
Java泛型详解
java泛型中元素代表的意思
E - Element:在集合中使用,因为集合中存放的是元素。
T - Type(Java类):T代表在调用时的指定类型。
K - Key(键):相当于书本的页眉,可以通过页眉可以直接找到相对应的值。
V - Value(值):相当于存放的内容。
N - Number(数值类型)
?:表示不确定的Java类型,一般在通配。
泛型概述
集合中是可以存放任意对象的,只要把对象存储集合后,那么这时它们都会被提升为Object类型。当我们在取出一个对象并进行相应的操作,这时必须采用类型转换。
public class Studen{
public static void main(String[] args){
List studen= new ArrayList();
studen.add("张三");
studen.add(12);//由于集合没有做任何限定,任何类型都可以给其中存放
Iterator it = studen.iterator();
while(it.hasNext()){
//需要打印每个字符串的长度,就要把迭代出来的对象都转换成String类型
String str = (String) it.next();
System.out.println(str.length());
}
}
}
程序在运行时发生了问题java.lang.ClassCastException
类型转换异常。由于集合中什么类型都可以存储。导致取出时强转引发运行时ClassCastException
。Collection
虽然可以存储各种对象,但实际上通常Collection
只存储同一类型对象。因此在JDK5之后新增了泛型(Generic) 语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。
- 泛型:可以在类或方法中预支的使用未知的类型。
一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认为Object类型。
使用泛型的好处
- 将运行时期的ClassCastException转移到了编译时期变成了编译失败。
- 避免了类型强转的麻烦。
public class Studen{
public static void main(String[] args){
List<String> studen = new ArrayList();
//给集合确定类型后,集合里面只能存储此类型的数据。
studen.add("张三");
studen.add("李四");
//集合已经确定元素类型,那么使用迭代器的时候也知道了要迭代哪元素类型
Iterator<String> it = studen.iterator();
while(it.hasNext()){
//当使用Iterator<String>控制元素后就不需要强转了,获取到的元素直接就是String类型。
String str = it.next();
System.out.println(str.length());
}
}
}
泛型,用来灵活的将数据类型应用到不同的类,方法,接口当中。将数据类型作为参数传递。
Java注解
Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java注解是从Java5开始添加到Java上的。
注解的语法
因为平常开发少见相信很多的帅哥美女们认为注解的地位不高。其实和class,interface一样,注解也属于一种类型。它是Java SE 5.0版本中开始引入的概念。
注解的定义
通过@interface 关键字进行定义。
public @interface TestAnnotation{
//形式跟接口很相似,不过前面多了个@符号。
//这创建了一个名为TestAnnotation的注解。
}
注解的应用
@TestAnnontation
public class Test{
//在类定义的上方加上注解,就可以使用该注解来注解这个类了。
}
元注解
元注解是基本注解,它可以应用到其他普通注解上去。元注解有:
- @Retention
- @Documented
- @Target
- @Inherited
- @Repeatable
@Retention
Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
它的取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
我们可以这样的方式来加深理解,@Retention 去给一张标签解释的时候,它指定了这张标签张贴的时间。@Retention 相当于给一张标签上面盖了一张时间戳,时间戳指明了标签张贴的时间周期。
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
上面的代码中,我们指定 TestAnnotation 可以在程序运行周期被获取到,因此它的生命周期非常的长。
@Documented
顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。
@Target
Target 是目标的意思,@Target 指定了注解运用的地方。
你可以这样理解,当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。
类比到标签,原本标签是你想张贴到哪个地方就到哪个地方,但是因为 @Target 的存在,它张贴的地方就非常具体了,比如只能张贴到方法上、类上、方法参数上等等。@Target 有下面的取值
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Inherited
Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
//注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。
@Repeatable
Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。
什么样的注解会多次应用呢?通常是注解的值可以同时取多个。
注解的属性
注解的属性也叫作成员变量,注解只要成员变量没有方法,注解的成员变量在注解的定义中以"“无形参的方法”"形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String msg();
}
//定义了 TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们进行赋值。
//赋值的方式是在注解的括号内以 value=”” 形式,多个属性之前用 ,隔开。
@TestAnnotation(id=3,msg="hello annotation")
public class Test {
}
注解中属性可以有默认值,默认值需要用 default 关键值指定。比如:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
public int id() default -1;
public String msg() default "Hi";
}
//TestAnnotation 中 id 属性默认值为 -1,msg 属性默认值为 Hi。
总结
俗话说好记性不如烂笔头,我更是烂记性了,所以我要把基础知识都当成笔记一样写在博客上面。加油!加油!加油!