对象与类

面对对象程序设计(OOP)

Object Oriented Programming简称OOP。Java是完全面对对象的,面对对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分,不关心对象的具体实现,只要能够满足用户的需求即可。

类可以理解为类别,类是构造对象的模板与蓝图,是用来描述一类对象行为和状态的模板,可以具有多个对象。类构造对象的过程称为创建类的实例。对象中的数据成为实例域,操作数据的过程称为方法。

类之间的关系:

  • 依赖,即“uses-a”关系,一个类的方法操作另一个类的对象,即这个类依赖另一个类
  • 聚合,即“has-a”关系,类A的对象包含类B的对象
  • 继承,即“is-a”关系,用于表示特殊与一般的关系,具有特殊性的类A继承类B

对象

对象是类的实例,具有特定的行为和状态。同一个类的所有对象实例,由于支持相同的行为而具有家族式的相似性。对象的行为是用可调用的方法定义的,对象的状态的改变必须通过调用方法实现,保证封装性。
对象的三个主要特性:

  • 对象的行为----可以对对象施加哪些操作,或可以对对象施加哪些方法
  • 对象的状态----当施加那些方法时,对象如何响应
  • 对象标识----如何辨别具有相同行为与状态的不同对象

创建对象:要想使用对象,就必须先构造对象,并指定初始状态。用构造器初始化对象,在类名()前加上new操作符,如new Date(),这样就构建了一个新对象,要多次使用此对象,可以将其存放在一个变量中,如Date bir = new Date()。一个对象变量并没有实际包含一个对象,仅仅是引用一个对象

创建构造器:构造器与类同名,构造对象时,构造器会运行,将实例域初始化。每个类可以与一个以上的构造器,构造器可以有0个、一个或多个参数,构造器没有返回值,构造器伴随着new一起调用。不要在构造器中定义与实例域重名的局部变量,构造器内部声明的局部只能在构造器内部访问。

方法调用:对象名.方法名;,如Empkiyee.getName();

方法参数:方法参数有两个类型,基本数据类型和对象引用。

参数传递给方法的一些专业术语
1.按值调用:表示方法接收的是调用者提供的值,java总是使用按值调用,也就是说,方法得到的是所有参数值的一个拷贝,方法不能修改传递给它的任何参数变量的内容。
2.按引用调用:表示方法接收的是调用者体统的变量地址。
按值调用例子:将percent为10的值改为30
double percent = 10;
tripleValue(percent);

public static void tripleValue(double x){
x = 3 * x;
}

其执行过程:

  1. x被初始化为percent值的一个拷贝(10)。
  2. x被乘以3后等于30,但是percent仍然是10
  3. 方法结束后,参数变量x不再使用

可见一个方法不可能修改一个基本数据类型的参数,而对象就不同了。
public static void tripleSalary(Employee x){
x.raiseSalary(200);
}
调用
harry = new Employee(…);
tripleSalary(harry);

其执行过程:

  1. x被初始化为harry值的拷贝,这是一个对象引用
  2. raiseSalary方法应用于这个对象引用,x和harry同时引用的那个Employee对象的薪金提高了200%

因此可知,实现一个改变对象参数状态的方法不是一件难事,理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

实际上java对对象采用的不是按引用调用,是按值传递的。
例子:
先编写一个交换雇员对象的方法
public static void swap(Employee x,Employee y){
Employee temp = x;
x=y;
y=temp;
}
如果java对象采用的是按引用调用,那么这个方法就应该能够实现交换数据的效果
Employee a = new Employee(“Alice”,…);
Employee b = new Employee(“Bob”,…);
swao(a,b);

但是,方法并没有改变存储在变量a和变量b中的对象引用,swap交换的是拷贝的x,y。而在方法结束时,x和y被丢弃了,但是a,b仍然引用这个方法调用之前所引用的对象。

重载:如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法,如果编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他的更好(这一过程成为重载解析)。因此要完整的描述一个方法,需要指出方法名及其参数类型。

对象的初始化顺序:
静态代码块>构造代码块>构造函数>普通代码块
父类静态代码块–子类静态代码块–父类构造代码块–父类构造函数–子类构造代码块–子类构造函数

类设计技巧:

  1. 一定要保证数据私有
  2. 一定要对数据初始化
  3. 不要在类中使用过多的基本类型
  4. 不是所有的域都需要独立的域访问其和域更改器
  5. 将职责过多的类进行分解
  6. 类名和方法名要能够体现他们的职责
  7. 优先使用不可变的类

此文章内容来自java核心技术卷1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值