Java 对象和类
面向过程思想到面向对象思想的演变过程:
在面向过程中,是以方法来进行组织代码的,然后方法之间的相互调用。这样场景在数据相对较少,方法相对较少的情况下,是没有问题的。但当应用程序庞大复杂时,一个根本完成不了,需要多人协作来进行开发时,这时就有问题了。
别人在不清楚你所写的功能代码的情况下是很难上手的,因为我们是以方法来进行组织代码的,别人需要把整个流程熟悉后,才能进行在之前的基础上进行开发(别人需要把每一个方法内部的实现细节都要了解,才能进行修改,否则很有可能把之前程序的逻辑性打乱,从而引发bug。比如,之前的逻辑是a方法中调用了b方法,但是经过修改之后,又调用了c方法,导致整个逻辑就出现了问题。)
所以,以面向过程的思维进行大型开发时,程序的管理比较复杂,不易于程序的扩充;对于程序的可维护性比较低;
但是,在c语言中,有一个结构体的特性,可以把每一类型的变量存放到每一个结构体中来进行管理。比如,把车相关的变量存放到车的结构体中,把行车导航仪的相关的变量存放到导航仪的变量中。当变量使用时,使用结构体.变量来调用对应的变量。方法也类似的操作,封装到一个个的结构体中。
但是,这样还是存在缺陷的,比如,车相关的方法:启动的方法,需要调用启动相关的变量时,必须要调用封装启动变量的结构体,才能获取数据。在此基础上,就在思考,为什么不把车启动的变量和方法的数据封装到一起呢,这样明显更加具有条理性。
于是,把每一类型的数据封装到一起,这时,类的概念就出现了(c++,在c语言的基础做了升级)。这个就是面向对象的思维;
以类的方式组织代码后,之前1000个变量和1000个方法的代码结构就会变为n个类,这样管理程序的效率就能大大提高。同时,程序也变的更容易扩展。比如,在现在的功能之上,添加自动驾驶的功能时,只需要添加一个相关的类即可,原有的代码结构并不需要修改。其次,程序的开发分工更加合理,比如按照功能来进行分工,从而提高程序开发的效率;当出现人员变更时,新人只需要研究对应的功能即可,不需要把整个应用程序流程研究一遍才能上手,这样也大大降低程序的维护成本;
在选择面向过程开发,还是面向对象开发时,是分应用场景的,如果程序的逻辑比较庞大复杂时,选择面向对象。如果代码比较少,逻辑比较简单时,选择面向过程即可,没必要去选择面向对象。
面向过程思维和面向对象思维的对比:
举例:
如何驾驶汽车?
面向过程: 面向对象:
1、踩离合; 1、驾驶员;
2、挂挡; 2、汽车;
3、踩油门,放离合; 3、驾驶员开汽车;
4、车走了;
面向过程属于线性思维,考虑的是第一步做什么,第二步做什么。。。。。,当事情比较简单时合适。但当事情变的复杂,需求他人的帮助下才能完成时,就需要面向对象的思维了。
面向对象思维来思考事情该如何做时,首先考虑这件事情中,包含有哪些对象,比如,有驾驶员和汽车两个对象,把如何驾驶汽车的多个方法封装到汽车对象当中,汽车直接调用即可实现。所以,在面向对象当中,是包含着面向过程,是对面向过程的高级封装;
面向过程:以事件为中心,强调的是做一件事的步骤;
面向对象:以事物为中心,强调的是由谁来做;
二者最终的目的一样,但方式不同;
面向对象思想编程 总结:
0)编程的本质:
把现实中存在的逻辑,使用代码来实现;现实中逻辑,就是使用语言了进行表达的。
1)面向对象编程(oop)的本质:
以类的方式组织代码,以对象的方式封装数据(以面向对象的思维组织代码,封装数据)。
2)什么是对象:
对象是具体的事物,一类事物具体的一个实例;
举例:张三、李四就是人的对象;
什么是类:
是对对象的一种抽象(抽象,抽出像的部分),一类事物的一个抽象;
举例:人、动物、汽车,都是类;
在编程思想中,必须先定义类,才有对象,对象是java的核心;
抽象的两个方面,也就是一个类包含的两个部分;
1、静态属性------>成员变量;
2、动态行为------>成员方法;
每一个对象都有自己的属性,属性值一般和另一个对象的属性是不一样的。
调用一个方法,必须先new一个对象,然后对这个对象来调用这个方法。针对不同对象调用的方法,它的作用域是不一样的。
类是对象的模版,new出来的对象,都共享类的模版;
3)面向对象也叫做面向类的编程:
作为面向对象,在处理业务逻辑时,不应该先考虑第一步做什么,第二部做什么;
考虑:
1、在问题当中,有哪些类,哪些对象;
2、在这些类和对象中,应该具有哪些属性和方法;
3、类与类之间有怎么样的关系;
技巧:找类的方法:名词,判断名词是类,还是属性;
4)如何在内存中区别类和对象:
类是静态的,在内存的代码区;
对象是new出来的,在堆内存;
5)对象的创建和使用:
1、必须使用new关键字来创建对象;
2、使用对象名(引用).成员变量来引用对象的成员变量;
3、使用对象名(引用).方法(形参列表)来调用对象的方法;
4、操作对象,就是操作它的地址,对象名(引用)就是地址;
6)对象和类 总结:
对象和类的关系:特殊到一般,具体到抽象;
类:class;
对象:object(事务) , instance(实例) ;
类可以看成一类对象的模版,对象可以看成该类的一个具体实例;
类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动态属性。
对象是java程序的核心,在java程序中“万事万物皆对象”;
jdk提供了很多类供编程人员使用,编程人员也可以自定义类;
创建java自定义类:
步骤:
1)定义类(考虑修饰符、类名)
2)编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3)编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
类的属性、类的方法:
1)属性,field,属于成员变量;
2)属性用于定义一个类或一个类的对象所包含的数据,或者说静态属性;
3)属性的作用范围是整个类体;
4)在定义成员变量时,可以对其进行初始化,如果不对其初始化,java使用默认值对其初始化;
5)属性定义格式:
[修饰符] 属性类型 属性名 = [默认值];
6)面向对象中,整个程序的基本单位是类,方法是从属于类的。
7)java中方法参数传递是:值传递;
类包含的元素:
1)成员变量:描述对象的静态属性,分为静态成员变量、非静态成员变量;
2)代码块:
3)构造方法;
4)成员方法:描述对象的动态行为,分为静态成员方法、非静态成员方法;
5)内部类;
构造方法:
1)构造器:也叫构造方法,constructor;
2)构造器的作用:(1)用于构造该类的实例(对象),(2)用来初始化对象的属性;
3)语法格式:
[修饰符] 类名(形参列表){
代码块;
}
4)构造器是一种特殊的方法:
a ) 使用new + 构造方法,来创建一个类的新对象;
b ) 构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类对象),不能在构造器里调用return;
c ) 如果没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已经定义则编译器不会添加;
d ) 构造器的方法名必须和类名一致;
e ) 构造方法可以有多个,构造方法的重载;
f ) 最好同时定义无参和有参构造方法;