很多人学了面向对象语言学了很久却没有领会到什么是面向对象,也正是因为这样,很多时候我们写代码时感觉无从下手,什么是面向对象。举个例子:贪食蛇的游戏大家玩过吧。蛇是一个对象,食物是一个对象。蛇的类中有什么呢,属性和方法,属性有蛇的坐标,蛇的长度,方法有上下左右移动。食物有什么属性和方法呢,属性是坐标,方法是出现在随机背景中的某个位置。这就是面向对象的最基本的理解。 再举一个例子,一个接口,interface Animal;里面有一个方法move();类rabbit实现了这个接口,类tiger实现了这个接口。兔子中有一个属性:素食,兔子中的move(){跳跳跳} 老虎中有一个属性:肉食,老虎中的move{跑跑跑} 。 从这里我们可以看到类其实就是属性和其行为的封包,接口就是一个种行为的规范。 类中我们要特别注意的一点就是:各司其职,不要去含有不该含有的属性,不要去实现你不该有的方法,这是特别重要的一点。面向对象中除上述的以外还有一个特别重要的东西就是面向接口编程。下面有一个比较经典的例子。USB接口上可以插U盘,也可以插鼠标,我们来模拟他,并分析什么是面向对象。首先我们分析U盘是个类对吧,里面该有点自己的属性吧,还有自己的行为吧,鼠标是个类吧,也该有自己的方法和行为吧。USB接口是个接口,当你写程序不知道怎么下手的时候,这些先可以写上吧。然后是USB接口,他仅仅是一个接口,只要实现了这个标准的东西就可以插上去使用。所以USB弄成一个接口,行为是doSomething();Ok,开始写代码
interface USB{
void doSomething(); //USB接口的行为,做点儿事
}
class UDisk implements USB{
private String action1="装东西";
private String action2="传东西"; //U盘的特征
@Override
public void doSomething() {
System.out.println(action1+" "+action2); //U盘做事
}
}
class Mouse implements USB{
private String action1="拖动"; //鼠标的特征
private String action2="点击";
@Override
public void doSomething() {
System.out.println(action1+" "+action2); //鼠标做事
}
}
class PeopleAction{
public static USB insertUDisk(){
return new UDisk(); //人插入优盘
}
public static Mouse insertMouse(){
return new Mouse();
}
}
class Test{
public static void main(String[] args) {
USB usb=PeopleAction.insertUDisk(); //插入U盘,获得一个U盘的实例,父类引用指向子类对象,我们不用关心U盘中的具体实现,
usb.doSomething(); //只要插上去用,也就是插上去过后dosomething
usb=PeopleAction.insertMouse(); //插入鼠标,获得一个鼠标实例,父类引用指向子类对象,我们也不必关心鼠标的具体实现
usb.doSomething(); //插上去就用
}
}
从这个例子中我们也可以看出什么是面向对象,也就是属性和其行为的封包,接口对具体实现的解耦。假如我们不用接口,那么我们总是要这么写 UDisk disk=new UDisk(); Mouse mouse=new mouse();我们在Test中总是要想到要把U盘弄出来,鼠标new出来,显得不直观。而用了接口过后,从我们peopleAction那个类中我们可以看到插入是我们的一个行为。我们之所以写这个类是为了不让new UDisk和new Mouse暴露给别人,插入显得更加地直观,这是是简单的工厂模式。插入U盘用U盘,插入鼠标用鼠标。当然,更好的也可以用ioc来做,比如说我们几个人做一个项目,你写的是UDisk那块,如果你写成new UDisk,意味着你把UDisk的实现给了其他人,假如你UDisk里面的东西需要改动,你还要去找他们商量,如果次数少还可以,搞到几次估计很难和别人相处。我们要做的是把接口给他,把USB给他,然后用依赖注入的方式注入给USB的引用。直接通过引用调用插上去的实体的方法,这也是目前Spring框架中用到的,一种很重要的思想。
千言万语汇成一句话: 面向对象的核心就在于其属性和其行为的封包,接口对于具体实现地解耦。
转载请注明出处
interface USB{
void doSomething(); //USB接口的行为,做点儿事
}
class UDisk implements USB{
private String action1="装东西";
private String action2="传东西"; //U盘的特征
@Override
public void doSomething() {
System.out.println(action1+" "+action2); //U盘做事
}
}
class Mouse implements USB{
private String action1="拖动"; //鼠标的特征
private String action2="点击";
@Override
public void doSomething() {
System.out.println(action1+" "+action2); //鼠标做事
}
}
class PeopleAction{
public static USB insertUDisk(){
return new UDisk(); //人插入优盘
}
public static Mouse insertMouse(){
return new Mouse();
}
}
class Test{
public static void main(String[] args) {
USB usb=PeopleAction.insertUDisk(); //插入U盘,获得一个U盘的实例,父类引用指向子类对象,我们不用关心U盘中的具体实现,
usb.doSomething(); //只要插上去用,也就是插上去过后dosomething
usb=PeopleAction.insertMouse(); //插入鼠标,获得一个鼠标实例,父类引用指向子类对象,我们也不必关心鼠标的具体实现
usb.doSomething(); //插上去就用
}
}
从这个例子中我们也可以看出什么是面向对象,也就是属性和其行为的封包,接口对具体实现的解耦。假如我们不用接口,那么我们总是要这么写 UDisk disk=new UDisk(); Mouse mouse=new mouse();我们在Test中总是要想到要把U盘弄出来,鼠标new出来,显得不直观。而用了接口过后,从我们peopleAction那个类中我们可以看到插入是我们的一个行为。我们之所以写这个类是为了不让new UDisk和new Mouse暴露给别人,插入显得更加地直观,这是是简单的工厂模式。插入U盘用U盘,插入鼠标用鼠标。当然,更好的也可以用ioc来做,比如说我们几个人做一个项目,你写的是UDisk那块,如果你写成new UDisk,意味着你把UDisk的实现给了其他人,假如你UDisk里面的东西需要改动,你还要去找他们商量,如果次数少还可以,搞到几次估计很难和别人相处。我们要做的是把接口给他,把USB给他,然后用依赖注入的方式注入给USB的引用。直接通过引用调用插上去的实体的方法,这也是目前Spring框架中用到的,一种很重要的思想。
千言万语汇成一句话: 面向对象的核心就在于其属性和其行为的封包,接口对于具体实现地解耦。
转载请注明出处