黑马程序员——三、java基础之面向对象.part1(4)
来源:互联网 发布:英魂之刃英雄数据库 编辑:程序博客网 时间:2024/06/09 16:36
---------------------- android培训、.java培训、期待与您交流! ----------------------
面向对象作为java语言的一种重要的语言思想是非常重要的,尽管是非常基础的内容,但也恰恰因为其基础的重要性,所以必须理解透彻后才可以顺利地去进一步学习java。
分为两篇博文来记录学习面向对象的心得和笔记。
首先呢,对面向对象做一个最通俗的理解。面向对象是一个动词加名词而不是一个名词,重点在于面向的行为。面向对象是基于面向过程的,就是将具体的行为交给专业人士去做。比如,一个顶级的吃货也不会了解胃到底是怎么把食物消化并转变成可恶的脂肪的。吃货们只是把实物吃到肚子里,进一步的消化行为交给了胃这个对象。
接下来,更为严谨的学习面向对象。
3.1面向对象的概念
作为java的编程思想,面向对象是基于面向过程的。在面向过程时,强调的是功能行为;在面向对象时,将功能封装进对象,强调具备了功能的对象。
我认为将面向对象用一句通俗的话来说就是“专业的事交给专业人士”。
面向对象的例子很多,所谓,万物皆对象。比如,李XX只有“拉屎”的能力,至于擦屁股的事自然交给其老子,其老子又将打官司的事交给某大律师。面向对象,李XX很轻松,事态发展也是“大快人心”(呵呵)。
为什么面向对象呢?其好处是什么?
(a)将复杂的事情简单化。
(b)面向对象将以前的过程中的执行者,变成了指挥者。
(c)面向对象这种思想是符合现在人们思考习惯的一种思想。
(d)完成需求时:
先要去找具有所需的功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。这样简化开发并提高复用。
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系。
3.2类与对象
3.2.1定义
对事物的描述无非是属性和行为。在java中用class定义类也是这样,属性:对应类中的成员变量;行为:对应类中的成员函数。
而通过类new出来的实体就是一个对象,在堆内存中。
3.2.2成员变量和局部变量
(a)是什么?成员变量是定义于类中的变量,作用于整个类中;局部变量是定义在函数或语句中的变量,作用于函数或语句块中。
(b)能做什么?成员变量是类的组成元素,用来描述整个类中都要使用到的数据,局部变量是函数或者语句块的组成元素,配合表达式完成对数据的操作。
(c)为什么?成员变量存储在堆内存的对象中,有默认的初始化值;局部变量在栈内存中,没有默认初始化值,需要赋初值。
(d)生命周期:成员变量随类的创建而创建,随类的消失而消亡;局部变量随所属区域的执行而存在,随所属区域的结束而释放。
3.2.3匿名对象
(a)是什么?是对对象的简写,没有名字的对象。
(b)能做什么?当一个对象只调用一次时,匿名对象可以简化书写;可以作为实际参数进行传递。
(c)为什么定义匿名对象?匿名对象只在堆内存中创建,并且使用后对象被销毁,其在内存中的数据也会被GC清除,减少了内存的开销。
3.3封装
概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离;便于使用;提高重用性;安全性。
封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
怎么做?使用private修饰符。
(a)私有,是一个权限修饰符;
(b)用于修饰类中的成员(成员变量,成员函数);
(c)私有只在本类中有效。
(d)将成员变量私有化,对外提供对应的set,get方法对其进行访问,提高对数据访问的安全性。
3.4构造函数
构造函数的作用:给对象初始化。也就是说,每new一个对象,执行一次构造函数。
为什么定义构造函数呢?是因为需要这个函数的对象一经初始化就有一类属性或者行为。
构造函数又分为空参数构造函数和有参数的构造函数,当一个类没有定义构造函数的时候,系统会隐式的加上一个空参数构造函数 :函数名(){}以便给对象进行初始化。
空参数构造函数和有参数构造函数的区别是两者都存在时,是以重载(overload)形式存在的,new对象时可以指定调用的构造函数来给对象初始化。以一个小孩的出生为例,如下:
class Person {{System.out.println("一条新的生命");//构造代码块}Person(){ //空参数的构造函数
//构造函数的格式:函数名与类名相同,没有返回值类型,不需要写return语句,有一条默认的return语句。System.out.println("有头有四肢");}Person("boy"){ //参数为“boy”的构造函数System.out.println("有头有四肢"+"有小JJ");}Person("girl"){ //参数为“girl”的构造函数System.out.println("有头有四肢"+"木有小JJ");}}
如果在new一个Person对象时不指定构造函数,默认调用空参数构造函数,那么会出生一个有头有四肢的小孩;
在new一个Person对象时传入参数,如new Person(“boy”),会出生一个“有头有四肢有小JJ”的小孩。
这就是构造函数的作用,给对象进行初始化。
3.5构造代码块
在定义类时,还有一种特殊的代码块,这种代码块没有名称,只有一对"{}",这就是构造代码块。
为什么定义构造代码块呢?是为了给对象进行初始化。那这样一来就和构造函数的功能相同了,为什么还要定义构造代码块?这个代码块连最基本的名称都没有,又该如何调用呢?请看下面的构造代码块与构造函数的不同。
(a)构造代码块是给所有对象统一初始化,构造函数是给指定的对象进行初始化。
如何来理解这句话呢?通过3.4中的例子可以看到,构造函数在初始化时是需要传入一个参数然后调用相应的构造函数。而构造代码块连名字都没有,就无法传入参数,也无需传入参数,会自动调用。而如果类只有一个空参数的构造函数时,构造函数和构造代码块在表现形式上相似。
(b)构造代码块先于构造函数执行。也就是说,无论构造代码块和构造函数的位置,都是构造代码块先执行,然后执行构造函数。但是同时存在多条构造代码块时,不同代码块之间是有先后顺序的。不过,以我目前的知识来看,是没有必要定义多条构造代码块的,因为和定义一组构造代码块的功能相同。只是在面试时注意。
而在构造函数和构造代码块之后的学习中,还有一种构造方式,即静态代码块。静态代码块是给类初始化的,不管new多少对象,静态代码块都会执行且只执行一次。
而让人脑袋乱的情况就是,在面试时,老师会故意将静态代码块、构造代码块、构造函数放在一起,然后考察。这种题目非常繁杂,但是只要理解了就没有多大难度。
3.6this关键字
为什么需要this关键字?其作用又是什么呢?
当成员变量和局部变量重名时,可以用this来区分。
this : 代表对象。代表哪个对象呢?当前对象。简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
this也可以用于在构造函数中调用其他构造函数。注意:只能定义在构造函数的第一行。因为初始化动作要先执行。
与this关键字对应的另一个关键字是super,在继承中会学习到。
3.7static关键字
static 是一个修饰符,用于修饰成员,使成员成为静态成员,可以直接用用类名调用。
static 成员特点
(a)随着类的加载而加载;
(b)优先于对象的存在;
(c)被所有对象所共享;
(d)可以直接被类名所调用。
对象变量和类变量的区别:类变量随着类的加载而存放于类方法区中,实例变量随着对象的创建而存放于堆内存中。
static使用注意:静态成员只能访问静态成员;静态方法中不可以有 this、super关键字,因为静态先于对象存在。
静态变量主要用来对对象共享数据的表达,所有对象共享数据,一个改变所有都改变。static 方法可以参考工具类,这是一个不依赖于对象的方法,也就是这种方法的功能是多个对象公用,且独立于对象的方法。
创建一个对象都在内存中做了什么事情?
(a)先将硬盘上指定位置的Person.class文件加载进内存。
(b)执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
(c)在堆内存中开辟一个实体空间,分配了一个内存首地址值。
(d)在该实体空间中进行属性的空间分配,并进行了默认初始化。
(e)对空间中的属性进行显示初始化。
(f)进行实体的构造代码块初始化。
(g)调用该实体对应的构造函数,进行构造函数初始化。
(h)将首地址赋值给p,p变量就引用了该实体。(指向了该对象)
3.8单例设计模式
java学习中学到的第一个设计模式。设计模式就是一种做事情的方式,这样做最有利。
单例设计模式出现的目的是什么呢?是为了让一个类在内存中只存在一个对象,保证唯一性。具体的用途呢,比如软件的配置文件。
单例设计模式分为两种,懒汉式和恶汉式。因为懒汉式涉及到了多线程的安全问题,所以不在此赘述,请看恶汉式的代码如下:
黑马能给我我需要的,所以,黑马,我来了!
——爱编程,爱黑马,我是快乐的小32
---------------------- android培训、.java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
- 黑马程序员——三、java基础之面向对象.part1(4)
- 黑马程序员——Java基础-------面向对象(三)
- 黑马程序员-----java基础三(之面向对象)
- 黑马程序员——三、java基础之面向对象.part2(5)
- 黑马程序员——三、java基础之面向对象.part3(6)
- 黑马程序员——java基础-面向对象(三)
- 黑马程序员---Java基础--07天(面向对象之三)
- 黑马程序员--Java基础--面向对象之三大特性
- 黑马程序员——JAVA基础之面向对象
- 黑马程序员 ——Java基础之面向对象
- 黑马程序员——java基础之面向对象
- 黑马程序员——java基础之面向对象
- 黑马程序员—Java基础学习笔记之面向对象
- 黑马程序员—【Java基础篇】之面向对象
- 黑马程序员 Java基础<三>--->面向对象
- 黑马程序员 java基础<—>--->面向对象
- 黑马程序员——Java基础之面向对象(4)——第十篇
- 黑马程序员——二、java基础之语言基础组成.part1(2)
- c++ primer 学习笔记:类之static 类成员
- sizeof和sizeof(string)的问题
- Linux内核设计与实现 读书笔记
- Linux引导流程
- hdu 4497 GCD and LCM (素数分解+组合数学)
- 黑马程序员——三、java基础之面向对象.part1(4)
- 动态规划问题
- 鸡蛋硬度测试
- 函数指针
- CentOs 下安装python的MySQLdb
- 在ios后台运行
- Knight Tour 骑士走棋盘算法(附代码)
- php 网站重定向 数据提交
- Jquery中的序列化