类是对某一事物的抽象描述,是一个概念。对象则是该类事物存在的的一个个体。
就好比工厂加工零件时的设计图纸,与零件的关系。类就好比设计图纸,对象就好比加工好的零件。面向对象的设计是对类的设计,而不是对象的设计。
而要实现类的属性和行为我们就需要创建一个对象(创建对象的方法: 类的名字 引用对象时用的的名字= new 类的名字();)。
创建新对象之后,就可以使用“对象名.对象成员”来实现对对象成员的访问。
类中定义的成员变量在每个对象中都被单独实例化不会被所有对象共享。
对象被创建之后都存在自己生命周期,对象只能在生命周期中被使用,如果没有引用变量指向某个对象,这个对象就会被丢弃不能再被使用。
实现类的封装性
如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误(大概就是封装这个概念的来历吧)。
在定义一个类的成员(包含变量和方法)时,使用private关键字说明这个成员的访问权限,这个成员成了类的私有成员,只有被这个类的其他成员方法调用,而不能被其他的类中的方法调用。
为了实现良好的封装性,我们通常将类的成员变量声明为private,在通过public的方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,通常我们将其中一个命名为:get要访问的变量名字(),用来读取这个成员变量操作,另一个则为set要访问的成员变量名字(),对这个成员变量赋值。
一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们在进行程序的详细设计的时候,应尽量避免一个模块直接修改或操作另一个模块的数据,模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预),弱耦合(提供给外部尽量少的方法调用)。
说了这么多,那么类的封装有什么用,又或者有哪些优点呢,为什么要进行封装呢?优点:
隐藏类的细节。
让使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作。
便于修改,增强代码的可维护性。
构造函数
特征:具有与类相同的名称;不能有返回值(void也不行,这个概念不同于“void”,如果在定义构造方法时加了“void”,这个方法就不再被自动调用。);不能再方法中用return语句返回一个值;
作用:当一个类的实例对象刚刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。这样就可以在这个类的产生的每一个实例对象中完成相同的工作,而不用在每一个对象中都要重复声明。
构造方法的重载
和一般的方法一样,构造方法的重载具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new关键字产生对象时,该调用哪个构造方法了。产生对象的语句为:new类名(参数列表)。
重载构造方法可以完成不同初始化的操作,当使用new关键字产生对象时,会发生这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用对象的标识符。
static静态方法
在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
在java中,主函数main()方法是静态的,因为java虚拟机执行main方法时不创建main方法所在的类的实例对象,因而在main方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员。