简介
面向对象是新一代的程序开发模式,模拟现实世界的事物,把软件系统抽象成各种对象的集合,以对象为最小单位。对象就是客观世界中存在的人,事,物体等实体。对象就是符合某种类定义所产生出的实例(如:狗、猫,老虎等属于动物类)。在面向对象程序设计中,使用属性来描述对象的形态,使用方法来处理对象的行为。
面向对象的三大特性
1. 封装性
将对象的属性和方法封装起来,是用户知道并使用对象的方法和属性而不需要知道其内部的实现过程,例如,手机拨打电话。
采用封装的原则可以使对象以外的部分不能随意存取对象内部的数据,有效的避免了外部错误对内部数据的影响,实现错误局部化。同时,提高了程序的可维护性,可以对成员变量进行更精确的控制。例如
public class Husband {
/*
* 对属性的封装
*/
private String name ;
private String sex ;
private int age ; /* 改成 String类型的*/
private Wife wife;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120)//对属性的控制{
System.out.println("ERROR:error age input...."); //提示錯誤信息
}else{
this.age = age;
}
}
/** 省略其他属性的setter、getter **/
}
对其的使用
Husband husband = new Husband();
husband.age = 30;
husband.name = "张三";
husband.sex = "男";
2.继承性
子类继承父类,一个类获取了另外一个类的全部方法,并且对这些方法进行自主的支配。在这里,被别人继承的类,我们叫父类,也叫超类或者基类。而继承了父类的类呢,就叫子类,也叫派生类。当我们在继承一个父类的时候,可以根据实际需要对父类中的方法进行重写,从而获取实际所需要的实现步骤。同时,也可以在父类方法的基础上进行扩充
**父类**
public class Animal {
private String type;
int legs;
int count; //表示当前类型的对象的个数
public void eat(){
System.out.println("动物会吃东西。。。");
}
public void sleep(){
System.out.println("动物zai睡觉。。。");
}
}
当我们在继承一个父类的时候,可以根据实际需要对父类中的方法进行重写,从而获取实际所需要的实现步骤。同时,也可以在父类方法的基础上进行扩充
**子类**
public class Rabbit extends Animal{
/*方法的重写*/
public void eat(){
System.out.println("兔子吃草。。。");
}
}
public class Tiger extends Animal {
int count;
public void eat(){
System.out.println("老虎吃肉。。。");
}
/*方法的扩充*/
public void run(){
System.out.println("老虎飞快的跑");
}
public void showInfo(){
System.out.println("这是一只老虎,它的超类是动物类,超类的eat方法的结果是:");
super.eat();
super.legs=2;
System.out.println("这是一只老虎,它的的eat方法的结果是:");
this.legs=4;
this.eat();
this.run();
}
}
**运行结果**
这是一只老虎,它的超类是动物类,超类的eat方法的结果是:
动物会吃东西。。。
这是一只老虎,它的的eat方法的结果是:
老虎吃肉。。。
老虎飞快的跑
要注意的是:子类必须实现父类所有的属性或方法,就是说:如果子类不对父类的方法进行重写,那么父类的方法也会在子类被加载的时候执行。而如果子类重写了方法之后,就只会加载重写后的方法
子类只能够继承父类中被声明为public和protected的成员变量和成员方法,但不能继承private修饰的;如果子类声明了一个与父类同名的成员变量,则父类的成员变量会被子类隐藏,这是用 super 关键字调用父类被隐藏的方法和成员变量
3.多态性
通常使用方法的重载和覆盖来实现类的多样性。方法的重载是指在一个类中,出现多个方法名相同,但参数个数或类型不同的方法。
方法的重载
定义一个Calcuate 的类
public class Calcuate{
final float PI=3.14f;
//求圆的面积
public float getArea(float r){
float area=PI*r*r;
return area;
}
//求矩形的面积
public float getArea(float x,float y){
float area=x*y;
return area;
}
对其的实现
public class CalculateTest{
public static void main(String []args){
Calculate a=new Calculate();
float r=2.1f;
System.out.println("圆的面积为:"+a.getArea(r));
Calculate b=new Calculate();
float x=3.1f;
float y=4.2f;
System.out.println("圆的面积为:"+b.getArea(x,y));
}
}
重载的方法之间不一定必须有联系,但为了提高程序的可读性,一般只重载功能相似的方法。
方法的覆盖
当子类继承父类,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,此时,称子类的方法覆盖了父类的方法。通过覆盖,可以使一个方法在不同的类中表现出不同的行为。