一,封装
理解:把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能的隐藏对象内部实现细节
例如:我们写一个简单的输入两个数和一个操作符(+,-,*,/)的的运算,
可以把具体操作和属性封装成一个类
如:
主类:
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;
/**
* 利用继承
* @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;
}
}
package operation;
/**
* 乘法类,继承父类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)
五,你可能说这么多个类更麻烦,
其实不然,这样更简洁,只需在子类中修改,而且不容易犯错,