Java中类的特性
1. 访问控制
私有成员:
通过关键字 private
来声明。无法从类的外部访问到私有成员,只能被该类自身访问和修改。即使是该类的子类也无法对私有成员进行获取或引用,从而达到了对数据最高级别保护的目的。
公有成员:
通过关键字 public
来声明。公有成员可以被所有其他的类所访问,会造成安全性和数据封装性的下降,应尽量减少使用。
保护成员:
通过关键字 protected
来声明。被保护的成员只能够被它自己所在的类及其子类或同一包中的其他类访问,在子类中可以覆盖此变量。
缺省访问控制符:
若类的成员前面不加任何访问控制符,则其具有缺省的访问控制特性。该控制权表示这个成员只能被同一个包(类库)中的类所访问和调用。同理,对于一个类来说,如果它没有访问控制符,则它也只能被同一个包中的类访问和引用。
2. 方法重载 (Overloading)
重载是实现多态的一种方法,这些方法具有相同的名称,但是形参不同。方法的重载中参数的类型是关键,参数列表必须不同。这里的的不同分为以下情况:
- 参数个数不同
- 参数个数相同,但类型不同
- 参数顺序不同
3. 构造方法
构造方法是一种特殊的、与类名相同的方法,专门用于在创建对象时,完成初始化工作。构造方法有如下特殊之处:
- 构造方法名与类名相同
- 构造方法没有返回值,但不能写
void
- 构造方法的主要作用时完成对类对象的初始化工作
- 构造方法一般不能由编程人员显示直接地调用,而是由
new
来调用 - 在创建一个类的对象的同时,系统会自动调用该类的构造方法为新对象初始化
3.1 从一个构造方法调用另一个构造方法
- 通过
this
关键字来调用 -
this
关键字必须写在构造方法内的第一行位置
3.2 私有构造方法
构造方法一般都是共有的,如果构造方法被声明为 private
,则无法在该构造方法所在的类以外的地方被调用,但在该类的内部还是可以被调用的。
4. 静态成员
被 static
关键字修饰的成员被称为静态成员,也成为类成员;不被修饰的成员叫做实例成员。
4.1 静态变量
静态变量是隶属于类的变量,而不是属于任何一个类的具体对象。也就是说,对于该类的任何一个具体的对象而言,静态变量是一个公共的存储单元,不是保存在某个对象实例的内存空间中,而是保存在类的内存空间的公共存储单元中。
对于静态变量的使用,建议采用 类名.变量名
的形式来访问。
4.2 静态方法
用 static
修饰符修饰的方法是属于类的静态方法,又称为类方法。静态方法有如下几重含义:
- 静态方法是属于整个类的,它在内存中的代码段将被所有的对象所共用,而不被任何一个对象所专用
- 由于静态方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员,而只能处理属于整个类的成员。因此静态方法只能访问静态变量,不能访问实例变量
- 在静态方法中不能使用
this
或super
关键字 - 对于静态方法的使用,建议采用
类名.方法名
的形式来访问
4.3 静态初始化器
静态初始化器是由关键字 static
修饰的一堆大括号 {}
括起来的语句组,它与构造方法有几点根本的不同:
- 构造方法是对每个新创建的对象进行初始化,而静态初始化器是对类自身进行初始化
- 构造方法是在用
new
运算符创建对象时由系统自动执行,而静态初始化器一般不能由程序来调用,它是在所属的类被加载入内存时由系统调用执行的 - 用
new
运算符创建多少个新对象,构造方法就被调用多少次,但静态初始化器则在类被加载入内存时只执行一次,与创建多少个对象无关 - 静态初始化器不是方法,因而没有方法名、返回值和参数
一般来讲,Java在新建一个对象的时候各个初始化方法的执行的顺序为:
父类的静态初始化器 子类的静态初始化器 父类的构造函数 子类的构造函数
这里我们来看一个例子:
class Shape {
Shape () {
System.out.println("This is the construct function of shape class.");
}
static {
System.out.println("This is shape's static construction area.");
}
}
class Circle extends Shape{
Circle () {
System.out.println("This is the construct function of Circle class.");
}
static {
System.out.println("This is Circle's static construction area.");
}
}
public class test {
public static void main(String[] args) {
Circle a = new Circle();
Circle b = new Circle();
}
}
上述代码中,Circle
类继承了 Shape
类,两个类中都有各自的静态初始化器和构造函数,我们在 main
方法中新建了两个 Circle
对象,执行结果为:
This is shape's static construction area.
This is static Circle's construction area.
This is the construct function of shape class.
This is the construct function of Circle class.
This is the construct function of shape class.
This is the construct function of Circle class.
以上结果说明在新建对象的时候初始化器的执行顺序。而且我们可以发现,不论新建多少个对象,类的静态初始化器只会执行一次,而构造函数每次都会被执行。
5. final修饰符
5.1 用来修饰基本数据类型
如果一个基本类型的变量被声明为final
,则代表它为一个常量,其值不能被修改。这也意味着在声明它的时候也必须要进行初始化工作。(在这种用法上,final
类似于 C/C++ 中的const
)。例如:
final int FILE_NEW = 1;
为final变量的所有的字符选择大写是一个普遍的编码约定。声明为final的变量在实例中不占用内存。这样,一个final变量实质上是一个常数。
5.2 用来修饰一个引用
用来修饰一个引用时,则该引用不能修改,但被该引用指向的对象本身可以修改。
5.3 用来修饰一个方法
final
关键字也可以被应用于方法,代表该方法为最终方法,无法被子类重写,但是仍然可以被继承。
5.4 用来修饰一个类
当用final
来修饰类时,该类成为最终类,无法被继承。