第六章:面向对象(下)
6.1 static关键字
static 可以修饰属性、方法、代码块、内部类
被static修饰后成员的特点:
- 随着类的加载而加载
- 优先于对象存在
- 修饰的成员,被所有对象共享
- 访问权限允许时,可不创建对象,直接被类调用
类变量:由该类的所有实例共享
类变量的默认值:
- byte、short、int、long --------默认值为 0
- float、double-------默认值为 0.0
- char ------- 默认值为 0 (Unicode编码)
- boolean -------- 默认值为false
类方法:
- 没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类标记
- 在static方法内部只能访问类的static属性,不能访问类的非static属性
- static方法内部不能有this和super
6.2 单例设计模式
**单例:**一个类只有一个对象
**饿汉式单例:**适用于创建对象代价小
- 1.防止外部new对象,封装构造器(private)
- 2.只能在类的内部new对象并用静态属性为引用指向唯一对象
- 3.提供一个公共的静态方法,用于获取唯一对象的引用地址的副本
**懒汉式单例:**适用于创建对象代价大
- 1.防止外部new对象,封装构造器(private)
- 2.声明私有的静态的指向本类对象的引用为属性,但是不创建对象
- 3.提供公共静态方法,用于获取唯一对象. 只有第一次使用时才创建唯一对象
6.3 类的成员之四—初始化块
**初始化块的作用:**对Java对象进行初始化
非静态块:(无static修饰)
- 可以有输出语句
- 可以对对象的属性、对象的声明进行初始化操作
- 可以调用静态变量或方法
- 若有多个非静态的代码块,按照从上到下的顺序依次执行
- 每次创建对象时,都会执行一次,且先于构造器执行
静态块(有static修饰):
- 可以有输出语句
- 可以对类的属性、类的声明进行初始化操作
- 不可以对非静态的属性初始化
- 若有多个静态的代码块,那么按照从上到下的顺序依次执行
- 静态代码块的执行要先于非静态代码块
- 静态代码块只执行一次
static{
//静态初始化块
//<clinit> 类初始化器,在加载类时执行唯一一次
}
{
//非静态初始化块
}
* 一个类中初始化块若有修饰符,则只能被static修饰
* 当类被载入时,类属性的声明和静态代码块先后顺序被执行,且只执行一次
程序的执行流程:
- 声明成员变量的默认值
- 显示初始化、多个初始化块依次被执行(先后顺序)
- 构造器再对成员进行赋值操作
6.4 final关键字
使用:
- final标记的类不能被继承
- final标记的方法不能被子类重写
- final标记的变量即成为常量(名称大写且只能被赋值一次)
- finaL修饰的量称为全局常量
6.5 抽象类
**抽象类:**用abstract修饰的类
抽象方法:
- 用abstract修饰的方法
- 只有方法声明,没有方法实现
特点:
- 含有抽象方法的类必须被声明为抽象类
- 抽象类不能被实例化,抽象类是用来被继承的
- 抽象类的子类必须全部重写父类中的抽象方法,并提供方法体
- 不能用abstract修饰属性、私有方法、构造器、静态方法和final修饰的方法
**抽象类成员:**属性、构造器、具体方法、抽象方法
抽象类与具体类:
- 具体类:对现实世界一种实体的抽象定义
- 抽象类:对现实世界某一类的多种实体的统一抽象定义
6.6 接口
具体类:某种事物的描述
抽象类:某类不同种事物的描述
接口:不同类不同种事物的共同行为
注意事项
- 接口中只允许公共抽象方法和全局常量
- 先继承再实现,可以实现多个接口,从而达到多重继承的效果
- 接口通常表达某种能力、功能或标准、规范
- 接口中的内容必须公开
**面向接口编程:**无视子类的个性,把子类对象多态为接口类型的对象,无差别使用各种对象
6.7 类的成员之五—内部类
**成员内部类:**声明在类中方法外的内部类
- 嵌套类:有static修饰的成员内部类, 隶属于外部类
- 普通内部类:没有static修饰的成员内部类, 隶属于外部类的对象
**局部内部类:**声明在方法中的内部类
- 普通局部内部类:
- 匿名内部类:某个接口临时写一个具体实现子类,对象也是一次性使用
6.8 枚举
**枚举:**对象可数的特殊类型
和switch配合使用
switch (变量) { 变量的数据类型必须是非long整数, 字符串, 枚举
case 常量 :
语句块;
break;
}
6.9 注解
**注解(annotation):**特殊的注释,可以被编译器和JVM识别,不参与程序运行
- @Override:提醒编译器作方法覆盖的条件的检查,只用于方法
- @Deprecated:提醒使用者,修改的目标已经不再推荐使用了
- @SuperressWarnings(String[] ):抑制编译器警告
**元注解:**限制注解的注解
- @Target:目标,限定注解的作用范围
- TYPE —类
- FIELD — 用于属性
- METHOD — 用于方法
- PARAMETER — 用于参数
- CONSTRUCTOR — 用于构造器
- LOCAL_VARIABLE — 用于局部
- @Retention:停留期,限定注解的生命周期
- RetentionPolicy = SOURCE – 只停留在源文件中,生成的class中没有注解
- RetentionPolicy = CLASS – 可以停留在类文件中, 但是不能在运行被VM识别, 默认行为
- RetentionPolicy = RUNTIME – 停留期最长的, 可以在运行时被VM识别并反射式处理它