面向对象的思想初步了解
面向对象和之前学的面向过程是2种不同的编程思想,两者的思维有较大的区别,下面将举例初步表现这两种思想的差异性
设计一个程序去统计字符串"want you to know one thing"中字母 o和n出现的次数
//实现对字符串中出现字符次数的统计
public class SplitTest{
public static void main(String[]args){
String str="want you to know one thing";
int oCount=0;//记录o出现的次数
int nCount=0;//记录n出现的次数
String []result=str.split("");//按字符拆分
for(String str1:result){
if("o".equalsIgnoreCase(str1))
oCount++;
if("n".equalsIgnoreCase(str1))
nCount++;
}
System.out.println("o出现的次数为"+oCount+" n出现的次数为"+nCount);
}
}
output:
o出现的次数为4 n出现的次数为4
自顶向下,逐渐细化,我们按着我们罗列的步骤去解决问题
举例说明2种思想
假如你是一个老板,有一天你要向属下指导工作,如果用面向过程的思想,你要指导属性先做什么 再做什么,然后又做什么,要告诉他解决问题的每一个步骤。但如果是面向对象的思维,首先万物皆是对象,属下肯定也是一个对象,然后分析这个对象(属性)具备的属性和行为。然后你发现有做这件事的能力就ok了。你不必去关系他具体怎么做,只用关系他有没有这个能力(行为)
其实这更符合现实,如果现实中的老板都要一步一步的指导属下怎么做,老板早就累死了吧。
用面向对象的思维改写程序
//实现对字符串中出现字符次数的统计
class StringUtil{
private String content;//字符串内容
public StringUtil(String content){
this.content=content;
}
public void setContent(String content){
this.content=content;
}
public String getContent(){
return this.content;
}
}
//对以上功能的延续
class StringCount extends StringUtil{//实现统计
private int oCount=0;//记录o出现的次数
private int nCount=0;//记录n出现的次数
public StringCount(String content){
super(content);
handleContent(content);
toString();
}
public void handleContent(String content){
String[]str=content.split("");
for(String str1:str){
if("o".equals(str1))
this.oCount++;
if("n".equals(str1))
this.nCount++;
}
}
public String toString(){
return"”n“出现的次数为:"+this.nCount+"”o“出现的次数为:"+this.oCount;
}
}
public class SplitTest{
public static void main(String[]args){
String str2="want you to know one thing";
StringUtil st=new StringCount(str2);
System.out.println(st.toString());//向上调用子类覆写的方法
}
}
output:
”n“出现的次数为:4”o“出现的次数为:4
我们看出,我们通过分析对象,设计出符合要求的对象,从而调用对象的行为实现功能,我们如果将这种功能设置在一个类里,会使得类的属性显得不伦不类,从现实中讲不通该类有这种属性,所有该处使用了继承,分成两种类
但可以发现如果采用面向对象的思想实现这个功能,代码量比面向功能相比长了很多,显得啰嗦,但他的结构很清晰