在面试过程中,或多或少都会被面试官问到面向对象的三大特征,下面就用一个别人遇到的面试小程序说一下面向对象的三大特征吧。
用一个面向对象语言实现一个计算器程序,要求做两个数的运算。
package com.shijinnan.classes;public abstract class Operation
{
protected double number1;
public double getNumber1()
{
return number1;
}
public void setNumber1(double number1)
{
this.number1 = number1;
}
protected double nulber2;
/**
* des:运算的方法
* @return 结果
*/
public abstract double operate();
}
这个是一个运算的抽象类,将运算的数据和运算的方法进行封装。只提供给外面运算操作的方法operate,其内部实现具体的实现对于外面是不可见的。
在此,想实现两个数的相加,怎么实现呢?代码如下:
package com.shijinnan.classes;
public class AddOperation extends Operation
{
@Override
public double operate()
{
return this.number1+this.nulber2;
}
}
AddOperation类是对Operation的继承,继承它的变量,重写它的operate方法。在此提醒一下,子类可以继承父类的protected和public属性和方法,而不能继承父类的私有属性和方法。同级目录下的子类可以继承它的默认访问权限的属性和方法,不在同级目录下的子类不能继承父类默认访问权限的属性和方法,也不能访问。同一级目录下的类可以访问其它类的默认访问权限的属性和方法。
继承的好处:
1.通过抽象出不同事物的共同点,从而抽象出共同的父类,从而使代码尽可能地复用,使代码更加地简洁。就好像java中的每一个类都是Object的子类。
2.继承是可以传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。
3、继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性
下面就是测试的代码了:
Map<String,Object> context = new HashMap<String,Object>(Const.DEFAULT);
context.put("add", new AddOperation());
context.put("sub", new SubOperation());
double number1 = 12d;
double number2 = 123d;
Operation op = (Operation) context.get("add");
op.setNumber1(number1);
op.setNumber1(number2);
System.out.println(op.operate());
有的人看到上面的测试代码就感觉疑问了,直接测试不就行了吗,为什么要先把类放到map里再取出来,这不是多此一举吗?这个面向对象的另一个特征有关。下面等我说完你就知道为什么这样测试了。
如果想在再增加一个除法运算或者乘法运算,阶乘运算,那怎么办呢?其实只要增加几个Operation的子类,分别实现里面的operate方法就行了。然后根据前台输入的运算符,选择对应的类,执行对应的方法就行了。
而上面测试的代码是程序运行的时候就把对应的运算的类加载到一个容器里,然后根据用户的操作,传进去对应的运算符,选择到对应的Operation的子类。Operation op = (Operation) context.get("add");这行代码就是将容器的Operation的子类的对象获取,然后向上转型,让父类的引用指向子类的实现,这就是多态的一种。程序只有在运行的时候才知道op.operate()执行的是哪个子类的operate()方法。这就是利用了多态中的重写,面向对象编程中的动态绑定。
多态还有一个形式,就是重载:
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
package com.shijinnan.classes;
public abstract class Operation
{
protected double number1;
public double getNumber1()
{
return number1;
}
public void setNumber1(double number1)
{
this.number1 = number1;
}
protected double nulber2;
/**
* des:运算的方法
* @return 结果
*/
public abstract double operate();
public abstract double operate(double number1,double number2);
}
上面类的 operate()方法和operate(double number1,double number2)就是java类的重载,方法名相同,但参数不一样。
多态的好处:
1.可替换性。多态对已存在的代码具有可替换性。
2.可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际 上新加子类更容易获得多态功能。
3.接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性。多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。
上面只是作者的一点见解,有纰漏的地方,很乐意读者能指出