当前课程知识点:Java程序设计 > 第二章 类与对象 > 2.3-1-对象初始化 > 2.3-1-对象初始化
大家好
欢迎继续学习
java语言程序设计
这一节我们来学习
对象的初始化
通常我们定义一个
基本类型定量的时候呢
都希望在定以变量的同时
就给它指定一个初始值
我们知道这叫变量的初始化
那么当我们
构造一个对象的时候
当然也希望能够给对象
指定一个初始状态
那么对象该怎么进行初始化呢
对象在诞生之初
可以通过构造方法
来对它进行初始化
所谓构造方法呢
也就是我们自己写的一个
来描述如何对对象
进行初始化的这么一个方法
也就是构造方法
是用来描述初始化算法的
当然有初始化就会有什么呢
有回收
当我们一个对象
不再被使用的时候呢
它也是会被自动回收的
这一个呢
我们会在下一节会介绍
对象的初始化是不可能
由编译器去自动为我们完成的
这个跟基本类型的
变量初始化不一样
我们自定义的对象
编译器在编译的时候
不可能天然就知道
你想怎么对对象进行初始化
所以呢
只有我们自己来描述
我们希望的初始化算法
而描述初始化算法的地方
在哪儿呢
就是在一个特殊的方法中
叫做构造方法
那么构造方法
它的特点是什么呢
首先它的方法名
与类名是相同的
而且呢
不要定义返回类型
也不是说它是无类型的
不能写(英文)
就是说返回类型这个要素
在定义构造方法的时候
是不要写的
而且呢在大多数情况下
构造方法会被声名为公有的
当然 在我们写特别
特殊的程序的时候
一些场合我们不希望
这个对象被随意构造
那么也会有时候
把构造方法
写成不是公有的
这个呢
对于我们初学的同学来说
目前还没有遇到这样的情况
所以我们看到的
大多数例题和我们的习题
都会将构造方法写成公有的
构造方法
它也是类的方法成员
同样它可以有参数
而且可以有任意多个参数
那么构造方法
它的主要作用或者说主要工作
是完成对象的初始化
除此而外呢
尽量不要在构造方法中
过多的去写其它的功能
构造方法不是在程序中
像别的方法一样
去显示在调用的
它是在生成一个对象的时候
自动调用的
每次构造一个新的对象
或者叫生成一个新的对象
都会自动调用
这个类的构造方法
来为新对象进行初始化
那么我们在前面
一些简单例题中
可能大家觉得
我们也没有
去声明构造方法呀
实际上呢
每个类都有构造方法
而且必须有构造方法
但是如果我们没有显示的
声明构造方法
那么编译器怎么办呢
会报错吗 不会的
如果我们没有显示的
声明构造方法呢
编译器就会隐含生成一个
默认的构造方法
这个默认的构造方法呢
是没有参数的
这个内部类除外
关于内部类呢
我们在以后的内容中
会给大家简要的介绍
除了内部类以外
这个默认构造方法呢
它是没有参数的
而且方法体呢是空的
使用默认构造方法
就初始化对象的时候呢
如果在类声明中
你没有给实例变量
指定初始值
那么这个对象的属性值呢
就会自动初始化为零或者空
因为你默认
构造方法的方法体为空了
你就没有指明
该怎么去初始化嘛
下面呢让我们来看一个
默认构造方法的例子
现在呢
我们来设计一个银行帐户类
大家看到这个银行帐户类呢
很简单
包括了户名 帐号和余额
当然 在后面的程序中
我们会逐渐去丰富它
目前呢它还比较简单
只有这样三个数据成员
然后我们就
用一个测试类来测试它
在这个主方法中呢
构造了一个
新的BankAccount对象
然后我们输出这个对象的
三个数据成员值
从运行结果我们看到呢
引用类型的值是空引用
数据类型的值 它是零
这说明什么呢
说明我们声明了这样一个类
但是没有显示的
声明它的构造方法
它的默认构造方法
什么也没有做
所以默认的情况下
数值被初始化成零
引用被初始为空
从前面的例子中呢
我们看到
默认构造方法
实际上什么也没有做
那么如果我们想
按照程序员的意愿
去指定初始化
一个对象的方式
去指定该将对象初始化
成什么状态
如果我们希望这样
那么怎么达到这一点呢
这个时候就需要我们自己
来定义构造方法了
光靠默认的构造方法
它是起不到初始化作用的
我们在生成对象的时候呢
可以给构造方法传送初始值
通过实参传给它
我们讲了构造方法
它是可以有参数的对吧
那么构造方法定义在形参呢
我们在调用构造方法的时候
就要给他实参
那么什么时候
会调用构造方法呢
就是生成一个对象的时候
构造方法会自动被调用
这个时候
我们要给它传送实参值
然后这个构造方法就会被执行
就会对对象进行初始化
构造方法跟其它方法一样
也是可以被重返的
也就是说一个类中
可以有两个及以上的
同名的方法
但是参数不同
那么这个就叫做方法的重载
构造方法跟其它方法一样
也是可以重载的
那么好
既然方法可以重载
那么在调用方法的时候
你用同一个名字怎么知道
每一次的调用表达式
是调用哪一个方法呢
是执行哪一个
同(意)方法的方法体呢
这个时候呢
是通过参数表来比对的
也就是重载的方法
它的方法名是相同的
但是它的参数表必须不同
参数的个数不同
或者参数的类型不同
那么这个时候
对于每一个方法调用表达式
那就可以通过比对参数列表
来辨别应该调用
哪一个方法的方法体
刚才我们说了
如果我们声明一个类的时候
没有声名任何构造方法
那么编译器呢
会为我们生成一个
默认的构造方法
虽然它什么事都不做
但是呢
这个方法是会被生成的
但是只要我们显示的
声明了构造方法
只要声明了一个
显示的声明了一个
编译器就不会再为我们生成
默认的构造方法了
在这种情况下
如果我们希望
构造一个对象的时候
不给它初始值也可以
那么怎么达到这一点呢
我们可以自己显示的声明
无参数的构造方法
也就是我们自己
声明构造方法可以有参数
也可以无参数
那么我们自己声明一个
无参数的构造方法
方法体当然
多数情况下
它不是空的了
肯定我们需要
设置一种初始化的方式
我们才去写构造方法的
当然我们不会
让它方法体为空
那这个时候呢
我们在方法体中呢
可以定义默认的初始化方式
有了这样的
无参数的构造方法
那么当我们
去构造新对象的时候
不给参数
不给初始化值也是可以的
那么就可以
按默认的值来初始化了
而不是不进行初始化
下面我们来看一个例子
在这个例子中呢
我们为银行帐户类
来声明构造方法
现在呢
我们来为银行帐户类
声明几个构造方法
大家看到这里呢
声明了三个构造方法
是重载形式的
第一个构造方法呢
有三个参数
分别表示户名 帐号和余额
它的初始化算法呢
就是直接
将这个形参获得的值
用来初始化
这个帐户对象的姓名
帐号和余额
那第二个构造方法呢
只有两个参数
是假设一个新帐号
它的初始余额可以为零
所以如果
你不给它余额的话呢
就会调用这个构造方法
默认把余额初始化为零
第三个构造方法呢
是一个无参数的构造方法
也就是自定义的
默认的初始化方式
它虽然没有参数
但是方法体里面
还是做了同样的初始化逻辑
只是呢它的初始值
变成约定好的默认值
比如说户名
(让它)是空字符串
帐号是六个9
然后呢余额是零
在刚才这个例子中呢
我们看到了
这个银行帐户类中呢
定义了三个构造方法
它们的初始化逻辑
或者说初始化算法
都是相同的
只是呢
这些构造方法的参数表不同
也就是说
初始值的个数不同
那么在这种情况下
我们有必要冗余的写
多个方法体吗
实际上呢
我们可以用this关键字
来实现构造方法之间的
互相调用
这样就可以避免
写很多冗余的
逻辑完全相同的
构造方法 方法体
因为在类中呢
通常我们都会给出
多个重载的构造方法的
是为了让使用者方便
那这个时候
我们就可以使用this关键字
在一个构造方法中呢
去调用另外的构造方法
这样代码可以更简洁
维护起来也可以更容易
通常我们是用
参数个数比较少的构造方法呢
去调用参数个数
最多的那个构造方法
现在我们来使用
这个this关健字
用一个构造方法
去调用本类中的
另一个构造方法
那我们来看
这个无参数的构造方法
实际上呢
它也对三个数据成员
进行了初始化
所以它可以去调用
这个具有
三个参数的构造方法
怎么调用呢
用this就代表本类的
构造方法 方法名
那么参数是什么呢
把约定好的默认参数
空字符串
六个9和浮点数
常数零作为实参
调用了本类的另外构造方法
这是有两个参数的构造方法
有初始值 姓名
有初始值 帐号
但是呢余额默认为零
那我们也可以去调用
具有三个参数的构造方法
给它这三个参数
姓名 帐号
还有这个默认的余额零
这样的话我们来看
同样的初始化算法
我们只要写一遍就可以了
不用在每个
重载的方法体中都去写
就避免了这种冗余
在类中定义对象的属性的时候
如果我们希望某个属性
一经初始化
就不可以再改变
也就是说如果我们希望
一个属性它是常量
那么怎么实现呢
我们可以有final关键字
来修饰这个属性
这样的话
它一经初始化
就不能再被改变了
实例变量和类变量呢
都可以被声明为final
final实例变量
那么可以在类中
定义的时候就给出初始值
或者呢
在每个构造方法中
进行初始化
那么一定要在构造方法
结束之前完成初始化
这是最晚的时刻
一旦构造方法执行结束了
那么final变量的值
就不能再被改变了
如果是类变量
被定义为final
那么它在什么时候初始化呢
我们知道类变量
它是属于整个类的
在整个类的范围内呢
它只有一份
不会有多份复制品
也不属于任何一个对象
所以它必须在声明的同时
就进行初始化
一旦初始化好
那么就再也不能改变了
好 在这一节呢
我们学习了
在构造对象的时候
如何对对象进行初始化
这一节内容就是这些
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件