2.1 封装
封装是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象的内部,不允许外部程序直接访问对象的内部信息,只能通过该类所提供的方法来实现对内部信息的操作和访问。
2.1.1 访问控制符
访问控制级别的详细介绍如下:
- private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符修饰,则这个成员只能在当前类的内部被访问。
- 默认(包访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限的,default访问控制的成员或外部类可以被相同包下的其他类访问。
- protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员即可以被同一个包中的其他类访问,也可以被不同包中的子类访问。用protected修饰的方法,是希望子类重写这个方法。
- public(公共访问权限):如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类可以被所有类访问。
注意:外部类只能有两种访问控制级别:public和默认。
2.1.2 package、import 和 import static
包(package)
- Java引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。
- 包名应该全部是小写字母,而且应该由一个或多个有意义的单词连缀而成。
- 同一个包下的类可以自由访问,不同包下的类相互访问时需要添加包前缀。
import
- Java引入了import关键字,import可以向某个Java文件中导入指定包层次下某个类或全部类。
- import语句中的星号(*)只能代表包下的全部类,不能代表包。
- import语句应该出现在package语句之后,类定义之前。
import static
- JDK 1.5 之后增加的import static用于导入指定类的某个静态成员变量、静态方法或全部的静态成员变量、静态方法。
- import static语句中的星号(*)只能代表类中全部的静态成员变量和静态方法。
- import static语句应该出现在package语句之后,类定义之前。
2.2 继承
继承是实现软件复用的重要手段。Java的继承使用extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类。父类和子类的关系,是一种一般和特殊的关系。
Java只能有一个直接父类,但可以有多个间接父类。
2.2.1 方法重写
子类包含与父类同名方法的现象被称为方法重写。
方法名相同,形参列表相同。子类方法的返回值类型应比父类方法的返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。子类方法的访问权限应比父类方法的访问权限更大或相等。
覆盖方法和被覆盖的方法要么都是类方法,要么都是实例方法,不能一个是类方法一个是实例方法。
如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super调用被覆盖的实例方法或使用父类类名调用被覆盖的类方法。
子类无法重写父类中private修饰的方法,即使定义一个相同的方法,也是在子类中重新写了一个新方法。
如果父类构造器调用了希望被子类重写的方法,则调用的是被子类重写后的方法。
2.2.2 super 限定
super用于限定该对象调用它从父类继承得到的实例变量或实例方法。如果在构造器中使用super。则super用于限定该构造器初始化的是该对象从父类继承得到的实例变量。
通过super调用父类构造器的语句必须出现在子类构造器的第一句。super不能出现在static修饰的方法中。当调用子类构造器来初始化子类的对象时,父类构造器总会在子类构造器之前执行。
2.3 多态
相同类型的变量,调用同一方法是呈现出多种不同的行为特征,即为多态。与方法不同的是,对象的实例变量不具备多态性。
2.3.1 instanceof运算符
instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类,也可以是一个接口。
instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系。不在同一继承树的对象和类用instanceof比较时,编译不通过。
2.4 初始化块
初始化块只能用static修饰,使用static修饰的初始化块被称为静态初始化块,用于对类变量进行初始化,不能对实例变量进行初始化。初始化块对对象进行初始化。初始化块是在类初始化或创建对象时隐式执行的,而且初始化块在执行构造器之前执行。
初始化块的代码在编译后,会被还原到每个构造器中,位于构造器中所有代码的前面。
执行顺序:
- 前面定义的初始化块先执行,后面定义的初始化块后执行。初始化块中成员变量的赋值语句和声明成员变量时指定的初始值,赋值顺序与它们在源代码中的排列顺序相同。
- 创建实例时,系统先执行父类的初始化块,后执行父类的构造器,再执行子类的初始化块和构造器。初始化类时,系统先执行父类的静态初始化块,后执行子类的静态初始化块。
2.5 Object类
Java对象都是Object类的实例,都可以直接调用类中定义的方法,这些方法提供了处理Java对象的通用方法。
toString方法
Object类提供的toString()方法总是返回该对象实现类的“类名+@——hashCode”值,子类中可以重写此方法返回对象的详细信息。
==和equals方法
对于两个基本类型的变量,只要它们的值相等,==判断就返回true;对于两个引用类型的变量,只有它们指向同一个对象时,==判断才会返回true。==不可以比较类型上没有父子关系的两个对象。
使用equals()方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。但String类重写了该方法,所以String类的equals()方法判断字符串对象的字符序列,只要字符序列相同就返回true。
2.6 final修饰符
final修饰的变量不可改变,一旦获得了初始值,该final变量就不能被重新赋值。final修饰基本类型时,不能对基本类型变量重新赋值;final修饰引用类型变量时,此变量引用的对象的地址不能被改变,但这个对象完全可以发生改变。
2.6.1 final成员变量
final修饰的成员变量必须由程序员显式地指定初始值,系统不会对final修饰的成员变量进行隐式初始化。
final修饰的类变量、实例变量指定初始值的时机如下:
- 类变量:必须在静态初始化块中指定初始值,或声明该类变量时指定初始值,而且只能在两种方法中执行其中一种。类变量不能再非静态初始化快中指定初始值。
- 实例变量:必须在非静态初始化块、声明该实例变量或构造器中指定初始值,而且只能在三种方法中执行其中一种。如果非静态初始化块中为实例变量指定了初始值,则不能再在构造器中为该实例变量指定初始值。
2.6.2 final局部变量
如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能赋值一次;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。
2.6.3 可执行“宏替换”的final变量
如果某个变量使用final修饰符修饰,在定义该final变量时指定了初始值,并且该初始值可以在编译时就被确定下来,那么这个变量相当于一个直接量。
除final变量赋值时赋直接量的情况外,如果被赋的表达式只是基本的算术表达式或字符串连接运算,没有访问普通变量,也没有调用方法,那么Java编译器同样会将这种final变量当成“宏变量”处理。
2.6.4 final方法
final修饰的方法不可被重写。
如果父类中由一个用final修饰的private方法,那么子类中可以定义一个和此方法具有相同方法签名的方法。因为父类中private的方法在子类中不可见。
2.6.5 final类
final修饰的类不能被继承。
网友评论