java笔记(2)

目录

22、泛型:

(1)泛型统配符(?):

(2)泛型接口:

(3)泛型方法:

23、单例设计模式

(1)饿汉式:

(2)懒汉式:

24、枚举:

25、异常:

(1)形式:

(2) 异常处理流程:

(3)throws关键字:

(4)throw关键字:

(5)throws与throw的区别:

(6)自定义异常类:

26、内部类:

(9)方法中的内部类:

(10)匿名内部类:

(11)Lambda表达式:

27、调试:


22、泛型:

意义:在JDK1.5之后正式引入,为了解决在向下转型时出现的ClassCasetException安全隐患,使用泛型就不会有强制性的类型转换

使用场景:一个消息发送类,可以接收发送的消息类型有int,double,String,那么此时就可以使用泛型进行定义此类

注意:如果使用了一个定义了泛型的类的时候,并没有给他设置泛型的具体类型,那么默认类型为Object

(1)泛型统配符(?):

意义:泛型通配符是为了解决引入泛型技术后,当定义泛型的类作为引用数据类型进行传递的时候造成的参数问题,例如:如果info () 接收的参数为Message<Integer>,而此时传入的类型为Message<String>,此时就会产生类型无法转换的错误。如果让info()方法重载Message<Integer>和Message<String>两种类型的参数,则又会出现不能重载的问题,因为在重载的参数规定中不包含泛型,所以虽然Message<Integer>和Message<String>定义的泛型类型不同,但是基本类型都是Message,因此不能重载。如果把接收的参数定义只是定义为info (Message m),此时虽然能够解决以上的参数传递问题,但是又会产生新的问题,假如此时传递的是Message<String>类型,是一个字符串,虽然能够传递成功,但是此时在info()方法中可以我们可以将Message类中的消息改为Integer类型。这样就造成了设置的类型与定义的类型不一致的情况。为了解决以上问题,java中引入了泛型通配符

(1)【类和方法】设置泛型的上限(?extends 类):只能够使用当前类或当前类的子类作为泛型类型

|- ”?extends Number ” :可以使用Number或者是Number子类实现泛型类型的定义

(2)【方法】设置泛型的下限(?super 类):只能够设置指定类或者其父类

|- “ ? super String ” :可以使用String或者其父类作为泛型类型

(2)泛型接口:

方式一:在子类上同样使用泛型定义:class MessageImpl<T> implements IMessage<T>

方式二:在子类上不定义泛型,但是继承时明确父接口的泛型类型:class MessageImpl implements IMessage<String>

(3)泛型方法:

23、单例设计模式

(1)饿汉式:

不管是否要使用,都在其内部提供一个实例化对象

(2)懒汉式:

只有在第一次使用的时候才会创建实例化对象

注意:如果是使用了synchronized关键字的懒汉式单例,如果是多线程环境,则可能会出现指令重排,导致出错,可以使用volatile关键字解决

24、枚举:

注意:枚举项必须写在类的首行,枚举的本质就是一个多例设计模式,而多例设计模式要求构造方法私有化,因此枚举中构造方法不能使用public修饰,否则编译报错

 

(1)在JDK1.5之后使用关键字enum来定义 enum TestEnum{ Red, Green, Blue}

 

(2)可以使用 类名.对象 来获取对象信息,会默认调用toString()方法,默认返回的就是枚举对象的名称

(3)枚举中提供有values()方法用于获得所有对象的值

(4)在java中通过enum关键字 定义的枚举类,严格意义上讲,从本质上相当于一个类继承了Enum父类结构

(5)枚举类可以继承接口,也可以在类中定义抽象方法(每个枚举项要求覆写其抽象方法)

(6)Enum类是一个抽象类,但是其中并没有定义抽象方法,之所以把他定义为抽象类是因为并不想此类被直接使用

 

 

25、异常:

(1)形式:

【try catch】【try finally】 【try catch finally】

 

(2) 异常处理流程:

|- 当异常产生之后会由JVM根据异常的类型自动的实例化一个异常类的对象(所以控制异常对象的个数对性能提升很有必要)

|- 如果当前的程序代码之中已经明确的提供了异常处理语句的格式,那么就对异常进行捕获,如果没有提供异常处理语句,那么会自动的将此异常对象交由JVM进行默认处理,而默认处理的方式为:输出异常信息,同时中断程序的执行

|- 如果此时的代码中存在有异常处理结构,则会通过try语句捕获当前的异常类的实例化对象,同时对于异常产生之后的代码也将不再继续执行,而是进入catch异常类型匹配

|- 如果在try语句之后定义有catch语句,那么会自动利用捕获到的实例化对象与catch中捕获的异常类型进行匹配,如果匹配成功则使用当前的catch进行异常处理,如果匹配不成功,则交由下一个catch继续匹配

|-不管是否存在有匹配的catch的异常类型,最终都要执行finally中的代码

|- 如果所有异常都已经配catch匹配处理过了,那么就可以继续向下执行其他的操作代码,而如果有没有匹配处理过的异常,那么久表示当前的异常处理结构无法处理此异常,则会交由JVM进行默认处理

注意:清楚了整个异常处理流程之后,实际上就会发现所谓的异常捕获和匹配就属于对象与类之间的匹配关系(用instanceof关键字匹配某对象是否属于某个类的实例)

注意:如果使用try catch形式来捕获多个异常,那么范围大的异常一定要放在范围小的异常之后,否则编译时会出错

(3)throws关键字:

注意:仅仅定义在方法上

 

此处在div() 方法上使用throws关键字抛出异常,表示明确的告诉调用出,我这里有异常,需要进行处理,如果调用出没有进行处理,则无法进行正常的编译。如果调用出没有使用try catch的异常处理结构进行处理,则可以在调用处的方法上使用throws关键字将异常向上抛出,如果是主方法,则会交由JVM处理

注意:如果异常属于RuntimeException的子类,不会强制性要求调用处进行异常处理

 

(4)throw关键字:

为什么会要有throw关键字来手工进行异常抛出:java中并不是所有的异常都会自动进行异常对象实例化,因为有一些异常是需要产生了某些问题之后才有可能出现,所有此时在java中提供有一种手工实例化异常类的操作功能,而这个功能就必须通过throw关键字来完成

 

 

(5)throws与throw的区别:

(6)自定义异常类:

 

26、内部类:

优点:使用内部类可以很方便的访问外部类中的私有操作结构

缺点:破坏了程序的完整结构

(1)内部类可以方便的访问外部类的私有结构,同样,外部类也可以方便的访问内部类的私有结构

(2)内部类除了可以在外部类中直接实例化以外,还可以直接在外部类的外部直接实例化内部类

|- 外部类.内部类 内部类对象 = new 外部类() . new 内部类()

(3)如果内部类使用private修饰,那么表示此类只能被外部类使用,而不能被其他类使用

(4)在进行成员属性访问的过程中,一般都强调通过“this.属性"的方式进行本类属性的标注,但是如果说是通过内部类访问外部类中的成员属性,则这个时候的this就必须更换为 ”外部类.this.属性“ 的结构

(5)接口和抽象类中也可以定义内部结构

(6)内部接口和内部抽象类可以定义在任意的结构中(普通类,接口,抽象类)

(7)使用static定义的内部类就相当于一个外部类:

 

(8)内部类可以定义任何结构中:类,接口,抽象类,方法,代码块

(9)方法中的内部类:

方法中的内部类可以访问方法中的处理参数,在JDK1.8之后这些参数可以直接访问,而在JDK1.8以前,如果方法中的内部类需要访问方法中的参数或者是方法的变量,那么这些变量或者参数前就必须追加final关键字,否则会出现错误。

注意:之所以会有这样的改变,主要是为了引入函数式编程结构

(10)匿名内部类:

传统的匿名内部类使用:

 

(11)Lambda表达式:

 

注意:使用Lambda表达式编程时,要求接口中只能有一个抽象方法。这样的接口叫做函数式接口,通常用@FunctionalInterface标记

为了解决函数式编程单抽象方法的局限,在JDK1.8以后可以定义有default普通方法,以及static公共方法

(12)系统级方法引用;就是引入已经存在的方法实现,将他变成函数式接口中方法的实现

 

(13)内建函数式接口:

通过不断的发展,用户发现,用到的函数式接口就那么几个,所以针对这些常用的功能,系统提供了内建函数式接口,所有的接口都被定义在java.util.function包中,这个包中只有四大类的核心接口:Function、Consumer、Supplier、Predicate

27、调试:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值