浅谈面向对象

这是我初学Java时遇到的问题与解决方案

题目:使用java面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

package computer;

import java.util.Scanner;

public class Calculator {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个数");
int a=sc.nextInt();
System.out.println("请输入运算符");
String y=sc.next();
System.out.println("请输入第二个数");
int b=sc.nextInt();
System.out.println("结果为:");
switch(y){
case "+":System.out.println(a+b);
break;
case "-":System.out.println(a-b);
break;
case "*":System.out.println(a*b);
break;
case "/":System.out.println(a/b);
break;
}
}
}

这是我刚学习java时写的代码,里面有很多不足:

1)命名规范问题

int a=sc.nextInt();

int b=sc.nextInt();

这都是初学者很容易犯的错误

2)如果除数是,客户输入的是0时怎么办?

3)如果输入的是小数怎么办?

package computer;

import java.util.Scanner;

public class Calculator {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个数");
double numberA=sc.nextInt();
System.out.println("请输入运算符");
String operator=sc.next();
System.out.println("请输入第二个数");
double numberB=sc.nextInt();
System.out.print("结果为:");
switch(operator){
case "+":System.out.println(numberA+numberB);
break;
case "-":System.out.println(numberA-numberB);
break;
case "*":System.out.println(numberA*numberB);
break;
case "/":
if(numberB!=0){
System.out.println(numberA/numberB);
}else{
System.out.println("被除数不能为零");
}
break;
}
}
}

至少就目前的代码来说,实现计算器是没有问题了,但是这么做符合题意么?

对的,出题人有一个很重要的要求----面向对象。

刚开始我只是认为“这样啊,我只是当时没有想到,我会做的”。其实这是一个初学者很常见的问题,即遇到问题就直觉的用计算机所能理解的逻辑来描述和表达待解决的问题

及具体的求解过程。这其实是用面向过程的方式去思考。就比如这个计算器程序,本身并没有错,但这样的思维却使的我们的程序只为满足当前需求,程序不容易维护,不容易扩展,更不容易复用,从而达不到高质量代码的要求。而面向对象的思想是通过封装,继承,多态把程序的耦合度降低。

package computer;

import java.util.Scanner;

public class Calculator {
public static void choose(double numberA,String operator,double numberB){
switch(operator){
case "+":System.out.println(numberA+numberB);
break;
case "-":System.out.println(numberA-numberB);
break;
case "*":System.out.println(numberA*numberB);
break;
case "/":
if(numberB!=0){
System.out.println(numberA/numberB);
}else{
System.out.println("被除数不能为零");
}
break;
}
}
public static void main(String[] args){

Scanner sc=new Scanner(System.in);
System.out.println("请输入第一个数");
double numberA=sc.nextInt();
System.out.println("请输入运算符");
String operator=sc.next();
System.out.println("请输入第二个数");
double numberB=sc.nextInt();
System.out.print("结果为:");
choose(numberA, operator, numberB);
}
}

 这仅仅只用了面向对象的封装特性,如果要加入其他功能,比如平方根等,局限性就显现出来了。

package computer;

public class Operation {
private double numberA;
private double numberB;
private String operator;

public double getNumberA() {
return numberA;
}

public void setNumberA(double numberA) {
this.numberA = numberA;
}

public double getNumberB() {
return numberB;
}

public void setNumberB(double numberB) {
this.numberB = numberB;
}

public String getOperator() {
return operator;
}

public void setOperator(String operator) {
this.operator = operator;
}

public double getResult(){
double result=0;
return result;

}
}

这是加法

package computer;

public class OperationAdd extends Operation{
public double getResult(){
double result=0;
result=getNumberA()+getNumberB();
return result;
}
}

以此类推每种方法写一个类,功能的添加就会更加方便。

posted @ 2016-08-07 15:18  半马  阅读(186)  评论(0编辑  收藏  举报