这篇文章主要是面对对象是啥子、为啥要对对象、面对对象编程该怎么实现
一.什么是面对对象
对象的定义是人们要进行研究的任何事物,例如人、动物,到具体的某个人、某个动物都是对象。还能表示抽象的规则、计划或事件。面向对象这个对象,指的是客体。所谓客体是指客观存在的对象实体和主观抽象的概念。
二.为啥要面对对象
面向对象是为了解决系统的可维护性,可扩展性,可重用性那为啥可以解决可维护性,可扩展性,可重用性呢???
那是因为面对对象有三大特征:封装、继承、多态。
概念:
封装:把不需要对显示的隐藏起来,对外只提供一个类似接口的东西,供使用者使用。使用者不需要了解具体怎么实现。例如一个空调,你只需要知道空调遥控器怎么用就好,空调具体怎么运转你就不需要了解了。这里,就是把空调的运转方式封装起来,提供了一个控制接口–遥控器。
//测试类
public class Text{
private String name;//定义一个私有name字符串变量
//下面的setNme,getName就是对name的封装
//外部想要修改name就只能调用setName方法,同样想要获得name就得调用getName
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public static void main(String[] args){
Text text = new Text();//创建一个Text的对象
name = "小明"; //这样会报错,因为name是私有的不能直接调用
text.setName("小明");//给名字赋值
String name = text.getName();//取到名字
}//main结束
}//text类结束
继承:从另一个对象继承它的所有成员属性和成员方法,这个被继承的对象也称父类。实现了代码的重用。
//定义一个Text的子类
public class TextSon extends Text{
public static void main(String[] args){
TextSon son = new TextSon();
son.setName("小马");
System.out.println(son.getName());//
}
}
结果如下:TextSon在没有给出setName和getName的方法时用自身对象调用啦
多态:(interface)接口的多种不同的实现方式即为多态。接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。
//接口是没有的成员方法是没有方法体的
//并且在接口里面的属性都是不可变的,即用默认用(public static final )修饰,一般不推荐在接口里定义属性
public interface IFly {
public static final String x="小明";//接口属性
public abstract void fly();//接口方法
}//接口结束
//用TextSon测试
public class TextSon extends Text implements IFly {
//重载fly抽象方法
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can fly");
}
public static void main(String[] args){
TextSon son = new TextSon();
son.setName("小马");
System.out.println(son.getName());//显示name
son.fly();//调用重写fly方法
}
}
以上就是面对对象的三种特征。
三.面对对象编程该怎么实现
概念:
面向对象是一种思想,他让我们在分析和解决问题时,把思维和重点转向现实中的客体中来,然后通过UML工具理清这些客体之间的联系,最后用面向对象的语言实现这种客体以及客体之间的联系。它分为面向对象的分析(OOA),面向对象的设计(OOD),面向对象的编程实现(OOP)三个大的步骤。
1、首先是分析需求,先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么,这些客体之间的关系是什么。
2、把第一步分析出来的需求,通过进一步扩充模型,变成可实现的、符合成本的、模块化的、低耦合高内聚的模型。
3、使用面向对象的实现模型
例子分析:
拿网吧来讲:网吧是一个抽象的主类没有具体的一个例子,我们学校外面的两个网吧,黑马网吧和斗鱼网吧就是两个子类了。
网吧具体有哪些属性呢:网吧名字、网吧地址、老板、网管、前台小姐姐(或者小哥哥)、网吧网速、网吧电脑配置,网费
网吧有哪些功能呢:网吧可以上网(必须的吧),可以点歌(也差不多必须的吧),可以买个泡面(也是必须的呀)、卫生间(必须的)、代取外卖(有的有),网费计算。
父类:
//父类网吧
public abstract class InternetBar{
private String barName;//网吧名字
private String barAddress;//网吧地址
private String barBoss;//老板
private String barWebmaster;//网管
private int barInternetSpeed;//网吧网速
private String[] barComputerConfiguration;//网吧电脑配置
private double barCost;//网吧网费
//set,get方法省略太长啦
//共有成员方法
public abstract void canSurfInternet();//上网
public abstract double cost(int hour,int price);//计费方法,传入上网时间,与上网每小时单价
public abstract void buyNoodle();//买泡面
public abstract void toilet();//可以上厕所
}//父类结束
接口:
点歌有的网吧还是没有就放在接口里面,还有取外卖
//点歌
public interface IOrderMusic {
public abstract void orderMusic();
}
//取外卖
public interface ITake_Out {
public abstract void take_Out();
}
子类1:
//可以点歌的网吧
public class BarSon1 extends InternetBar implements IOrderMusic{
@Override//重写点歌
public void orderMusic() {
// TODO Auto-generated method stub
}
//继承所有父类方法
@Override//重写上网方法
public void canSurfInternet() {
// TODO Auto-generated method stub
}
@Override//重写消费方法
public double cost(int hour, int price) {
// TODO Auto-generated method stub
return 0;
}
@Override//重写买面方法
public void buyNoodle() {
// TODO Auto-generated method stub
}
@Override//重写厕所方法
public void toilet() {
// TODO Auto-generated method stub
}
}//子类结束
子类2:
//可以取外卖
public class BarSon1 extends InternetBar implements ITake_Out{
@Override//重写取外卖
public void take_Out() {
// TODO Auto-generated method stub
}
//继承所有父类方法
@Override//重写上网方法
public void canSurfInternet() {
// TODO Auto-generated method stub
}
@Override//重写消费方法
public double cost(int hour, int price) {
// TODO Auto-generated method stub
return 0;
}
@Override//重写买面方法
public void buyNoodle() {
// TODO Auto-generated method stub
}
@Override//重写厕所方法
public void toilet() {
// TODO Auto-generated method stub
}
}//子类结束
到此分析结束。
学习总结: 需要由面向过程编程到面相对对象编程转换。
这里是引用:
当我们习惯了面向过程编程时,发现在程序过程中到处找不到需要面向对象的地方,最主要的原因,是思维没有转变。我们通常在拿到一个需求的时候,第一个反应就是如何实现这个需求,这是典型的面向过程的思维过程,而且很快可能就实现了它。而面向对象,面对的却是客体,第一步不是考虑如何实现需求,而是进行需求分析,就是根据需求找到其中的客体,再找到这些客体之间的联系。因此面向过程和面向对象的思维转变的关键点。