JavaSE高级部分

1.泛型

2.枚举

3.多线程

4.集合(数据结构:树,二叉树,红黑树,B+树,B-树,图)

5.IO流(文件)

6.反射和注解

7.网络通信Socket(tomcat)

泛型(Generics)

之前写的超级数组中要么只能存数字,要么啥都能存(鸡肋)。利用泛型解决

下面是泛型的思维导图

什么是泛型?

泛型广泛的、普通的类型,泛型能够帮助我们把【类型明确】的工作推迟到创建对象或者调方法的时候。

定义类时,不需要考虑这个数组到底要存什么类型,创建这个超级数组对象的时候把里面窑村的数组的类型确定下来。

泛型的修饰:

1.泛型类

2.泛型方法

3.泛型接口

泛型类就是把泛型定义到类上,用户在使用类时才能把类型给确定。

具体的使用方法<>中加上一个未知数。通常用T K V E等大写字母表示,实际上用什么都行,只要是个单词就可以。

现在这个超级数组的类就是一个泛型类。

当我们在一个类后面加上了泛型<T>,这个T就是一个数据类型。

既然T就是一个数据类型,那我们就可以拿过来用。(当做正常的数据类型来使用)

声明了一个T类型的变量t(用的不多)

如果一个泛型类,在创建对象的时候没有指定泛型类型,默认还是Object,那么在使用这个类时,去确定泛型类型。

泛型的确定

这个超级数组superArray1只能存Employee类型

在JDK7以后,可以省略等号右边的泛型的声明,<>必须写(规范)

泛型方法

我们如果只关心某个方法,可以不定义泛型类,只定义一个泛型方法。

泛型方法不是一定要在泛型类里;泛型类里不一定要有泛型方法。

 

在定义泛型方法时,首先去定义泛型类型。

定义在方法中间,定义在泛型的使用处之前,代码如下图

定义泛型方法,一定要传参,否则返回值报错(可以抛异常)

传泛型类型的参数

拿着这个t在方法中做好多事情,再把t返回回去调用另一个方法

使用泛型方法最好要结合返回值,和Object一样

泛型的一些特殊情况

出现继承关系(泛型和继承之间没有强制的关系)

泛型类在继承是时:

1.父类是一个泛型类,子类要不要都是泛型类?

2.永远记住,泛型的声明只能在当前类名后或者方法中间,而且声明的泛型是自己的

3.在子类继承父类时,子类泛型和父类泛型都写出来的情况下,父跟子

4.如果在继承时,没有写出任何泛型,当前子类就不是泛型类

在确定子类泛型的时刻,父类的泛型和子类一样(如下图)

如果在一个泛型类中,尽量就不要再使用泛型方法

泛型方法多数都是出现在非泛型类

静态泛型方法

1.静态方法如果是泛型方法,泛型的声明必须写

2.因为静态结构是属于类的,不属于某个对象

“ ? ”:通配符

可以接收任何类型。如果使用Object类型,别写泛型。泛型约束类的数据类型。

可以约束子类和父类

是xxx的子类用ectends;是xxx的父类用super

类型擦除:

为了兼容性,使用到原始类型(没有泛型)是可以的

在泛型刚刚出现时,还存在着大量的不适用泛型的代码

为了保证代码的兼容性,将参数化的类型的实例传递给设计用于原始类型的方法必须是合法的。

 

为了保持兼容性,在Java泛型中,其实有一张类似伪泛型,因为Java在编译期间,所有而泛型都会被擦掉。

Java的泛型语法是在编译期这个维度上实现的。

正常来说在生成的字节码文件中,不包含泛型的类型信息

 

在JVM中看到的只是SuperArray,由泛型附加的类型信息对JVM是看不到的

可以理解为,泛型的本质就是让程序员在编写代码时遵守的一个规则。

比如SuperArray:在确定了泛型之后,这个超级数组中就统一只放同一类型的数据,如果放入其他类型的数据,编译不通过。

 

要求:

  1. 泛型不能是基本数据类型(用包装器类型)

  原则上来说,数组可以作为泛型;语法角度,数组不能作为泛型

  < >里面放的就应该是类名,数组是在编译后才会生成一个类($xxxx)

  1. 方法的重载:
  • 在同一个类里
  • 方法名相同
  • 参数不同

  原理:类型擦除

  1. 在多态上

 

泛型的应用场景:

  1. 发生在父类或者接口中,起到的是一个规范的作用,对里面的数据类型没有明确要求
  2. 容器类(超级数组、链表、队列、栈)

总结:当类型无法确定时,使用泛型。开发中,我们更多的是会使用到一些泛型类或泛型接口。

接口中存储的一定是大家都能用的

以后我们面向接口编程,接口里的方法不能出现实现类中方法体为空的情况

 

枚举类型

应用场景:在某些情况下,一个类的对象的个数是有限的。如季节(春夏秋冬)、24节气、星期。

规定这个类的对象的个数

枚举类不能写主方法,关键字enum

枚举中默认的构造器都是私有化的

枚举中不需要无参构造器

枚举类中把需要用到的对象声明出来。会写对应的构造器,可以有set、get方法

 

枚举在switch中使用

枚举类的命名规则:所有的枚举类要以Enum结尾

枚举的静态导入

 

使用枚举类实现单例模式(代码如下)

枚举的优势

(强制要求)所有的枚举类型字段必须要有注释,说明每个数据项的用途

1.int类型不具备安全性。

假如某个程序员在定义int时,少写了final,会存在被他人修改的风险。如果是枚举类,它天然就是一个常量类(无法被修改)

2.使用int类型,定义的语义不够明确。

如果说在控制台打印输出1,枚举里面都是常量,都是静态的。推荐枚举的比较使用“==”,equals会比值