-------android培训、java培训、期待与您交流! ----------
类:类似构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。封装是与对象有关的一个重要概念,实现封装的关键在于绝对不能让类中的方法直接的访问其他类的实例域。程序仅通过对象的方法与对象数据进行交互。封装给予了对象黑盒的特征,这是提供重用性和可靠性的关键。
对象中的数据称为实例域,操纵数据的过程称为方法,对于每个特定的类实例(对象)都有一组特定的实例域值,这些值的集合就是这个对象的当前状态。
类可以通过扩展另一个类来建立,事实上,在Java中,所有类都源自于一个“神通广大的超类”——Object类。
同一个类的所有对象实例,由于支持相同的行为而具有家族相似性。对象的行为是可调用的方法定义的。
每个对象都保存着描述当前特征的信息,这就是对象的状态。对象状态的改变必须通过调用方法实现(如果不经过方法调用就可以改变对象状态,只能说明封装性遭到了破坏)。
对象的状态并不能完全描述一个对象。每个对象都有一个唯一的身份(identity)。
类之间的关系:
依赖(dopendence),即“use-a”关系,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
聚合(aggregation),即“has-a”关系,聚合关系,意味着类A的对象包含类B的对象。
继承(inheritance),即“is-a“关系。
构造对象:
要使用对象,首先需要构造对象,并指定其初始状态。然后,对对象施加方法。构造器的名字应该与类名相同。因此Date类的构造器名为Date。要想构造一个Date对象,需要在构造器前加new操作符:
new Date();
希望构造的对象可以多次使用,需要将对象存放到一个变量中:
Date birthday = new Date();
一个对象的变量并没有实际包含一个对象,而仅仅是引用了一个对象。
在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用。new操作的返回值也是一个引用。
要想创建一个完整的程序,应该将若干类组合在一起,其中只有一个类有main方法。文件名必须与public类的名字相匹配。在一个源文件中,只能有一个公有类,可以有任意数目的非公有类。
构造器:构造器与类同名,在构造Employee对象时,构造器被运行,以便将实例域初始化为所希望的状态。构造器与其他方法有一个重要不同,构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。不要在构造器中定义与实例域同名的局部变量。
静态域:如果将域定义为static,每个队中只有一个这样的域,而每一个对象对于所有的实例域却有自己的一份拷贝,即使没有对象,静态域也存在,静态域属于类,而不属于任何独立的对象。
静态方法:静态方法是一种不能对对象实施操作的方法,可以认为静态方法是没有隐式参数的方法。静态方法不能操作对象,所以不能在静态方法中访问实例域,但是,静态方法可以访问自身类中的静态域。
可以直接通过类名调用静态方法。
需要注意,不需要使用对象调用静态方法。列如,不需要构造Math类对象就可以调用Math.pow。
main方法不能对任何对象进行操作。事实上,在启动程序时还没有任何一个对象。静态的main方法将执行并创造程序所需要的对象。
PS:每一个类可以有一个main方法,这是一个常用于对类进行单元测试的技巧。
封装的优点:
1. 可以改变内部实现除了该类的方法之外,不会影响其他代码。
2. 更改器方法可以执行错误检查。
PS:注意不要编写返回引用可变对象的访问器方法,如果需要返回一个可变对象的引用,应该首先对它进行克隆。
class Employee { ... publicDate getHireDay() { return(Date)hireDay.clone(); } ... }
凭经验可知,如果需要返回一个可变数据域的拷贝,就应该使用克隆。
PS:方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据。
值调用(callby value)表示方法接收的是调用者提供的值。
引用调用(callby reference)表示方法接收的调用者提供的变量地址。
Java程序设计语言总是采用值调用。也就是说,方法得到的所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
方法参数共有两种类型:基本数据类型(数字,布尔型);对象引用。
一个方法不可能修改一个基本数据类型的参数,而对象应用作为参数就不同了。
public static void tripleSalary(Employee x) { x.raiseSalary(200); }
总结:
1.一个方法不能修改一个基本数据类型。
2.一个方法可以改变一个对象参数的状态。
3.一个方法不能实现让对象参数引用一个新的对象。
重载:如果多个方法有相同的名字,不同的参数,便产生了重载。编译器必须滴哦用所使用的值类型进行匹配来挑选出相应的方法,如果编译器找不到匹配的参数,或者找出多个可能的匹配,就会产生编译时错误(这个过程被称为重载解析 overloading resolution)。
Java允许重载任何方法,而不只是构造器方法,因此要完整的描述一个方法,需要指出方法名以及参数类型,这叫做方法的签名(signature)。
返回类型不是方法签名的一部分。
默认域初始化
如果在构造器中没有显示的给域赋予初值,那么就会被自动的赋予默认值,数值为0,布尔值为false,对象引用为null。不建议这样做!!!
这是域与局部变量的主要不同点。必须明确的初始化方法中的局部变量。但是,如果没有初始化域的值,将被初始化为默认值.
默认构造器:默认构造器是指没有参数的构造器。
如果在编写一个类是没有编写构造器,那么系统就会提供一个默认的构造器。这个默认的构造器将所有的实例域设置为默认值。
如果类中提供了至少一个构造器,但是没有提供默认的构造器,则在构造对象时如果没有提供构造参数就会被视为不合法。
显示域初始化
由于类的构造器方法可以重载,所以可以采用多种形式设置类的实例域的初始状态。确保不管怎样调用构造器,每个实例域都可以被设置为一个有意义的初值。
可以在类定义中,直接将一个值赋给任何域。
在执行构造器之前,先执行赋值操作,当一个类的所有构造器都希望把想通过的值赋给某个特定的实例域时,这种方法特别有用。
初始值不一定是常量。
class Employee{ ... static int assignId() { int r =nextId; nextId++; return r; } ... private int id = assignId(); }
参数名:在编写构造器时,参数变量用同样的名字将实例域屏蔽起来。可以用this的形式访问实例域:
public Employee(String name,double salary) { this.name = name; this.salary = salary; }
如果构造器的第一个语句形如this(...),这个构造器将调用同一个类的另一个构造器。
这个方式使用this关键字非常有用,这样对公共的构造器代码部分只编写一次即可。