先认识下面向对象编程,俗称OOP,全称:Object Oriented Programming,意为面向对象编程。将系统中的所有事物都看做对象,每个对象都有自己的特性和功能,就像公司的每个人都有自己的个性和职责一样,大家一起协作最后才能办成大事。
基本概念面向对象有这几个基本概念:类、对象、属性、方法、包、访问权限、继承、抽象、接口。一列出来,感觉东西比较多,其实不复杂,慢慢了解一下就好了。
类用class关键字来声明,例如:
class Beauty { }
上面Beauty是类的名字。
对象一个类要使用,一般要变成对象。 打个比方,类就是模具,对象就是模具做出来的东西,只需要一个模具,就可以做出千千万万的东西。样例如:
Beauty beauty1 = new Beauty();
Beauty beauty2 = new Beauty();
...
通过关键字new来根据类名生成新的对象。
属性属性就是类的特性、特质,就如我们描述一个人的时候,就会用年龄、身高、体重、三维等这些来描述。对于类,我们为了同样需要设置这些属性来描述清楚。举个样例:
public class Beauty { public int age = 16;
public String name = "都美竹";
}
方法方法就是类所具有的能力,譬如一辆车,就可以用来开;一个工厂,就可以用来生成东西。来个样例:
public class Beauty {
public int age = 18;
public String name = "热巴";
public String buy(int money) { return "Mac口红";
}
}
上面的buy方法就是Beauty类中的一个方法,前面的String表示返回值类型为字符串,毕竟干什么事情都得有个结果,所以大多数方法都有个返回值,如果确实没有,就写个void,像下面这样:
后面括号里的是方法的输入参数,干任何事都可能需要一些资源和前提条件,如果有多个参数,就用逗号分隔
一下;如果没有,那括号里面就啥也不要写。(不需要的情况可能不多,毕竟干啥事都得有点资源,就像买东西要钱,买iphone要肾)。
多来几个例子,让大家更好地感受一下:
1、无参数方法
public String buy() {
return "买买买";
}
2、多参数方法
public String buy(int money,String city) {
return "到魔都买买买";
}
3、无返回值方法
public void buy(int money,String city) {
//理性消费。
}
包包,其实不是包,可以理解为文件夹,就是为了方便分类
管理,不然所有的类都放在一个文件夹下,无数个文件就让人眼花缭乱了。
一般,每个类都会放到某个包下面,用package开头,后面一串路径,用“.”分隔。
如果你要使用别人的类,也需要知道那个类在哪个包下面,这样才能找得对。其实有点像门牌号,得按照国家、省、市、区,一级一级才能找得到。看看下面具体的代码:
如果你有什么小秘密,一定会藏起来;你有什么过人之处,一定会想办法表现出来。访问权限,说得其实这回事,通过设置访问权限,把秘密藏起来,把技能表现出来。
回到正题,我们可以用三个关键字来设置方法和属性的访问权限:
public: 表示谁可以访问。
protected:只有自己继承类才能看得到。
private:私有,除了自己,其他人都看不到。
除去上面三个,其实还有一个,就是不带上面三个关键字中任何一个。这种情况表示当前包内可以看到和使用(上面已经解释了包的概念,如果不清楚,可以往上翻)。
上例子:
如果不想人知道年龄,就把“public int age = 22;”
修改为:“private int age = 22;”
如果不想让你知道自己爱买东西,就把“public String buy”
修改为:“private String buy”
public class Beauty {
public int age = 22;
public String name = "谢某人";
public String buy(int money) {
return "买买买";
}
}
当然上面说的这种隐藏属性和方法的技能,只能防君子,不能防小人,哈哈。因为还有其他技能可以窥探,后面会细讲。
继承Java中的类可以从其他类继承(使用关键字:extends ),自动获得其他类的能力(访问权限为public、protected的方法和属性)。样例如下:
public class SupperBeauty extends Beauty { }
这个类就自动获得了Beauty类的所有能力。在这里,Beauty类我们称之为父类;SupperBeauty称之为子类。
抽象在类里面,可以设置某些方法为抽象方法,自己只是留个坑位,具体的工作交给子类去完成。举例:
父类Beauty定位为“public abstract class Beauty”表明自己是个抽象类,内部包含一个抽象方法“abstract void doIt();”
子类SupperBeauty:需要实现父类中声明为abstract的方法。
在上面的SuperBeauty代码中,就实现了父类Beauty中的doIt方法。如果还有XXBeauty类,也可以继承Beauty类,然后实现doIt方法,里面具体做什么,就各自去定。
为什么要这么做呢?
如果你有这样的疑问,就给自己点个赞。毕竟学问,学问,不只是要学,还要问。编程里的这些东西,都是有其用处的,否则搞这些干嘛呢?
试想一下,有10种类型的车需要喷漆,但是每种车喷漆都有自己的要求,那我们就可以创建一个父类车,定义个喷漆的方法。然后各个子类对应不同类型的车,自己去实现喷漆这个方法,这样最终要喷漆的时候,调用各个子类的喷漆方法就可以了。
接口接口和上面的抽象类、抽象方法是一个派系的,只是更为单纯。对于调用者来说,希望尽可能少的了解无关的信息。就跟买辆车,你肯定不想了解发动机为什么能转起来,空调又是如何制冷的。对于系统设计来说,也是一样,每个人都尽量把细节放在自己肚子里,让别人知道得越少越好,这样的系统才更为健壮,也更能适应社会的发展,哦不,是适应产品经理的思维发展。(你的程序设计不够好,就完全hold不住产品经理每晚的奇思妙想)
扯远了。接口使用interface定义,内部可以定义多个方法
接口需要有类来实现,通过implements关键字来指定实现什么接口,样例如下:
那使用者如何使用呢?看下面代码:
注意,声明的时候,用的是Love这个接口,而不是直接使用的Beauty这个类。
为什么要这样呢?
这是为了最大程度的通用性,因为接口比实现类简单,在方法调用时,当做参数传来传去,最方便,以后修改起来也简单。