Robin1985

导航

 

定义对象的类

​ 面向对象程序设计(OOP)就是使用对象进行程序设计。对象(object)代表现实世界中可以明确标识的一个实体。每个对象都有自己独特的标识、状态和行为。

  • 一个对象的状态(state)是指对象的特征(property)属性(attribute))。

  • 一个对象的行为(behavior)是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。

    ​使用一个类来定义同一类型的对象。类是一个模板,用来定义对象的状态是什么以及方法是做什么的。一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化(instantiation)。术语对象(object)实例(instance)经常是可以互换的。类和对象之间的关系类似于菜谱与按照菜谱炒出来的真实的菜的关系。

    ​Java类使用变量定义数据域,使用方法定义动作。除此之外,类还提供了一种称为构造函数(constructor)的特殊类型的方法,调用它可以创建一个新对象。构造方法本身是可以完成任何动作的,但是设计构造方法的初衷还是为了完成初始化操作。

使用构造函数构造对象

​ 构造函数是一种特殊的方法,它具有以下三种特性:

  1. 构造函数必须具备和所在类相同的名字。

  2. 构造函数没有返回类型,甚至连void也没有。

  3. 构造函数是在创建一个对象使用new操作符时调用的。构造函数的作用是初始化对象。

    ​构造函数具有和定义它的类完全相同的名字。和所有其他方法一样,构造函数也可以重载(也就是说,可以有多个同名的构造函数,但它们要有不同的参数类型或参数类型数量),这样更方便用不同的初始数据来构造对象。

    ​构造函数是用来构造对象的,为了能够从一个类构造对象,使用new操作符调用这个类的构造函数。通常,一个类会提供一个没有参数的构造函数。一个类可以不定义构造函数,在这种情况下,类中隐含定义一个方法体为空的无参构造函数。这个函数成为默认构造函数。

访问对象的数据和方法

​ 在创建一个对象后,它的数据和方法可以使用圆点运算符(.)来访问和调用,该运算符也成为对象成员访问运算符(object member access operator):

  • object.field 引用对象的属性

  • object.method(param) 调用对象的方法

    基本数据类型和引用数据类型在类中当作成员变量时,若未手动赋值,则默认值分别为:

  • byte 0

  • short 0

  • int 0

  • long 0

  • float 0.0

  • double 0.0

  • 数组 null

  • String null

  • 类 null

静态变量、常量和方法

如果想让一个类的所有实例共享数据,就要使用静态变量(static variable),也称为类变量(class variable)。静态变量将变量值存储在一个公共的内存地址。因为它是公共的地址,所以如果某一个对象修改了静态变量的值,那么同一个类的所有对象都会收到影响。Java支持静态方法和静态变量。不需要创建类的实例就可以调用静态方法(static method)

要声明一个静态变量或定义一个静态方法,就要在这个变量或方法的声明中加上修饰符static。静态属性、静态方法访问方式如下:

  • 类名.方法名(参数) 调用静态方法

  • 类名.属性变量 调用静态属性

类中的常量是被该类的所有对象所共享的。因为应该声明为fainl static。

如何判断一个变量或方法应该是使用实例的还是静态的?

如果一个变量或方法依赖于类的某个具体实例,那就应该将它定义为实例变量或实例方法。如果一个变量或方法不依赖于类的某个具体实例,就应该将它定义为静态变量或静态方法。例如Math类中没有一个方法是依赖于一个特定实例的。

可见性修饰符

可以在类、方法和属性前使用public修饰符,表示它们可以被任何其他的类访问。如果没有使用可以见性修饰符,那么默认为类、方法和属性是可以被同一个包中的任何一个类访问的。这称作包私有(package-private)包内访问(package-access)

包可以用来组织类之间的的层次结构,需要在程序中的首行使用如下语句:

package 包名;

如果定义类时没有声明包,就表示在默认包中。

除了public和默认可见修饰符(属性或方法前无修饰符),Java还提供了private修饰符。private修饰符限定了方法和属性只能在它自己的类中被访问。

  • private修饰符将访问权限限定在它自己的类内。

  • 默认修饰符将访问权限限定在包内。

  • public修饰符没有任何限制。

修饰符private只能应用在类的成员上。修饰符public可以应用在类或类的成员上。在局部变量上使用修饰符public和private都会导致编译错误。

属性的封装

为了避免对属性的直接修改,应该使用private修饰符将属性声明为私有的。这就称为属性封装。

在定义私有属性的类外的对象是不能访问这个属性的。但是经常会有客户端需要存取、修改属性的情况。为了能够访问私有属性,可以提供一个get方法返回属性的值。为了能够更新一个属性,可以提供一个set方法给属性谁在新值。

一般来讲,get方法称为读取器(getter)访问器(accessor),而set方法称为设置器(setter)修改器(mutator)

为防止数据被篡改以及使类更易于维护,最好将数据域声明为私有的。

构造代码块、静态代码块

Java使用构造函数来对单个对象进行初始化操作,使用构造函数先完成整个Java对象的状态初始化。与构造函数作用非常类似的是构造代码块,它也可以对Java对象进行初始化操作。一个类里可以有多个构造代码块,构造代码块之间的顺序:前面定义的先执行,后面定义的后执行。语法如下:

[修饰符]{

  语句;

}

构造代码块如果添加修饰符,只能是static,使用static修饰的构造代码块,被称为静态代码块。静态代码块是类级别的,通常用于对类变量执行初始化处理。静态代码块不能对实例变量进行初始化处理。

构造代码块与静态代码块区别:

  • 静态代码块在ClassLoader阶段运行,即使不创建任何对象,也会被执行。

  • 构造代码块在每个对象创建时执行。

  • 静态代码块操作的内存在静态区。

  • 构造代码块操作的内存在用户区。

构造化代码块、静态代码块、构造函数执行顺序

根据构造代码块、静态代码块、构造函数的定义,可以得知,不考虑在集成条件下(不算Object)的情况下,执行顺序:静态代码块-->构造代码块-->构造函数。

 1 /**
 2  * 演示单类无继承下(不算Object)构造代码块、静态代码块、构造函数执行顺序
 3  */
 4 public class Demo {
 5     {
 6         System.out.println("构造代码块");
 7     }
 8     
 9     static {
10         System.out.println("静态代码块");
11     }
12     public Demo() {
13         System.out.println("构造函数");
14     }
15     
16     public static void main(String[] args) {
17         new Demo();
18     }
19 }

 

posted on 2017-03-22 20:50  Robin1985  阅读(82)  评论(0)    收藏  举报