Java对象与类—对象与类

Java对象与类—对象与类

1.类

  类(class)是构造对象的模板,具体点说类就是对具有相同性质,相同行为的一群对象的抽象说明。由类构造(construst)对象的过程称为创建类的实例(instance)。

2.对象

  对象是类的实例,也就是说对象是由类构造出来的。比如说人类就是一个类,而具体的一个人就是对象。

  总的来说,类是对象的模板,对象是类的具体实例。

  面向对象程序设计(OOP)是当经主流的程序实际范型,而Java是完全面向对象的,必须熟悉OOP才能够编写Java程序。

  要想使用OOP,一定要清楚对象的三个主要特性:

  ①、对象的行为(behavior)——可以对对象施加哪些操作,或可以对对象施加哪些方法?

  ②、对象的状态(state)——当施加那些方法时,对象如何响应?

  ③、对象标识(identity)——如何辨别具有相同行为与状态的不同对象?

  同一个类的所有对象实例,由于支持相同的行为而具有家族相似性。对象的行为是用可调用的方法定义的。

3.类之间的关系

  在类之间,最常见的关系有:

  ①、依赖("uses-a")——是一种最明显,最常见的关系。如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。

  ②、聚合("has-a")——是一种具体且易于理解的关系。聚合关系意味这类A的对象包含类B的对象。

  ③、继承("is-a")——是一种用于表示特殊与一般关系的。一般而言,如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能。

4.自定义类

  在Java中,最简单的类定义形式如下(以Employee类为例):

package jackWe;

public class Employee {
    private String name;
    private int age;
    private String sex;

    public Employee() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Employee(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public  int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
    
    public void getOneHeight() {
        System.out.println(this.name + "的身高为:" + (int)(Math.random() * 200) + "cm");
    }
}

  ①、解析Employee类

  通过上述代码可以发现,这个类包含两个构造器和多个方法,这个类的所有方法都被标记为public。关键字public意味着任何类的任何方法都可以调用这些方法。当然,类中还有三个实例域用来存放将要操作的数据:name,age,sex;关键字private确保只有Employee类自身的方法才能够访问到这些实例域,而其它类的方法不能够读写这些域。

  ②、从构造器开始

  先看看Employee的两个构造器:

public Employee() {
        super();
        // TODO Auto-generated constructor stub
    }
public Employee(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

  已经看到,构造器与类同名。前者没有参数,并且是被默认存在的,意思就是就算不手动创建,也自己存在;而带参的就是根据自己的实用情况所创建的构造器。

  在构造Employee类的对象时,构造器被运行,以便将实例域初始化为所希望的状态。例如:

package jackWe;

public class EmployeeTest {

    public static void main(String[] args) {
        Employee employee = new Employee("JackWe", 18, "男");//创建Employee类的实例
        employee.getOneHeight();//调用Employee类中的getOneHeight方法
    }
}

  Employee employee = new Employee("JackWe", 18, "男"); 将会把实例域设置为

  name = "JackWe";

  age = 18;

  sex = "男";

  构造器与其它方法有一个重要不同。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。

  总结一下:

  a、构造器与类同名;

  b、每个类可以有一个以上的构造器;

  c、构造器可以有0个、1个或1个以上的参数;

  d、构造器没有返回值;

  e、构造器总是伴随着new操作符一起调用。

  ③、封装的优点

  最后,在仔细的看一下非常简单的getName方法、getAge方法和getSex方法。这些都是典型的访问器方法。由于它们只返回实例域值,因此又被称为域访问器。

  将name,age和sex域标记为publlic,以此来取代独立的访问器方法会不会更容易些呢?估计很多人在刚刚接触的时候都有这种疑问。

  可以分析一下,关键在与name是一个只读域,一旦在构造器中设置完毕,就没有任何一个方法可以对它进行修改,这样来确保name域不会受到外界的干扰。如果name域是public的,破坏这个值域的捣乱者就有可能出没在任何地方。

  在有些时候,往往需要获得或设置实例域的值。因此,应该提供下面三项内容:

  a、一个私有的数据域;

  b、一个公有的域访问器方法;

  c、一个公有的域更改器方法。

  这样做要比提供一个简单的公有数据域简单些,但却有着下列明显的好处:

  1)、可以改变内部实现,除了该类的方法之外,不会影响其它代码。

  2)、更改器方法可以执行错误检查,然而直接对域进行赋值将不会进行这些处理。