面向对象的编程的个人理解
一、面向对象的出现,面向过程的编程方式是否应该被淘汰喃?
1、什么是面向过程,面向对象?
面向过程是以过程为中心的就是分析出问题域,解决问题,然后用函数一步一步的去实现去解决,使用的时候就依次调用它
面向对象就是更功能化,抽象的方法,以对象作为基本来设计的,描述设计是以对象为中心的。
2、面向过程是如何过渡到面向对象的?
随着时代的发展,科技的进步,计算机不止用于科学计算,更多的用于各个方面的使用。编程不在是科学家的事情,科学家对科学运算的过程非常清楚面向过程的方式非常适合使用。但是随着时代的发展,程序员的出现,各个领域的需求,但是程序员并不一定都了解每个情景,这个时候针对于每个参与者的方式去实现相应的功能就显是非合适了。
3、在有了面向对象情况下,是否不需要面向过程了?
在面向对象情况下,肯定是需要面向过程的,因为在面向对象当中是绝对不可能没有一点面向过程的影子,面向过程是否被淘汰答案;肯定是否,为什么呢,在个人绝对 在一定的情况下,面向过程做一些小的程序速度开发会更快,就不一定非要面向对象了。面向对象和面向过程谁好,全是各有自己的优势,面向对象容易修改维护,而面向过程逻辑更简单做小东西开发也会更快,所以说谁好?我绝对俩者之间都有自己的好处。看看所处的开发环境。
二、类与对象的概念,对象与类的区别与联系
对象:视具体实际的存在。对象是通过类来产生的,这个过程称为实例化。对象可以是问题域中出现的任何人,事物或者实体。
类:类抽象的概念。在类身上定义对象有哪些行为和属性,其实类就是一种自定义的数据类型。
在问题域中使用的是对象,类是具有相同属性和行为的一组抽象。
属性:是指对象身上所有的“值”数据;
行为:对象可以做的或者我们想让他做的什么事。
三、3、类的定义语法,对象的产生语法,对象的使用语法
public class 类名{
属性
属性是指类当中的“值数据”,所以在表现形式上是以数据量形式进行表达。而数据量形式在编程中只有两种: 变量和常量。
由于我们现在定义的是”类“,所以变和不变应该基于全体对象进行考虑,而不能只考虑单一的对象。那么所有对象都拥有该属性但是值不一样的,就要定义为”变量“; 只有所有对象都拥有该属性且值都一样且不能更改的,才定义为”常量“。语法:直接沿用”变量“或"常量的语法",而且要加 访问修饰符,就算不写也有默认!另外变量属性如果没有指定赋初值,那么会
自动初始化;“基本数据类型”初始化为0,
“引用数据类型”初始化为null。
行为
行为是指对象能够提供哪些动作(功能),所以在语法上行为就是“方法”的定义。
语法:
修饰符 返回类型 方法名(形参列表){
方法的实现指令集;
}
与Java基础中的函数语法一致,除了不写static。
特别说明:static描述的方法是一种特殊情况,前面是为了调用方便,没有考虑面向对象语境和语法所以要 大家使用。
}
1、理论上一篇Java文件可以书写多个类,但是公共类只能有一个!----因为公共类的类名必须和Java文 件的文件名保持一致。所以在实际开发当中,除了后面我们一起了解的高级语法(内部类),那么最好是一篇Java文件一个类。
2、class文件是一个类会被编译成一篇独立的class文件;class文件的名字就是类名.class。
* 面试常见问题:
* 1、一篇Java文件对应一篇class文件,是否正确?
* 错误的!!class文件只跟有多少个类有关!!
* 一篇Java文件可以写多个类!!!
* 2、Java文件的名字和class文件的名字保持一致?
* 错误的!!!class文件的名字是和类名保持一致的,
* 而只有公共类的类名才要求和Java文件保持一致,其他
* 情况可以不一致。
类名 对象名 = new 类名();
附加知识点:
1、类是一种数据类型,而且是引用数据类型;
2、内存的划分,以及各种变量在内存中的存放位置 和 结构内存划分情况说明:
内存会被划分为4个区域:代码段、数据段、栈区、堆区;
在加载期,代码(特别是方法)会被加载放入到代码段,每个 方法只放一次;在加载 期,凡事代码中的常量会被放入到数据段(以后还会有细节);运行期,局部变量会被放入栈区,而new出来的对象(当然也包括 对象身上的属性)会被放入到堆区。 可以看到放入的内存位置跟数据类型是无关的。数据类型控制的是变量存放值的方式而不是位置。基本数据类型变量所在的内存放的就是数据值本身,引用数据类型变量的所在内存中存
放的是数据的引用,值(对象)在其他地方。
对象使用 "."操作 访问属性或者方法
附加了访问修饰符(三个关键字,4种情况)
public --- 公共的
默认不写 --- 同包的
private --- 私有的
没有讲完有待于进一步的补充
四、销毁对象 ---- 垃圾回收机制(GC)
垃圾回收是独立的运行机制,有自身算法去控制回收; 唯一的代码System.gc(), 效果是啥?
最基本的回收算法是啥?---当一个对象没有引用指向的时候,但,是不是马上回收仍然由GC的其他算法去判定。
五、如何在一个问题域当中设计类、属性和方法呢?
1、首先在问题域当中寻找名词---对象应关注而产生
2、是不是找到的名词都是要自定义的类呢?
不是,判断是否有现成的数据类型就能够满足问题域对该名词的要求;如果有,直接使用现成的数据类型;没有才 自定义类!
3、通过问题域判定,名词与名词之间的关联关系;
use -- a, has -- a
如果是has-a关系,那么把对方作为自己的一个属性;
4、找动词,动词都是行为
5、把行为划分到它所属的类型当中去
6、合并考虑行为和use-a关系,决定哪些行为是需要绑定 另外一个类型的
7、最后再在main方法当中把他们产生、调用;
六、this是什么?什么时候用?
this是一个隐式对象,所谓“隐式”就是说这个对象不用显式声明, 在类内部自带,直接使用,所以它是关键字。它的含义是在类的内部代表“当前操作对象”。我们可以理解为在生活中的“我”这个词的概念。
通常在代码中访问本类的属性或者行为,都会使用前面加"this."的方式;好处有2种:
1、this.只能调用到本类的属性和方法,所以可以在阅读代码的时候 和普通局部变量做区分;
2、在属性和方法过多的情况下,this.会触发IDE工具的联想功能,帮助我们快速找到要操作的属性或调用的方法。
七、类名和类的限定名之间的关系与区别
1、一个类的全类名----“类的限定名”是在JVM中真正记录的类名,它除了包含类名以外还包含了类的包路径作为整个“类名”;所以:com.lovo.love.Boy b = newcom.lovo.love.Boy(); 是正确的,且是标准的。
2、import指令是为了帮助程序员书写Java代码的时候,在便利性 上提供的指令;并不会被编译到class文件中。也就是说class 文件当中类的名字全是直接使用的“类的限定名”。
3、通常情况下,我们不会使用类限定名;除非我们要在一个类当中 用到两个来自于不同包的同名类。 比如:java.util.Date 和 java.sql.Date 那么我们只能选择import一个,然后用限定名指定一个。