Java基础复习(第四次)

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类型转换异常。由于集合中什么类型都可以存储。导致取出时强转引发运行时ClassCastExceptionCollection虽然可以存储各种对象,但实际上通常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{
	//在类定义的上方加上注解,就可以使用该注解来注解这个类了。
}
元注解

元注解是基本注解,它可以应用到其他普通注解上去。元注解有:

  1. @Retention
  2. @Documented
  3. @Target
  4. @Inherited
  5. @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。

总结

俗话说好记性不如烂笔头,我更是烂记性了,所以我要把基础知识都当成笔记一样写在博客上面。加油!加油!加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值