从未学习过java面向对象编程的朋友,一篇文章包你学会,通俗易懂。【xiao金刚】
学了一个月的java编程发表下对面向对象的一些总结。课堂上讲的有点系统性,部分细节方面没有讲到,(构造函数 构造代码快 匿名函数 this关键字 静态 静态代码块)这些只能通过课外的知识来扩充一下,下面是本人总结了课堂学习和课外教程的总结 对面向对象的理解。花了三个多小时整理出来的,希望能帮助一些刚刚开始学习java面向对象的朋友。丑话说在前头。想学的就看下去,不管多长终有结束。看完了文章你就能把类和对象使用自如,关于对象和类在堆和栈内存中的过程我会在后面的文章慢慢说。 xiao金刚 原创
qq :709448646
1 面向对象介绍
1.什么是面向对象对象其实就是现实生活中的各种物体,他们有各种各样的功能,当我们需要借助这些物体去完成我们的需求时,我
们就是在面向这些对象,使用它们其中的功能,至于他们其中的功能是如何实现的,我们无需知道,只要能完成需求既可。万物皆对象,刚开始学
习对象和类的时候建议不要看构造函数, 构造带码块 ,匿名函数, 封装 ,成员代码块,this关键字,以及静态修饰,学习一些基本的东西就
不会让你感觉到类和对象是那么烦的东西,其实类和对象很简单,不要想的那么复杂,为什么我下面会说oop(面向对象)是一种思想呢,
因为当你了解了对象之后就会知道对象的使用是 多么简单,对象就好像是一个人一样,你让他干嘛他就干嘛。他不会罢工,只要这段代码
的生存周期还在的前提下,就是说这个人还活着。他有钥匙(变量)你让他开门(方法)[函数调用变量进行操作],他就开门,至于他怎么开
门你不用理会先,你只需要知道了你让他干嘛他就干嘛这就是一种面向对象的思想。回到那个人开门那里。为什么他会开门。就因为这个人(对
象)拥有开门的方法,所谓的方法就是函数,函数怎么定义呢。相信学到这里的人都应该知道如何写函数了吧。我这里就带过了。我们让他开门
他就得开。然后我们再命令另外个人去开窗,这两个人是不一样得人,拥有得方法(函数)不一样。我们可以创建另外一个对象,叫他去开窗。
如果你想让这个人拥有开门又拥有开窗的方法,那么就要给一个对象定义多个方法(函数),那我们就不需要再去创建多一个对象浪费内存了。
至于类和对象得关系就更简单了。类就相当于一个概念,都有共同的属性,比如说年龄 名字 他们都拥有这些属性,类的实例化就是对
象。 什么是实例化呢。实例化就是说精确到一个个体(一个人)。在一个类中创建一个对象就需要用到一个关键词“new”,这个关键字的功能很
多,这里只说一点,他就是用来创建对象。 创建了对象之后我们就要叫这个人做事了,做事总得有个方法来叫是不是,那就是专业词语
(其实也不算专业)调用,调用得方法就是 对象名.方法 (打点空格让你们看清楚) 这就是叫那个人做事的命令。你想要
他干嘛他就干嘛。你想他有什么功能就直接到类里面去定义,要实例化了才能调用,(即创建对象,暂时需要知道的就是要先创建对象,至于学
到后面直接引用类名.方法就需要使用静态修饰这里不多说,免得造成初学者的困难)比如你要他执行a和b相加。直接在类里面的函数里创建下
变量 然后执行一个a+b的方法return下返回值就可以了。调用完就可以得到 一个数,就是说你用这个方法就能得到了这个相加后的值。 在
我觉得面向对象的复用性就是面向对象的最好用的特点,因为它可以减少你的敲写代码的时间,增大代码的可观看性(也可以说事理解性,这样
能更好的帮助阅读你的程序的人)。 它两的关系就这么简单。有什么不懂的pm我。当你完全学会了面向对象的思想就可以一步一步的学习下面
的构造函数和静态 还有封装的一些性质。
2.什么是面向对象编程(OOP):Object Oriented Programming是一种编程思想, 使用对象去进行编程.
它的特点有: 封装,继承, 多态 。
3.对象从哪来:对象是需要先用类来描述, 然后使用类来创建.
类是对象的描述, 对象是类的实例.
4.面向对象的优点
提高代码复用性.
使用者无需关心对象其中是如何实现的.
让程序员从一个编写者转换成一个使用者.
更加符合人的思维能力,使编程更简单.
2 定义类
1.成员变量
在类中用变量来描述这一类对象公有的特征.
2.成员函数
在类中用函数来描述这一类对象公有的行为.
3 创建和使用对象
1.怎么创建
使用"new 类名()"形式创建一个对象
2.怎么使用
通过"."语法来访问类的成员.
例如: Person p = new Person();//创建对象 p
p.name = "张三"; //给对象定义的name赋值
p.eat(); //调用p对象里面的eat方法
4对象的初始化过程
1.加载类
类在第一次使用的时候被加载到内存中
2.初始化成员变量
当创建对象的时候, 成员变量会初始化为默认值, 基本数据类型都是0, 引用数据类型都是null
5对象的生命周期
1.开始
new关键字创建对象的时候, 生命周期开始
2.结束
没有任何引用指向对象, 该对象成为垃圾, 被虚拟机回收
6 匿名对象
1.什么是匿名对象
没有任何引用指向的对象, 就叫匿名对象
2.匿名对象有什么特点
匿名对象在创建之后立即被回收, 只能使用一次
7 封装
1.什么是封装
封装就是将一类事物的特征和行为封装在一个类中, 定义成成员变量和成员函数
创建对象之后, 这些成员函数可以访问自己的成员变量
2.对成员变量的封装
使用private关键字将成员变量私有化
如果需要对外部提供访问方式, 写公有的get,set方法
8 构造函数
1.什么是构造函数
构造函数是一个特殊的函数.
函数名必须和类名一致.
没有返回值类型.(不等于void,不能写任何返回值).
可以写return,但是不能写return+值(尽量不要写).
new关键字创建对象时自动调用
2.应用场景
如果我们希望一段代码在创建对象的时候执行, 就可以写在构造函数中
通常我们使用构造函数对成员变量进行赋值
3.构造函数和成员变量的执行顺序
成员变量优先于构造函数先执行,因为通常使用构造函数都是对成员变量进行初始化,所以如果没有成员变量,构造函数是没有任何意义的.
4.构造函数的重载
和普通函数一样, 参数列表不同(类型不同,顺序不同,个数不同)即可.
重载只与参数列表有关
5.构造函数的调用
在创建对象时自动调用.
在构造函数的第一条语句可以使用"this(被调用的构造函数的实际参数)"的形式调用该类其他构造函数.
6.自动生成构造函数
在一个类中构造函数是一定存在的.
因为在一个类中如果没有写任何的构造函数, 编译时也会自动生成一个无参的构造函数, 里面什么代码都没有.
如果写了任何一个构造函数, 那么就不会有自动生成的了
注意:我们在类中只写了一个有参构造函数的时候, 这个类就不能使用无参的构造函数创建对象了
7.构造函数的访问权限
通常构造函数的访问权限都是公有的, 因为构造函数就是为了让别人创建对象时调用的
个别情况下在定义类时不希望外部创建对象, 这时可以使用private修饰构造函数, 例如:单例设计模式(Singleton)
9 成员代码块(构造代码块)
1.什么是成员代码块
在类中使用"{}"定义一段代码, 这段代码在创建对象的时候会自动运行
2.成员代码块和构造函数的区别
构造函数在创建对象的时候是N个选1个调用
而代码块是一定执行
构造函数可以传入参数
代码块不能传入参数
3.创建对象时内存中的工作顺序
在内存中查找指定的类, 如果没有就加载类, 有则直接引用
在内存中开辟一块空间, 将成员变量初始化为默认值, 0和null
按照类代码从上到下的顺序, 执行代码块或者成员变量赋值
执行构造函数中的代码
4.在方法中也可以写代码块(方法代码块),但是不常用
10成员变量和局部变量
1.成员变量
在类中定义的变量,(Field),在整个类都可以访问(用于描述着一类事物的共有特征).
成员变量随着对象的建立而建立,存在于对象所在的堆内存中.
成员变量有默认初始值(0/false/null)
2.局部变量
在方法/语句中定义的变量(Local Variable),
存在于栈内存中.
作用范围一结束,变量的空间会自动释放.
局部变量是没有初始值的.
3.同名问题
在同一个作用域中成员变量不能重复, 局部变量也不能重复
但是成员变量和局部变量可以同名, 他们互相不冲突
4.访问问题
在局部变量和成员变量同名的时候, 如果直接用变量名访问一个变量, 那么是先找局部变量, 如果不存在才找成员变量
这时如果不想找局部变量, 直接找成员变量, 应该用"this.变量名"
11 this关键字
1.构造函数中
"this(参数)"形式可以在构造函数的第一条语句中调用其他的构造函数
"this.成员名"形式可以调用当前对象的成员
2.普通函数中
this用在普通的函数中, 可以代表调用当前函数的对象
哪个对象调用this所在的函数,this就代表那个对象.
3.内部类中
可以使用 外部类名.this.成员 来访问外部类的成员.
12静态(static)变量
1.什么是静态变量
用static修饰的成员变量就是静态变量(随着类的加载而加载)
优先于所有非静态成员及成员代码块.
2.静态变量和普通变量有什么不同
静态变量在类加载后就初始化, 不用创建对象可以直接使用.
静态变量被类的所有对象共享(在共享区), 通过一个对象改变, 所有对象都改变.
静态变量可以使用"类名.变量名"形式访问, Java推荐使用这种方式, 而不是通过对象访问.
3.类在什么时候加载
类在第一次使用的时候加载
例如:创建对象, 使用静态变量, 使用静态方法
定义变量的时候不加载类.
4.静态变量在什么时候使用
在定义一个类的时候, 如果希望这个类的所有对象共享一个数据时, 就可以使用静态成员变量
[ 本帖最后由 xiao金刚 于 2012-11-29 04:33 编辑 ]
----------------解决方案--------------------------------------------------------
这个有点困难 说的很经典 实践起来有点难度
----------------解决方案--------------------------------------------------------
回复 2楼 zxd543
对照例子一下子可以看明了。这一篇主要概括的是一种面向对象的思想。让初学者不会认为面向对象很困难。理解的理想加上例子肯定可以掌握面向对象。 ----------------解决方案--------------------------------------------------------
看看
----------------解决方案--------------------------------------------------------
面向过程的程序设计中,程序员在解决一个问题的时候,需要建立问题空间(实际要解决的问题)到解空间(问题建模的地方,如计算机)的某种联系,当问题过于复杂的时候,建立这种联系是既费时又费力的,而且建立这种联系其实是编程之外的任务。所以,代码越写越多,一但出现问题就很难维护。
而面向对象使我们可以直接基于问题空间来建模,这样就无需建立与机器相关的联系,从而前进了一大步(当然完全脱离机器环境还是不可能的)。
对象就充当了问题空间里的元素,每个对象都提供服务,程序员需要做的就是要建立这些对象来提供服务,而这也是面向对象编程的难点,在于抽象出来对象的质量。而要设计出一些好的方案就需要经验了(这里和设计模式有很大的关联)。
----------------解决方案--------------------------------------------------------
回复 5楼 lz1091914999
java 拥有23设计模式,适合的设计模式可以让自己的代码更加优秀。斑竹。请问一位高级的程序员至少需要学会多少种设计模式呢?如果说23种都必须会。那么我想java高级程序员不是那么好当的吧。。高级程序员和低级程序员的区别在于哪里?是在于设计程序代码时的代码效率呢,还是处理异常的效率。 一个标准的程序员在完成一个程序时所花的时间更多是在于哪部分。敲写代码的时间。还是处理程序异常的时间?如何做到一名可以高效率开发程序的程序员。请斑竹耐心解答。新手学java的困惑。 ----------------解决方案--------------------------------------------------------
回复 6楼 xiao金刚
1、在代码风格上面统一,要写出一种自己喜欢的风格并加以保持,但是现在很少有程序员做到了,当代码多的时候自然就乱了。(我一直比较关心这个)2、算法。好的算法比用逻辑来做要强大得多。
3、设计模式。在使用别人的库或自己的库来建立程序的时候,怎样才能让耦合性最低?怎样才是高效的?以及安全性等等各种蛋疼的问题。要做好这个需要经验及分析能力。
写代码的时间和你改错误的时间是差不多的。所以好的设计才会让程序员更轻松。
其实很多东西要在实际中获得,代码写多了,自然就明白了。要多思考,并且掌握真正的面向对象会在设计上起到很大的帮助。这也是面向对象的主要目的。
[ 本帖最后由 lz1091914999 于 2012-10-25 16:56 编辑 ]
----------------解决方案--------------------------------------------------------
好人啊
----------------解决方案--------------------------------------------------------
讲得好。
----------------解决方案--------------------------------------------------------