静态变量、方法与初始化程序块
final 关键字
抽象类
Interface
package
泛型与集合类
枚举类型
包装类与自动装箱和拆箱
注解Annotation
var局部变量类型推断
一、静态变量、方法与初始化程序块
1、类变量(static /class variable)、类(class/static)方法
在该类所有实例之间是共享的。在加载该类时,只分配一次空间,并初始化。
![](https://img-blog.csdnimg.cn/img_convert/e6b128e188e3440bb42706119b3e326e.png)
类变量可用来在实例之间进行通信或跟踪该类实例的数目。
![](https://img-blog.csdnimg.cn/img_convert/bcd0b399fb5641f1b7d070fad036e8a4.png)
类变量可以是public 或private
对于public 类型的类变量,可以在类外直接用类名调用而不需要初始化。
![](https://img-blog.csdnimg.cn/img_convert/2ebb12054c9b4f25ad933ec072cc66ed.png)
可以直接被调用,而不需要生成任何实例。
![](https://img-blog.csdnimg.cn/img_convert/5e4f653810ab48c0b805a088c840c299.png)
2、静态初始化程序
没有存在于任何方法体中的静态语句块。在加载该类时执行且只执行一次。
![](https://img-blog.csdnimg.cn/img_convert/6c36d2992cb94fdcb16674d52d3390a4.png)
二、final 关键字
被定义成final的类不能有子类。
![](https://img-blog.csdnimg.cn/img_convert/03753ac8d69748f99e96e1ee9ef3b061.png)
被定义成final 的成员方法不能被重写。
被定义成final的成员变量不能改变。该变量实际上是常量,一般大写,并赋值。
final int NUMBER = 100;
三、抽象类
一个类如果只声明方法而没有方法的实现,则称为抽象类。
必须在声明中增加 abstract 关键字,在无方法体的方法前也要加上abstract。
![](https://img-blog.csdnimg.cn/img_convert/8542327528304702b0164dc98271e976.png)
抽象类也可有普通的成员变量或方法。
抽象类不能直接用来生成实例。一般可通过定义子类进行实例化。
可以生成抽象类的变量,该变量可以指向具体的一个子类的实例。
![](https://img-blog.csdnimg.cn/img_convert/9dcb89ef9eaf4c41a4a87da0e2f811a0.png)
四、接口 interface
Interface 是在抽象类概念的基础上演变而来的。
一个interface所有成员方法都是抽象的,并且只能定义 static final 成员变量。
![](https://img-blog.csdnimg.cn/img_convert/1c10874d07d7447eb0a88495cb32e643.png)
1、interface 的含义:
interface定义了一组行为的协议。两个对象之间通过这个协议进行通信。
interface 不属于类层次结构。不相关的类可以实现相同的接口。
![](https://img-blog.csdnimg.cn/img_convert/126a9f86df3442e6a12e5173982670d0.png)
2、实现interface:
用implements代替extends声明子类,该子类中必须实现接口(及其超类)中的所有方法。
![](https://img-blog.csdnimg.cn/img_convert/041db6f3bd1149ba96f09d7e78dede34.png)
3、接口与多重继承:
可以通过实现接口实现多重继承:一个类可只继承一个父类,并实现多个接口。
interface I1{ … };
interface I2{ …};
class E{ ….} ;
class M extends E implements I1,I2 { …}
![](https://img-blog.csdnimg.cn/img_convert/603a1e3e15fc481d95fb29dc20f7105e.png)
4、interface的使用:
interface可以作为一种数据类型使用。
![](https://img-blog.csdnimg.cn/img_convert/edd26b071f1842798b6f277793911385.png)
5、interface 与多态:
一个interface 可作为类名使用,实现多态。
![](https://img-blog.csdnimg.cn/img_convert/018780e458d14250b6fa37a0a0f4bdf7.png)
6、Interface 中注意问题:
不能向interface定义中随意增加方法
![](https://img-blog.csdnimg.cn/img_convert/019fa65382424ac9815b336aeaaa257c.png)
7、利用缺省方法扩展接口:
Java SE 8 (JDK1.8)引入缺省方法(default method),解决接口的扩展问题
可以向已经发布并存在实现(implement)类的接口中,增加缺省方法,而不需要这些已存在的实现类做任何修改
缺省方法的定义与使用:
定义方式:在方法的声明前面使用default关键字
缺省方法不是抽象方法,是具有方法体的普通方法
所有实现这个接口的类,都将继承缺省方法并可以直接使用
接口的实现类中可以重写缺省方法
![](https://img-blog.csdnimg.cn/img_convert/8e1851075a1c40b9be40d4832b938d50.png)
8、接口中的静态方法:
在Java SE 8以后的版本中,还可以在接口中定义静态方法(static method)
可以用来定义接口的通用方法
不能被实现接口的类或子接口继承
定义与用法与类中的static方法一样,通过接口名访问
五、package
1、类分组 package 语句
包(package)是相关类与接口的一个集合,它提供访问控制与命名空间管理。
Java平台中的类与接口都是根据功能以包组织的。
包机制的好处:
程序员容易确定包中的类是相关的,并且容易根据所需的功能找到相应的类。
每个包都创建一个新的命名空间,因此不同包中的类名不会冲突。
同一个包中的类之间有比较宽松的访问控制。
2、创建包
用package语句指定源文件中的类属于一个特定包:
package 包名
包定义语句在每个源程序中只能有一条, 即一个类只能属于一个包。
包定义语句必须在程序的第一行(之前可有空格及注释)。
包名用“.” 分隔。
3、import 语句
将package 引入源程序,格式:
import 包名.*;
import 包名. 类名;
import 语句必须在源程序之前,在package 声明之后。
[package ….. ] //缺省是package .
[import …. ] //缺省是import java.lang.*
[类声明… ]
...
4、包名与包中类的存储位置
包分隔符相当于目录分隔符,包存储的路径由包根路径加上包名指明的路径组成。
包的根路径由CLASSPATH环境变量指出。
package abc.financeDept
%CLASSPATH%\abc\ financeDept
5、源文件(.java)与类文件(.class)的管理
源文件可以按照包名指明的路径放置。如
![](https://img-blog.csdnimg.cn/img_convert/b881eedf92394cd5a48d05ad5ec1287d.png)
类文件也将放在反映包名的一系列目录下。
![](https://img-blog.csdnimg.cn/img_convert/7e30091ba77b4dee815ca2ebd44688d6.png)
一般将源文件与类文件分别存放,可采用如下方式:
![](https://img-blog.csdnimg.cn/img_convert/09dd4a48535b4f3db8cbe538927503a3.png)
六、泛型与集合类Collection API
泛型即泛化技术(Generics),通过一种类型或方法操纵各种类型的对象,而同时又提供了编译时的类型安全保证。
泛型技术的基本思想是类和方法的泛化,是通过参数化实现的,因此泛型又被称为参数化类型
优点:
编译时的严格类型检查
消除了绝大多数的类型转换
![](https://img-blog.csdnimg.cn/img_convert/2ffbef7353614299a3ab84eaed8d5989.png)
1、泛型的定义与使用
泛型的定义与普通类定义相比,在类名后增加了由尖括号标识的类型变量,一般用T表示
![](https://img-blog.csdnimg.cn/img_convert/7b31a94ae1114bf2939968462da855c9.png)
泛型在使用时,必须像方法调用一样执行”泛型调用“, 将泛型中的类型变量T替换为具体的类、接口等
![](https://img-blog.csdnimg.cn/img_convert/e1a16c11a0904b4489519f2159395257.png)
2、泛型与集合类Collection API
一个集合类对象表示了一组对象,相当于一个容器。
Java Collections API的核心接口支持泛型,并且形成了两个独立的树型结构
![](https://img-blog.csdnimg.cn/img_convert/a9e2149b4e814c9ca32eaeeae307b394.png)
(1)Set
Set不能包含重复的元素。
Set的实现:HashSet和TreeSet等
Set 接口定义:
![](https://img-blog.csdnimg.cn/img_convert/6016f05a2b534c7bb14159f2ff469aff.png)
(2)List
List是有序的集合,元素可以重复。
List接口定义:
![](https://img-blog.csdnimg.cn/img_convert/9f2da3fa489d49e7af8f687e022005c9.png)
List的实现: ArrayList, LinkedList,Vector
(3)Map
Map把键值映射到某个值。一个键值最多只能映射一个值。
Map 接口定义:
![](https://img-blog.csdnimg.cn/img_convert/a79e82c53a2044aab62167c247149c66.png)
Map的实现:HashMap, TreeMap, HashTable等
七、枚举类型
一般用于表示一组常量。一个枚举声明实际上定义了一个类。
定义:
![](https://img-blog.csdnimg.cn/img_convert/08ecfea8fc604e3c8370246b4d6e9dc8.png)
枚举类型的方法
所有的枚举类型都缺省继承于java.lang.Enum类。Enum 直接继承java.lang.Object且实现了java.lang.Comparable接口。编译器在创建一个枚举时也将自动加入一些特殊的方法, 如values()
enum Week{
SUNDAY,MONDAY,TUESDAY,WEDNESDAYTHURSDAY,FRIDAY,SATURDAY
}
public class HelloWorld {
public static void main(String []args) {
for(Week w:Week.values()){
System. out.print ( w.name()+",");
}
System.out.println ( );
}
}
八、JDK1.6中的自动装箱与拆箱
1、Wrapper类
Wrapper将基本类型表示成类。
每个wrapper类对象都封装了基本类型的一个值。
![](https://img-blog.csdnimg.cn/img_convert/35dca54d4d954481bb1f59377a9c7f73.png)
Wrapper类中包含了很多有用的方法和常量。
如数字型Wrapper类中的MIN_VALUE 和 MAX_VALUE 常量,定义了该类型的最大值与最小值。byteValue, shortValue方法进行数值转换,valueOf 和 toString 实现字符串与数值之间的转换。
![](https://img-blog.csdnimg.cn/img_convert/7ddf3193544b44e09fa70ebf17f7ad4f.png)
2、装箱与拆箱
装箱(Box):把基本类型的数据通过相应Wrapper类形成对象
拆箱(Unbox):把一个Wrapper类对象中的基本数据类型提取出来。
自动装箱与拆箱
Integer i = 10;
int j = i;
3、= = 运算符与equals( )方法
equals() 和 = = 比较两个引用是否指向相同的对象。
equals()方法在String, Date, File, 所有Wrapper类都重写了该方法,改为比较内容。
九、注解Annotation
1、注解Annotation的作用与格式
![](https://img-blog.csdnimg.cn/img_convert/629e3ebaa68d4861b86a25fb13ea1d9a.png)
2、注解类型的定义
注解类型的定义由三部分构成:
继承java.lang.annotation.Annotation的接口;在注解类的声明中由@interface 表示
利用枚举类型ElementType指定该注解类型可以标注的声明类型,包括TYPE、 FIELD 等 8个元素,每个元素表示一种声明;由Java定义的注解类型@Target给出
利用枚举类型RetentionPolicy指定该注解类型的保存方式或称为作用域,包括SOURCE, CLASS和RUNTIME等3个元素;由Java定义的注解类型@Retention给出
示例:注解类型SomeAnnotation ,标注的声明类型是ElementType.TYPE,保存方式是RetentionPolicy.RUNTIME
![](https://img-blog.csdnimg.cn/img_convert/fa1494873d8b4c32b931e63d41bbef12.png)
3、Java中定义的注解类型
Java中定义了一组注解类型,主要有两种用途:
用于Java程序代码的注解,目的是向Java编译器提供信息
包括@Deprecated, @Override,@SuppressWarnings等。例如,@Override 只能标注方法,通知编译器该方法重写父类中的方法:
@Override
int overriddenMethod() { }
用于标注其他注解的注解类型,被称为元注解(meta-annotation)
包括@Target、 @Retention、@Deprecated、 @Override、@Documented等。例如,@Target声明了被标注注解类型能够注释的声明类型,@Retention声明了所标注注解类型的存储方式
十、var局部变量类型推断
Java SE 10以后的版本,可以使用var标识符声明带有非空初始化的局部变量,变量的类型从上下文推断得到,例如:
![](https://img-blog.csdnimg.cn/img_convert/8091025d059e48dfbe1cc204ca051e7b.png)
使用范围:
可以用于带有初始化的局部变量,增强for循环中的索引变量,以及传统for循环中声明的局部变量;
不能用于方法与构造方法的形参、方法的返回类型、类成员变量、catch的形参以及其他类型的变量声明