第5章面向对象(上)

第5章 面向对象(上)

类可以被认为是自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用对象

 

类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在

5.1类和对象

java程序使用类的构造器来创建该类的对象

 

继承是实现类的复用的重要手段 组合也可以实现类的复用

 

static 的真正作用是用于区分 变量 方法 内部类 初始化块 这四种成员到底是属于类本身还是属于实例

 

类的构造器是有返回值的 当使用new 关键字来调用构造器时 构造器返回该类的实例,因此构造器的返回值类型总是当前类

 

类的作用

1.定义变量

2.创建对象

3.调用类方法或者类变量

 

创建对象的根本途径是构造器

 

java对象的大致作用是

1. 访问对象的实例变量

2. 调用对象的方法

 

定义一个类就是为了重复创建一个类的实例,同一个类的实例具有相同的特征,而类定义了多个实例的共同特征

 

java里的引用就是C里的指针,只是java将他封装起来了 ,所有java 不允许直接访问堆内存中的对象,只能通过对象的引用来操作该对象

5.1.4对象的this引用

this 关键字总是指向调用该方法的对象,根据this 出现位置的不同 this作为对象的默认引用有两种情况

1. 构造器中引用该构造器正在初始化的对象

2. 在方法中引用该方法的对象

 

this可以代表任何对象,当this出现在某一个方法体中时,它所代表的对象是不确定的,但是它的类型是确定的,它所代表的只能是当前类的类型 只有当这个方法被调用时,它所代表的对象才能被确定下来

谁在调用这个方法 this就代表谁

 

this不可以修饰static修饰的方法

 

大部分时候成员变量无需使用this 假如一个方法有一个局部变量和成员变量同名的时候,但程序又需要访问该放过被覆盖的变量时 则必须使用 this

 

5.2 方法

java里方法传递参数的方法只有  值传递 将实际值的副本 传入方法内 而参数本身不会有任何变化

 

5.2.3 参数个数可变

jdk 1.5 以后 允许为方法指定数量不确定的形参 (最后一个形参 类型后面加 ... )表示可以接收多个参数值

本质 是一个数组参数

 

传给形参的实参值无需是一个数组 ,饭如果采用数组形参来声明方法,调用时,必须传给形参一个数组

 

个数可变的形参只能处于参数的最后,一个方法中最多只能有一个可变形参

 

5.2.5 方法重载

返回值类型不能作为区分方法重载 java在调用方法时可以忽略方法的返回值

 

5.3 成员变量和局部变量

定义成员变量时, 有static修饰的叫做类变量 没有static修饰的叫做实例变量

 

类变量从该类准备阶段就开始存在了直到这个系统完全销毁这个类

实例变量时从该实例被创建时开始存在,直到这个系统被完全销毁

 

一个类在使用前要经过 类的加载 类验证 类准备 类解析 类初始化等阶段

 

局部变量除了形参之外,都必须要显示初始化,否则不可以访问

 

当系统加载类或者创建类时 系统会自动为成员变量分配内存空间,并自动为成员变量指定初始值

 

 

对于局部变量来说 系统并不会为局部变量执行初始化 只有程序为这个变量赋值之后才会为之分配内存,并将初始化值保存到内存中(保存在该方法的栈内存中)

 

局部变量可以处理的问题最好不好实用成员变量

1. 增加了变量的生成空间 这个导致了更大的内存开销

2. 扩大了变量的作用域,这个不利于提高程序的内聚性

 

下面情况 则考虑使用成员变量

1.如果需要定义的变量时用来描述某一个类对象的固有信息 (人的身高 体重)

2.如果一个类需要用一个变量来保存该类或者实例运行时的状态信息(flag

3.某一个信息需要在多个类之间共享

 

原则 尽量缩小变量的作用范围 包括局部变量 变量的范围越小 则它在内存中的占用时间也就越短  则程序的性能也就越好

 

 

5.4 隐藏和封装

对一个类或者对象实现良好的封装的好处

1. 隐藏类的具体实现细节

2. 让使用者只能通过事先预定好的方法来访问数据,从而在方法中加入逻辑判断

3. 可进行数据检查,从而利于保证对象信息的完整性

4. 便于修改 提高程序的可维护性

 

为了实现良好的封装需要考虑

1. 强对象的成员变量和实现细节都隐藏起来,不允许外部直接访问

2. 把方法暴漏出来,让方法来控制对这些成员变量进行安全的访问和操作

 

模板设计追求 高内聚 低耦合

高内聚 尽可能把模块里的内部数据,功能实现细节都隐藏在模板内部独立完成,不允许外部直接干预

低耦合 尽量暴漏少量的方法给外部使用

 

5.5 深入构造器

构造器是一个特殊的方法,这个特殊的方法用于创建实例时执行初始化,构造器是创建对象的重要途径(即使 工厂模式 反射 其实都依赖构造器)

 

当构造方法重载时 最好是使用 this调用其他构造器(便于后期维护)

 

5.6类的继承

重写父类方法要遵循 两同两小一大 原则

两同

方法名相同

参数列表相同

两小

方法的返回值类型 和抛出的异常 要小于或等于父类

一大

指子类的方法访问权限应该比父类的相同或者更大

 

重写方法是要么都是类方法要么都是实例方法

 

 

 

当程序创建了一个子类对象后 系统不仅会为子类的实例变量分配内存,也会从他的父类哪里继承得到的实例变量分配内存

 

父类的构造器总会在子类的构造器之前执行 所以最先最执行的总是Object 的构造器

 

5.7 多态

java引用变量有两个类型 一个时编译时类型 一个时运行时类型

编译时类型 是由声明该变量时使用的类型决定了

运行时类型 运行时类型是由实际赋给变量的对象决定的

如果编译时类型和运行时类型不一样是 就会产生所谓的多态

 

通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时所定义的成员变量(对象的实例不具备多态)

 

5.7.2引用类型的强制类型转换

引用变量只能调用它编译时类型的方法,而不能调用它运行时的类型的方法 ,如果需要让这个引用变量调用运行时类型的方法就必须强制类型转换

 

强制类型转换时需要注意

1.基本类型之间的转换只能在数值之间转换

2.引用类型之间相互转换只能在具有继承关系的类型之间

 

 

5.8继承和组合

继承和组合都可以实现类的复用性 采用组合能更好的保护类的封装性

 

尽量不要在父类的构造器中调用被子类重写的方法

 

什么情况下需要从父类派生出子类呢 不仅需要保证子类是一种特殊的父类,而且需要具备以下两个条件

1. 子类需要额外增加属性

2. 子类需要增加自己独有的行为方式

 

总之 继承想表达的是 is-a  而组合想表达的是 has-a的关系

 

5.9 初始化块

初始化块是java类的一种成员,初始化块只能在创建对象的隐式执行,而却在执行构造器之前

初始化和声明实例变量的顺序是相同的 都是从上向下

 

如果有一段代码处理对所有代码都相同 且无需接收参数 就可以把这段代码放到初始化块里

 

实际上初始化代码块是一个假象 在使用javac 之后 初始化代码块的代码会被还原到 每一个构造器中 且位于构造器代码的最前面

 

静态块是在系统将类初始化阶段执行的

 

java系统加载一个类时,总是保证该类的所有父类(直接 间接)都加载完并初始化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值