浏览以下内容前,请点击并阅读 声明
java是面向对象的语言,而对象的创建,则需要借助类,类可以说是一个创建对象的模具(个人理解)。
类的定义
以下构成定义类的最简单(不能再简单)语句:
class MyClass { // 字段,构造器, // 方法等的声明 }
通常情况下,类的声明一般包含如下组成部分(按顺序):
- 类的修饰词,如public(可有可无)
- class关键词+类的名称,一般一大写字母开头
- extends关键词+继承的类,一个类只能继承一个超类(可有可无)
- implements+实现的借口,借口可以有多个,以逗号分隔(可有可无)
- 类的主体,用花括号括起来
类的修饰词,类的修饰可以为public,也可以没有如果为public则其可视范围没有限制,若没有,则其可视范围为仅程序包内可见(package)。
类的继承与借口的实现待后再详说。
类的主体
类的主体可以由类的成员组成,包括构造器,方法,字段,内含类等,也可以包含代码块(花括号内的代码),由一对花括号括起来。
类成员的可视范围
类成员的可视范围的控制可以通过在成员声明时在其左侧加上修饰词实现,修饰词的作用效果如下表所示:
修饰词 | 包含成员的类 | 包含所在类的程序包 | 继承所在类的类 | 一切范围 |
---|---|---|---|---|
public |
是 | 是 | 是 | 是 |
protected |
是 | 是 | 是 | 否 |
不含修饰词 | 是 | 是 | 否 | 否 |
private |
是 | 否 | 否 | 否 |
对于可是范围控制的修饰词,建议使用最严格的可视范围限制,即尽量减小修饰对象的可视范围,尽量用private,尽量少用public修饰类成员,除非该成员是一个常量。
static修饰词
当类的成员,如字段,方法的声明时左侧带有static修饰词时,则表示该成员为类成员(静态),而不是属于该类的一个实例,使用时,直接用类,而无需创建一个类的实例,当然也可以由实例引用,但不提倡这样使用,与之相对的则是实例成员,如一下类的定义中:
public class Bicycle { //以下字段未使用static修饰词,则其为实例字段 private int cadence; //以下字段使用了static修饰词,则其为类字段(静态字段) private static int numberOfBicycles = 0; //实例方法 public int getID() { return id; } }
类成员的使用无需创建实例,而实例成员的使用需要创建实例:
//使用上述类中的类字段,方法的使用类似 System.out.println(Bicycle.numberOfBicycles); //使用上述类中的实例字段,方法的使用类似 System.out.println((new Bicycle()).numberOfBicycles);
字段
字段是类中最外部的变量,与局部变量有明显区别,属于类的成员,字段的声明包含如下部分:
- 最左边可以有0个或多个修饰词,可以为public,private,static等
- 字段的类类型
- 字段的名称
方法
方法是构成类声明的基本成员,一般情况下,方法的声明包含如下部分:
- 修饰词,如public,private等(可有可无)
- 返回数据类型,如果没有返回值,则用void代替
- 方法名称,与变量的命名方法类似
- 由圆括号括起来的参数,参数类型和参数名称成一组,多组由逗号隔开,圆括号内可为空
- throws关键词后跟一系列抛出的异常(可有可无)
- 方法的主体,由花括号括起来,包含java语句,花括号内也可为空。
方法的签名:方法的签名由两个部分组成,名称和参数。
方法的重载:一般情况下,一个类中的方法名称都是唯一的,但是java允许在一个类中有多个名称相同的方法,但是方法的签名必须不同,即参数类型或者数量不同,这就叫方法的重载:
public class DataArtist { ... public void draw(String s) { ... } public void draw(int i) { ... } }
构造器
创建一个类的实例时,我们需要调用该类的构造器,构造器的声明和方法的声明类似,不同的是,他们的名称和类的名称相同,而且没有返回值,如果没用定义构造器,编译器会自动给该类插入一个其父类的无参数构造器(如果没有使用implements关键词指定父类,则其父类就是Object),称为默认构造器。
构造器和方法的参数
构造器和方法的参数类型可以为基本数据类型,也可以为类,当参数类型为基本数据类型时,在方法和构造器中无论对参数进行如何的操作,调用方法和构造器过后,参数的值都不会变,而当参数为一个对象或者对应一个对象的变量时,方法和构造器中对对象的操作最终会对对象的状态产生影响。传入方法和构造器的变量与对象的对应关系不会发生改变。
参数数量可变
方法或者构造器的参数数量可以是任意长度的,要使用任意长度的参数,就要在参数类型后面紧跟上一个省略号(三点),例如:
public test(int… integerVal){ //此处省略了方法内的代码 }
对象的创建
对象创建的表达式包含两个个部分:
-
new关键词
-
new关键词后跟一个构造器的调用
new关键词会给新创建的对象分配一定的内存,并将该内存(对象)的引用地址返回,一般用于变量的赋值或者用作参数。
对象的使用
对象创建之后,我们便可以使用其成员了,在一个类之外的代码使用该类的成员时,必须使用 对象引用表达式或者变量+点(.)+类成员的格式,如下所示:
//可以使用对应一个对象的变量的形式使用该对像的字段,方法的使用类似 var.fieldName //或者使用能产生一个对象引用的表达式使用该对象的字段(如构造器),方法的使用类似 //该语句过后,没有对于该对象的引用,所以该对象的资源(内存等)便会被java虚拟机回收 int height = new Rectangle().height;
垃圾回收 对象创建之后变回占用系统的资源,java有一个垃圾回收的机制,即如果java运行时环境认为一个对象不在需要时,便会删除它,以释放其占用的资源。 判断一个对象是否可以被回收是通过判断该对象是否还被引用,如果一个对象仅被一个变量引用,而该变量失效之后,该对象便可被回收,也可以给一个变量赋值为null以消除该变量对于之前对象的引用关系。注意:一个对象可以对应多个变量。 方法的执行 遇到以下任意一种情况,程序会退出方法的执行:
-
完成方法中所有的语句的执行
-
执行完return语句过后
-
抛出异常
在方法的声明中如果指定返回类型,则必须在方法主体中使用return语句以返回指定类型的值,当然如果声明中没有指定返回类型(即返回类型为void),也可以在方法中使用return语句以跳出该方法的执行,但return关键词后不能跟返回的值,否则会编译出错。 方法的返回类型可以为基本数据类型,也可以为类或者是借口,当返回类型为类或者是借口时,方法中实际返回的值可以是返回类的子类或者是返回借口的实现的类,这就叫java的共变返回类型。 this关键词 在实例方法或者是构造器中,this关键词是对包含该方法或者构造器的对象的引用(注意类方法中不能使用this关键词)。当方法或构造器需要引用被隐藏的字段(含有与字段名称相同的参数)或者当一个构造器需要引用另外一个构造器时,我们就需要使用this关键词,this的使用方法参照如下示例:
public class Rectangle { private int x, y; private int width, height; public Rectangle() { //在构造器中如果需要调用类中其他的构造器,则需要用到this关键词 this(0, 0, 1, 1); } public Rectangle(int width, int height) { this(0, 0, width, height); } public Rectangle(int x, int y, int width, int height) { //该方法含有与字段名称相同的参数,要想使用该字段,则需要使用this关键词 this.x = x; this.y = y; this.width = width; this.height = height; } ... }
字段的初始化
一般对于字段的初始化比较简单,比如
int a=0;
或者不对其进行赋值,然而如果要字段初始化的值需要进行比较复杂的运算比如循环时,我们可以在构造器里面进行运算,另外,我们还可以使用其他的方法。
静态字段的初始化
静态字段的初始化可以使用静态初始化代码块,静态初始化代码块在类主体的最外层,由static关键词后跟一个由花挂号括起来的代码块,静态初始化代码块内的代码在类初始化时按照顺序执行。
另外一种静态字段初始化的方法就是在类中定义静态方法,然后在字段声明中调用该静态方法。
实例字段的初始化
与静态初始化代码块类似,初始化代码块能够对实例字段进行初始化,初始化代码块相对于静态初始化代码块没有static关键词,每次创建一个对象时,初始化代码块中的代码都会按顺序执行。
同样,实例字段的声明中也可以调用类中的方法进行初始化。