对象与类
面向对象
将一个问题,分解成第一步,第二步,……,直到完成,这就是面向过程。
面向对象是将问题先抽象成几个对象,思考每一个对象要做的事情。所以面向对象的程序是由对象组成的
面向对象三大特性
-
封装
-
继承
-
多态
类
类就像创建对象的模板,由类的构造函数创建对象的过程成为创建类的实例。
封装是处理对象的重要概念,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据成为字段,操作数据的过程成为方法。
实现封装的关键在于绝对不能让类直接访问其它类中的数据。程序只能通过对象的方法与对象的数据进行交互,提高了重用性和可靠性。
在类之间,常见的关系有:依赖("uses-a"),聚合("has-a"),继承("is-a")。
依赖("uses-a")
如果类A的方法使用或操作类B的对象,这就是依赖关系。一个程序应该尽可能将相互依赖的类减到最少,减少类之间的耦合。
聚合("has-a")
类A的对象包含类B的对象,就叫聚合。
继承("is-a")
类B继承于类A,类B不但有从类A获得的方法还有自己特有的方法。
对象与对象变量
刚刚说过,通过构造器可以创建一个对象。构造器,也叫构造函数,它是一个与类名相同的没有返回值的方法。想要构造一个Person类的对象,需要在构造器加一个new操作符,
new Person();
因为没有给它取名,所以它叫匿名对象,可以将匿名对象传递给一个方法:
System.out.pritnln(new Person());
但是更多时候,我们都会将对象存放在一个变量中:
Person p = new Person();
对象变量p引用了新构造的Person对象
注意:
Person p1;
定义了一个对象变量p1,它可以引用任何Person类型的对象,但此时p1并不是一个对象,它不能使用Person类的任何方法。要想使用Person类中的方法,必须将p1初始化,有两种方法,第一种:
p1 = new Person();
第二种:
p1 = p;
此时,p1和p引用的是同一个对象。
注意:
对象变量并没有实际包含一个对象,它只是引用一个对象。在Java中,任何对象变量的值都是对存储在另一个地方的某个对象的引用。new操作符的返回值也是一个引用:
Person person = new Person();
这句话包含了两个部分,表达式new Person()构造了一个Person类型的对象,它的值是对新创建对象的一个引用,这个引用存储在person中。
构造器
一个类,可以有1个或多个构造器,构造器也可以有0个,1个或多个参数,构造器的参数是用来在创建对象时给对象的字段赋值,但是已经存在的对象不可以通过调用构造器的方式来重新给字段赋值,
private String name;
private int age;
public Person(String name, int age) {
if(name=="null"){
this.name = "unknown";
}else{
this.name = name;
}
this.age = age;
}
隐式参数和显式参数
在Java中, 带参数的方法在被调用时,需要对象名.方法名(参数)来调用,类中的方法会获得两个参数,对象名就时隐式参数,括号内的参数就是显示参数,在每个方法中,this关键字指示隐式参数。
封装
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;
}
在定义了private 类型字段之后,我们通常会写这么一段get 和set方法,get方法是访问器方法,由于它们只返回实例字段值,又称为字段访问方法,set方法是字段更改器方法,可以修改字段的数值。
加这些方法的好处:
-
可以实现内部改变,并且不会影响其它代码。例如,如果将存储名字的字段改为
private String firstName;
private String lastName;那么getName方法的返回值可以改为
return lastName+" "+firstName;
-
更改器方法可以完成错误检查。例如在设置年龄的时候可以检查年龄大于0小于100
public void setAge(int age){
if(age>0&&age<100){
this.age = age;
}else{
System.out.println("年龄不符合实际!");
}
}
注意:如果一个字段被设置成为final类型,那么这个字段的值必须在初始化时就被设置,并且以后不能再修改,所以它没有相应的set方法。
类的设计技巧
-
一定要保证数据私有,这一点很重要,不要破坏封装性。
-
一定要对数据进行初始化,不要依赖于系统给的默认值。
-
不要在类中食用过多的基本类型。
-
不是所有的字段都需要单独的字段访问器和字段更改器,例如在员工管理系统中,员工的雇佣日期是确定的,不会需要更改的。在对象中总会有一些不希望别人获得或设置的实例字段。
-
分解有过多职责的类,一个类不应该有过多的方法。
-
类名和方法名要能够体现他们的指责,要做到见名知意。
-