文档章节

面向对象(上)

cavenzep
 cavenzep
发布于 2015/04/20 22:46
字数 3126
阅读 16
收藏 1

一、概

    面向过程注重的是功能和行为,而面向对象注重的是具备功能和行为的对象。面向对象是一种基于面向过程的编程思想。
    学过C语言的都知道她是面向过程的,而后来的C++、C#、Java等都在这个基础上,都部分或全部地转移到了面向对象的大阵营中。简单来说就是同样做一件事,面向过程要自己做所有的事,事无巨细面面俱到;而面向对象是先找有没有能做这件事的对象实体,把要做的事委托给对象来做,自己只要调用对象做事,不用管对象是怎么做的。例如:你为远方的好友写信,完了要寄给TA这件事。
    面向过程:(假设没有邮差)你写完信就得自己拿着信,走上几百里地甚至更远的路去 给TA。
    面向过程:有邮差了,写好信直接给邮差付钱就OK了,让邮差给你寄去,不管邮差是 怎么到达怎么给TA的,你只要确认信发到了就好。
    从上述例子可知,面向对象相对于面向过程处理一件事更简单,咱的身份也从执行者变成了指挥者,爽!!!
面向对象有3大特征:封装(encapsulation)   继承(inheritance)   多态(polymorphism)
二、类与对象
    说到特性就要引出一个词“类”,字面意思是具有相同特征的事物的集体。而对于计算机编程语言来说,类是对对象的属性和行为的描述,世间万物都是实体对象,而有些对象有共同的一些属性和行为,为了便于描述和使用,就将这些共同的属性和行为放在类中。这就是说:“类是对象的抽象,对象是类的实例。”
三、封装
1、概述:
    定义:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
    优点: 1、将变化隔离 2、便于使用 3、提高重用性 4、提高安全性
    原则:将不需要对外提供的内容隐藏起来;把自有属性都隐藏,提供公共方法对其访问。
    深入了解3大特征之前要定义一个类,这里用Person表示人这一类事物,人有姓名和年龄这2个属性,人也可以说话。Person类代码如下:

public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}

	public void sayHello(){
		System.out.println("Hello,itheima.");
	}
}

    看懂上述代码还需知道Java中的权限修饰符:private、protected、default、public。以下用表格显示出被不同权限修饰符对应的不同访问权限:

    从上面Person类中可以看出,我们每个人的姓名和年龄都是自己的隐私信息,不想让外界直接访问和操作,那就用private修饰变成私有的,仅仅提供getAge()和setAge()供外界访问和操作,这就是Person类对于人这一类事物信息的封装。类一般由成员变量(属性)、成员函数(行为)和构造函数构成。
2、成员变量和局部变量
1)区别 :

    作用范围:成员变量作用于整个类中;局部变量作用于函数(方法)中或者整个语句中。
    内存位置:成员变量存在于堆内存中;随着对象存在而存在,随着对象消失而消失。局部变 量存在于栈内存中。当方法被调用或语句被执行的时候存在;当方法调用完,或者 语句结束后,就自动释放内存。
    初始值:成员变量有默认初始值;局部变量没有默认初始值,使用前必须赋值。
    定义位置:成员变量定义在类中,方法外;局部变量定义在方法内或者作为方法的形式参数 存在。
Note:使用变量时,遵循就近原则。首先在局部范围找,有就使用;接着在成员方法里找, 有就使用;否则就报错。
2)成员变量赋值的三种方式: 
    a)直接在定义的时候赋值,或者是通过对象名.成员赋值。
    b)通过 set 方法类赋值
    c)在构造函数中赋值(在实例化对象的时候赋值)

3、构造函数
1) 特点: 
    a)函数名与类名相同 
    b) 没有返回类型(无需定义返回值类型) 
    c)没有返回值(不写 return 语句)
2)作用:给对象进行初始化。
Note:
    构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相对应的构造函数。对于一个对象,构造函数只执行一次。一般函数是不能直接调用构造函数。
    通常情况下类中有一个默认的空参构造函数,且该构造函数的权限和所属类一致。对于默认构造函数,当一个类中没有定义任何构造函数时,那么系统会默认给该类定义一个空参的构造函数;当在类中自定义了构造函数后,默认的空参构造函数就不存在了(一般情况下建议在自定义类中手动给出无参构造函数)。同一个类中的多个构造函数是以重载的形式存在的。相对于构造函数,成员函数就普通多了,只要按照正常格式和规则定义出来的就是成员函数。
3)构造函数与成员函数的区别:
    a)构造函数与一般函数格式(写法)不同:构造函数和类名相同,并且没有返回类型,也没有返回值;而普通成员函数可以任意起名,必须有返回类型,可以没有返回值。  
    b)构造函数与一般函数作用(运行上)不同:构造函数用于创建对象,并进行初始化值;而普通成员函数是用于完成特定功能的。    
    c)构造函数与一般函数调用方式不同:构造函数是在创建对象时被系统调用的,对于同一个对象只调用一次相应构造函数;而普通成员函数一般是由创建好的对象调用,并且可以调用多次。类中除上述内容之外还会有代码块。
4)代码块:

格式:由{}括起来的代码。
分类:局部代码块(定义在方法中的代码块) 、构造代码块(定义在方法外的代码块)
作用:
    a)局部代码块:控制代码块内变量的生命周期和作用域(使用范围), 从而提高效率。
    b)构造代码块:把所有构造方法中共同的内容定义在构造代码块。
    c)构造代码块与构造函数都是给对象进行初始化的,但是构造代码块中定义的是同一类下不同对象的共性初始化内容,并且对象一建立就运行,对对象进行统一初始化,优先于构造函数执行。而构造函数是给对象进行特定初始化的。
4、this关键字
1)概述:this代表所在函数所属对象的引用。(简单说,谁调用 this 所在的方法,this 就代表谁。) 
2)this 应用:
    a)用于区分同名成员变量和局部变量。
    b)当定义类中功能时,该函数内部要用到调用该函数的对象时,用 this 来表示这个对象。但凡本类功能内部使用了了本类对象,都用 this 表示。
    c)在构造函数间互相调用对象时,只能用 this(参数);并且 this(参数)只能定义在构造函数的第一个语句(因为初始化动作要先执行)。
5、static关键字
1)概述:static关键字用于修饰成员(成员变量和成员方法),写在权限修饰符之后,类型名之前。
2)static特点:(被修饰后的成员具备的特点)
    a)随着类的加载而加载。
    b)优先于对象存在。
    c)被所有对象所共享。
    d)可以直接被类名调用(类名.成员)
Note:
    a)静态方法只能访问静态成员(静态方法不能调用、获取非静态变量;非静态方法既可以访问静态,也可以访问非静态。)
    b)静态方法中不可以出现 this、super 关键字(因为静态优先于对象存在)。
    c)主函数是静态的
被static修饰的还有静态代码块,例如:

static{
      System.out.println(“静态代码块输出”);
}

其特点是:随着类的加载而执行,只执行一次,用于给类进行初始化的。
2)实例变量(成员变量)与类变量(静态变量)的区别:
    a)调用方式:静态变量也称为类变量,可以直接通过类名调用,也可以通过对象名调用,这个变量属于类。用 static 修饰 成员变量也称为实例变量,只能通过对象名调用。这个变量属于对象。
    b)存储位置:静态变量存储在方法区中的静态区。成员变量存储在堆内存。
    c)生命周期:静态变量随着类的加载而存在,随着类的消失而消失,生命周期长。成员变量随着对象的创建而存在,随着对象的消失而消失。
    d)与对象的相关性:静态变量是所有对象共享的数据。成员变量是每个对象所特有的数据。
Note:静态变量的优势:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。缺陷:生命周期过长,访问出现局限性。(静态虽好,只能访问静态。)
6、单例设计模式
1)概述:
解决某一问题最行之有效的方法,java中共有23种设计模式。此处我们讲解其中之一:单例设计模式。
2)单例设计模式的作用:使一个类在内存中只存在一个对象。用代码实现单例设计模式需要做三部:
    a)将构造函数初始化。
        eg:private SingleModel(){}

    b)在类中创建一个本类对象。
        eg:private staticSingleModel s= newSingleModel();
    c)提供一个访问方法可以获取到该对象。
        eg:public staticSingleModel getInstance()
            {
                  return s;
            }
3)写法:单例设计模式只是为了保证内存中的对象唯一,其他在类中该怎么描述吗,还是怎么描述。单例设计模式有两种写法:
    a)饿汉式:也就是刚三部中的示例语句。它的特点是先初始化对象。如:Single类一进内存,就已经创建好了对象(在实际开发中,出于安全考虑,建议使用饿汉式)。
代码如下:

class SingleModel
{
     private static SingleModels=new SingleModel();
     private SingleModel(){}
     public static SingleModel getInstance()
     {
          return s;
     }
}

    b)懒汉式:它的特点对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象。

代码如下:

class SingleModel
{
     private static SingleModels=null;
     private SingleModel(){}
     public static SingleModel getInstance()
     {
          if(s==null) 
               s=new SingleModel();
          return s;
     }
}
下面演示单例设计模式的使用,代码如下:
class Person {
	private static Person person = new Person();
	private Person() {
	}
	public static Person getPerson() {
		return person;
	}
}
public class SingleModel {
	public static void main(String[] args) {
		Person p1 = Person.getPerson();
		Person p2 = Person.getPerson();
		System.out.println("p1==p2::" + (p1 == p2));
		System.out.println("p1.equals(p2)::" + p1.equals(p2));
	}
}
     结果如下:

    本篇幅所描述的仅代表个人看法,如有出入请见谅。


© 著作权归作者所有

cavenzep
粉丝 3
博文 12
码字总数 70665
作品 0
海淀
程序员
私信 提问
黑马程序员.bobo.DAY.7

Day-7 1.面向对象(继承-概述) /* 将学生和工人的共性描述提取出来,单独进行描述,只要让学生和公认与当杜描述的这个类有关系,就可以 继承:1,提高了代码的复用性.2,让类与类之间产生了关系,才有...

BobbyLou
2015/05/14
19
0
《详解PHP面向对象》系列技术文章整理收藏

《详解PHP面向对象》系列技术文章整理收藏 1PHP面向对象之旅:类和对象 http://www.lai18.com/content/425094.html 2PHP面向对象之旅:类的属性 http://www.lai18.com/content/425093.html 3...

开元中国2015
2015/06/27
66
0
黑马程序员.bobo.DAY.5

------- android培训、java培训、期待与您交流! ---------- DAY-5 1.面向对象(概述) 1.1理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程是一种思想 面向过程 强调的功能行为 ...

BobbyLou
2015/05/14
22
0
OOA、OOD和OOP的定义及之间的关系

什么是面向对象分析(OOA)? "面向对象分析是一种分析方法,这种方法利用从问题域的词汇表中找到的类和对象来分析需求。" 什么是面向对象设计(OOD)? “面向对象设计是一种设计方法,包括面向对...

雲克
2013/01/22
7.1K
0
黑马程序员.bobo.DAY.6

/*静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,可以直接被类名调用,类名.静态成员 static 特点:1,随着类的...

BobbyLou
2015/05/14
9
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
20
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
14
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
20
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部