java之继承,封装,多肽

转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51170401

一,封装

理解:把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能的隐藏对象内部实现细节

例如:我们写一个简单的输入两个数和一个操作符(+,-,*,/)的的运算,

可以把具体操作和属性封装成一个类

如:

主类:

package operation;

import java.util.Scanner;

public class Program {
	public static void main(String[] args) {
		try {
			// 输入端
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入数字A : ");
			String numberA = scanner.next();
			System.out.println("请输入操作符(+,-,*,/):");
			String numberOperation = scanner.next();
			System.out.println("请输入数字B : ");
			String numberB = scanner.next();
			String numberResult = "";
			// 这里把参数A,B装换成double型再传入,
			numberResult = String.valueOf(Operation.GetResult(
					Double.parseDouble(numberA), Double.parseDouble(numberB),
					numberOperation));
			System.out.println("输出结果为:" + numberResult);

		} catch (Exception e) {
			System.out.println("您的输入有误:");
			e.printStackTrace();
		}
	}
}


//另一个类

package operation;

/*
 * 运用封装思想
 */
public class Operation {
	// 自定义方法,根据传入的操作符执行相应操作
	public static double GetResult(double numberA, double numberB,
			String numberOperation) {
		double numberResult = 0d;
		/*
		 * 判断操作符 字符串化为Double:Double.parseDouble(字符串);
		 * Double化为字符串:String.valueOf(double值);
		 */
		switch (numberOperation) {
		case "+":
			numberResult = numberA + numberB;
			break;
		case "-":
			numberResult = numberA - numberB;
			break;
		case "*":
			numberResult = numberA * numberB;
			break;
		case "/":
			// 先判断除数是否为0
			if (numberB != 0) {
				numberResult = numberA / numberB;
			} else {
				try {
					throw new Exception("除数不能为0");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		default:
			break;

		}
		return numberResult;
	}
}




二,继承:

目的:减少代码的重复性(extends)

注意:

(1)子类不能继承父类的构造函数,只能继承父类的成员函数和成员变量

(2)在子类的构造函数中,必须调用父类的构造函数

可用super()调用父类的构造函数

和super(参数)调用父类的成员函数


如:

class Student extends Person {
	Student(){
//在此,无调用,故会自动生成父类无参数的构造函数
super();
System.out.println('Student的无参数构造函数");
}
}


(可参考我之前发的java中的重载和重写)



三,多肽

目的:提高程序的抽象程度和简洁性(减少代码的重复性)


理解1:

同一东西,对于不同的对象的不同反映,在java中就是说,同一个方法,但这个方法却有许多不一样的方法体

比如说:有个方法public double getArea(),我们可以知道这个方法的返回类型是double ,名字叫做getArea,

但是对于不同的图形,它的参数个数,形参类型,方法体必然会有不一样的,

例如:

对于圆形:

public double getArea(float r){

return (double)(Math.PI * r  * r);

}

对于矩形:

public double getArea(float a , float b){

return a * b ;

}


理解2:

(1)指同名的不同方法在程序中共存(其实也跟理解1差不多

即为同一个方法定义几个版本,运行时根据不同的情况执行不同的版本,调用者只需要使用同一个方法名,

系统会根据不同的情况,调用相应的不同的方法,从而实现不同的功能

(2)在java语言中,多肽的两种实现方式:

A, 覆盖(又叫复写或者重写)

B, 重载

这两者的应用和区别(在我之前发表的java中的重载和重写就有,可以去看一看,这里不再详解)


四,继承,封装,多肽这三者有什么用?为什么要用?如何用?

这里我也是初步认识而已,若有错误,望指教:

例如:

还是以前面的那个例子吧,

假如某公司要你写一个简单的求输入两个数的四则运算,你so easy的写出如下:

package operation;

import java.util.Scanner;

public class Program {

	public static void main(String[] args) {
		try {
			// 输入端
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入数字A : ");
			String numberA = scanner.next();
			System.out.println("请输入操作符(+,-,*,/):");
			String numberOperation = scanner.next();
			System.out.println("请输入数字B : ");
			String numberB = scanner.next();
			String numberResult = "";

			switch (numberOperation) {
			case "+":
				numberResult = String.valueOf(Double.parseDouble(numberA)
						+ Double.parseDouble(numberB));
				break;
			case "-":
				numberResult = String.valueOf(Double.parseDouble(numberA)
						- Double.parseDouble(numberB));
				break;
			case "*":
				numberResult = String.valueOf(Double.parseDouble(numberA)
						* Double.parseDouble(numberB));
				break;
			case "/":
				// 先判断除数是否为0
				if (numberB != "0") {
					numberResult = String.valueOf(Double.parseDouble(numberA)
							/ Double.parseDouble(numberB));
				} else {
					try {
						throw new Exception("除数不能为0");
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				break;
			default:
				break;

			}
			// 打印结果
			System.out.println("输出结果为:" + numberResult);

		} catch (Exception e) {
			System.out.println("您的输入有误:");
			e.printStackTrace();
		}

	}

}


第二天:老板说,我现在要求你写一个电脑版的计算器,你的代码还能用吗?

你可能说:复制过去再改改就行啦,但是,如果代码超级多,一复制就问题多啦,,

这时就要用封装(例子在前面,分为两个类,有需要直接调用)

第三天:老板觉得加法要改一改,增加求平方根,你又如何呢?

第四天:只在加法增加,3次方根,

......

第n天,在,,,,增加,,,

这时就要考虑继承,封装,多肽的使用了,

以下是一个例子:(改自博客园一位名字叫伍迷的大神,我不知他真名是谁)

(1)主类

package operation;

import java.util.Scanner;

public class Program {
	public static void main(String[] args) {
		try {
			// 输入端
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入数字A : ");
			String numberA = scanner.next();
			System.out.println("请输入操作符(+,-,*,/):");
			String numberOperation = scanner.next();
			System.out.println("请输入数字B : ");
			String numberB = scanner.next();

			// 在这里调用格式工厂的方法
			Operation oper;
			oper = OperationFactory.createOperate(numberOperation);
			oper.numberA = Double.parseDouble(numberA);
			oper.numberB = Double.parseDouble(numberB);
			double numberResult = oper.getResult();
			// 打印结果
			System.out.println("输出结果为:" + numberResult);

		} catch (Exception e) {
			System.out.println("您的输入有误:");
			e.printStackTrace();
		}
	}

}


(2)格式工厂类

package operation;

import operation.Operation;

/**
 * 多肽实现
 * 
 * @author maiyu
 * 
 */
public class OperationFactory {

	public static Operation createOperate(String operate) {
		Operation oper = null;
		switch (operate) {
		case "+":
			// 向上转型
			oper = new NumberAdd();
			break;
		case "-":
			oper = new NumberSub();
			break;
		case "*":
			oper = new NumberMul();
			break;
		case "/":
			oper = new NumberDiv();
			break;
		default:
			break;
		}
		return oper;
	}
}


(3)操作父类:Operation

package operation;

/*
 * 运用封装思想
 */
public class Operation {

	double numberA = 0;
	double numberB = 0;

	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 double getResult() {
		double result = 0d;
		return result;
	}
}


(4)四个类:NumberAdd,NumberSub,NumberMul,NumberDiv

package operation;
/**
 * 加法类,继承父类Operation
 * 
 * @author maiyu
 * 
 */
public class NumberAdd extends Operation {
	@Override
	public double getResult() {
		// 假如某一天公司老板要求在乘法增加一个开根号,即可只需要改动这里
		// double result = Math.sqrt(getNumberA() + getNumberB());
		double result = getNumberA() + getNumberB();
		return result;
	}
}
package operation;
/**
 * 减法类,继承父类Operation
 * 
 * @author maiyu
 * 
 */
public class NumberSub extends Operation {
	@Override
	public double getResult() {
		double result = getNumberA() - getNumberB();
		return result;
	}
}

/**
 * 乘法类,继承父类Operation
 * 
 * @author maiyu
 * 
 */

public class NumberMul extends Operation {
	@Override
	public double getResult() {
		double result = getNumberA() * getNumberB();
		return result;
	}
}

package operation;

/**
 * 除法类,继承父类Operation
 * 
 * @author maiyu
 * 
 */
public class NumberDiv extends Operation {
	@Override
	public double getResult() {
		double result = 0d;
		if (getNumberB() != 0) {
			result = getNumberA() / getNumberB();
		} else {
			try {
				throw new Exception("除数不能为0");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// System.out.println("除数不能为0!");
			// System.out.println("以下结果是错误的!");
		}
		return result;
	}

}



测试结果:

请输入数字A : 
8
请输入操作符(+,-,*,/):
/
请输入数字B : 
3
输出结果为:2.6666666666666665
请输入数字A : 
8
请输入操作符(+,-,*,/):
/
请输入数字B : 
0
java.lang.Exception: 除数不能为0
输出结果为:0.0
at operation.NumberDiv.getResult(NumberDiv.java:16)
at operation.Program.main(Program.java:24)




五,你可能说这么多个类更麻烦,

其实不然,这样更简洁,只需在子类中修改,而且不容易犯错,


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值