1. 类(类型)于对象
(1)面向过程的开发于面向对象开发的区别:
面向过程更重视流程化以及功能的开发,简单点来讲,就是按照固定的模式一步步按部就班的进行,最终达成一个功能的实现。这种模式叫做面向过程开发。
也可以称之为对于一个功能的“增删改查“性质的开发。例如图3中的案例,最终是站在一个功能实现的角度,来最终实现学员信息的增删改查。(纯为了完成功能来进行开发)
参照下图:
面向对象开发不是以功能为主导,而是以对象为主导。所谓对象主导是指一个软件的开发,不光包含功能的实现还要包含所有参与软件的参与者。
所以面向对象的开发就是面对所有软件参与者的开发。因为开发一个软件,最终的目的是给软件的相关人员使用或者被使用的。所以在软件开发的时候要考虑到使用软件所牵扯到的所有者。这种思维的开发方式就是面向对象的开发。
而在进行面向对象开发的时候,首先要搞清楚各个参与者之间的属性以及对应关系。 (属性于属性之间/参与者于参与者之间的关系)
参考下图:
上图中很形象的把面向对象开发的含义给描述清楚了。
我们再开简单概括一下。所谓的面向对象的开发,无软是开发什么样的软件,都是面向软件的参与者。把各个参与者以及参与者之间的属性(也叫特征),行为和关系很好的描述出来的开发称之为面向对象的开发。(而我们的现实世界其实就是面向对象的!所以在程序员眼里万物皆对象。)
(2)万物皆对象
上述已说明,我们的现实生活中其实就是一个面向对象的世界。不管任何物种都包含了这个物种的特征跟行为。那我们来看一个例子如下图。
比如说下图中的电话,电话的外观,品牌,大小这些是电话的属性也叫特征。而接电话,打电话,发短信,打游戏这类的动作就是电话的行为。
而我们假如说要开发一个描述电话的代码时,就要先把这些元素通过代码的形式描述出来。(书写方法在后续更新)
那么我们简单概括一下,只要在软件系统中把某个对象的属性跟行为用代码的方式描述清楚了,也就是这个对象成了系统的参与者,那么这种开发方式就是面向对象的开发。
(3)类于对象的关系。
类于对象的关系,其实就是类型于对象之间的关系。比如说人于小张之间的关系。人是一个物种而小张是这个物种中的一个具体的个体。而这种关系其实就是类别于个体之间的关系,也就是类于对象之间的关系。
来我们用图像的方式更形象的来解释一下类以及对象之间的关系。如下图:
下图中小黑跟小白都有自己的姓名,性别,年龄以及各自的行为方式,而且都为同一物种。所以我们把小白跟小黑归类为狗狗。
那么写代码也是一样,我们可以把相同属性的数据或者说是物种归为一类。然后再定义他们的行为,并且执行。
下图为相反案例,我们从外观上就可以看出狗跟猫的不同。而且他们之间的属性跟行为也各有不同。
所以当我们写代码时,也要把不同特征的事物分别作为不同的类来定义,并且要分别描述出各个类中单个个体的参与者的属性跟行为。
那么问题来了,我们如何把对象归为一类呢?
参照下图来描述,我们要将对象抽取成类,必须要遵循具有共同的属性和相同的行为这样一个规则来进行抽取的,这样我们才能确定这个类别具有哪些属性和行为!
也就是说类其实就是具有一些相同属性和共同行为的一些对象的集合,类可以是一个概念,也可以看成是一个模板,面向的对象是一个真实存在的实体!
类是从对象当中抽取出来的,对象是类当中的一个实例,这就是类于对象的关系于区别。
2.面向对象的优点以及三大特点:
(1)面对对象的优点其实下图内容很显而易见。就是用代码的形式于现实接轨,从而更高效的把开发成果展现出来。
这种开发方式也使得软件的参与者之间的交流更为顺畅。
(2)封装,继承,多态
封装:所谓的封装就是把所有部件都组合在一起,包起来。可以设想一下其实我们现实世界上的任何物体都是封装而成的。如果没有封装那么每个个体就成了这个物体的部件,乱七八糟的了。比如说人:是由眼睛,鼻子,耳朵等组成的,如果不封装也就不能称作人,人本身其实这也是一种封装的产物。
继承: 继承的话大家都很好理解,最简单的例子就是我们人。我们每个人都是从生下来就继承了上一代的基因。包括父母将来的财产等这些都是一种继承的方式。
多态:顾名思义就是指多种形态。还那我们人类做例子,比如说男人。要想做一个好男人,至少要在不同形态的3个方面来完成。比如说做个好儿子,做个好丈夫以及做个好爸爸。在不同的状态中扮演不同的角色,这种呈现方式在java中被称为多态。(可参考多态的图片)
总结:
上述讲了很多关于面向过程以及面向对象的内容。让我们再来对比一下面对过程以及面对对象的不同之处。
如下图中图1是面对过程的案例,从内容中我们就能一眼就能看出这是一个面向功能开发方面的拓扑,而图2中的案例是把要开发软件或者说代码的参与对象给排列出来了,而我们接下来的开发也是围绕着这些对象来进行代码的编写的。
3. 用代码的方式来实现面向对象的开发
写代码跟大千世界一样先要归类然后再针对类中的个体进行编写。也就是说面向对象的开发,就是分析对象的过程,我们分析完之后再根据这些对象的属性和行为抽取成类。我们的程序也是以类为单元的!那么我们是如何来描述类的呢?
参照下例我们来写一个实际的面向对象代码。图中的class 代表类型的意思。class后面跟的是创建类的名称。这里创建的是一个Person类,所以下面的代码也是围绕人类的特征来描述的。而代码中的name,gender,age是这个类型的特征也叫做属性。而void后面跟的eat,work是这个类的行为。至于eat(),work()中以及{}中的内容我们先不做讨论在后续的更新中会体现出来。需要关注的是这段代码本身描述的就是一个人的特性跟行为,合起来其实就是一个描述人类的一个类,知道这个就可以了。这样我们就通过代码的方式把现实生活中的人做了一个彻底的描述。
/*
* 人类
*/
public class Person { //特征(通过变量来保存特征) public String name; //描述(保存)人的姓名 public String gender; //描述(保存)人的性别 public int age; //描述(保存)人的年龄
//行为(通过方法的语法来描述对象的行为。所谓的方法就是一种语法) public void eat(String name){ System.out.println(this.name+"邀请"+name+"共进晚餐!"); } public void work(){ System.out.println(this.name+"工作理念:干活挣钱有饭吃!"); } public void work(String contect){ System.out.println(this.name+"工作理念:"+contect); } }
我们再来做一个例子,分别把类以及对象用代码的方式体现出来。同上例一样先定义一个类。下例因为是做一个电影类,所以我们用Film来作为这个类的名称。
然后分别定义电影中所有的属性,比如影片的类型,名字,主演,导演等。然后通过赋值变量的方式保存下来。声明变量的时候要加public类宝标识符,这个不要忘记。
定义好了类的属性后我们还要定义类的行为。我们简单的打印一下刚才定义类中所有的属性,然后打印出来。在此要说明的是,因为我们是通过变量的方式来保存类的属性的,所以在写代码的时候,这里也要通过变量的方式先把要打印的内容通过“+“给串联起来。那么变量中的值是如何传进来的呢?让我们接着看下一段代码。
public class Film {
/*
* 定义电影类
*/
public String type;
public String name;
public String director;
public String act;
//定义电影类的方法(也就是行为)
public void display(){
System.out.println("电影类型:"+type+"\n电影名称:"+name+"\n导演:"+director+"\n主演:"+act);
}
}
OK,既然我们用变量的方式来存储了类的属性跟行为。那么这些变量目前为止只是存在了内存中还为被使用。既然我们定义了变量目的就是为了使用它们的。所以我们需要再重新创建一个class 然后在这个class中使用之前已经被我们创建好的类,然后给类中各个变量再赋值后就可以直接使用了。如下代码。
public class Film_test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//直接使用创建好的Film类,并给类中的各个属性赋值
Film a = new Film(); //new Filme()的意思是创建概类型下面的个体。而a只是一个变量。
a.type ="爱情片";
a.name = "<微微一笑很倾城>";
a.director ="林玉芬";
a.act = "扬洋,郑爽";
a.display(); //因为之前创建类中的方法我们定义的变量是display。所以这里 .display();的意思就是直接调用之前类中定义好的display中的内容的意思。
}
}
最终打印结果请参考下图内容
注释:上述例子中我们创了2个class。第一个class是Film,这个是面对对象的过程。而第二个创建的class,其实这个是面向过程而不是面向对象的。原因在于第二个类中
我们并没有对对象事物进行描述,而是为了完成一个功能才创建的。所以说第二个类其实是面向过程的。这两者之间的关系一定要分清楚。
OK,到目前为止我们对类的属性以及行为的定义,还有如何编写一个面对对象的代码应该有一个清晰的认识了。我们再来补充一个小知识点。下图中的代码是上述我们讲创建一个Person中的代码。对于定义类的属性跟行为的代码就不重复解释了。仔细看行为中()小括号中我们加入了参数。而这个参数我们在java中称之为局部变量。跟其他变量一样最终的目的也是为了传值而使用的。局部变量跟成员变量的变量名在java中允许相同。但是在使用的过程中最好对于成员变量,通过this.变量名的方式进行书写。以便于让别人知道你每个变量分别指的是谁。
另外下例中我们定义的2个work方法。一个是public void work(),另一个是public String work().这2者之间的区别在于void是不带有返回值的,直接输出。而定义的String类型的方法是带有返回值的,书写方式也不同。带有返回值的代码是通过定义变量,然后return 变量的方式来进行返回的。我们这2个work方法虽然书写格式不同但是实现的功能相同,我们把这种方法称之为“重载”!
public class Person {
public String name;
public String gender;
public int age;
public void eat(String name){
System.out.println(this.name+"邀请"+name+"共进晚餐!");//this.name是指上述的Public String name;中的name.也叫做成员变量.
//而+name的name是指eat(String name)中的name.也叫做局部变量
}
public void work(){
System.out.println(this.name+"工作理念:干活挣钱有饭吃!");
}
public String work(String contect){
String msg = this.name+"工作理念:"+contect;
//System.out.println(this.name+"工作理念:"+contect);
return msg;
}
}
4.方法的重载
上述简单的提了下方法中重载的问题。那么我们说一下方法重载中的注意事项都有哪些。
(1)方法要同名 (2)参数项不同 (是指参数的类型或者个数不同)(3)方法是否能重载跟访问类型以及访问修饰符无关(public(访问修饰符),void(访问类型))
注释(2):下图中有三个work方法。但是()中的类型各自不同,所以当类型相同的情况下是可以被使用的。(如图1)如果同为String类型,而且两者同为只有一个参数的话那么就不允许创建方法了。但是如果同为String类型但是参数个数不同的情况下,Java中是允许创建方法的。(如图2)
图1:
图2:
5. 构造方法
什么叫构造方法?
简单一句话来讲,new后面跟的就是构造方法。我们是用new来调用构造函数来创建类的对象的。
还拿下面这个图片的例子举例。图1中new 后面跟的Film()其实就是我们所讲的构造方法。那么我们再来看图2,图2中是我们定义这个Film类的对象。但是我们并没有看到有定义一个Film()的构造方法,那么它是从哪里来的呢?那是因为Java虚拟机,会提供一个默认的无参的构造函数。
图1:
图2:
构造方法都有哪些特征?
(1)于类同名 (new后面的构造方法是调用创建的类,所以要跟类同名)
(2)不指定返回值类型 (比如说new Film()是java虚拟机给我们自动创建的构造方法。实际上创建的是一个"public Film(){ }"这样一个无参数的构造方法,这种构造方法是不带返回值的,而我们之前的方法中是带有返回值的。如:return以及System.out.println();)
(3)有参构造方法于无参构造方法(其实上述例子中已经涉及到有参及无参的案例了。说白了就是小括号中是否有定义变量或者说定义参数,如果有定义就是有参构造方法,没定义就是无参构造方法。在有参构造方法中还分1个参数跟多个参数,如果函数名相同,那么参数的类型跟数量不能相同。相反如果函数名相同但是类型不同或者类型相同,参数不同的情况也可以允许使用)
public class Person { public String name; public String gender; public int age; public void display(){ System.out.println("姓名:"+this.name+"\n性别:"+this.gender+"\n年龄:"+this.age); System.out.println(this.name+"邀请一个"+"年龄"+age+"岁,名字叫"+name+"的"+gender+"孩一起看电影!"); } //无参构造方法 public Person(){} //1个参数的构造方法 public Person(String name){ this.name = name; System.out.println(this.name+"邀请一个"+"年龄"+age+"岁,名字叫"+name+"的"+gender+"孩一起看电影!"); } //多个参数的构造方法 public Person(String name,int age,String gender){ this.name = name; this.age = age; this.gender = gender; } }