Java—OOP、构造方法、this关键字
-
面向对象编程
- 如何描述现实世界事物
- 属性 该事物的描述信息(事物身上的名词)
- 行为 该事物能够做什么(事物身上的动词)
- Java中最基本的单位是类,Java中用class描述事物也是如此
- 成员变量(字段)事物的属性
- 成员方法 事物的行为
- 定义类其实就是定义类的成员(成员变量和成员方法)
- 成员变量 和以前定义局部变量是一样的,只不过位置发生了改变。在类中,方法外。
- 成员方法 和以前定义方法是一样的,只不过把static去掉。
- 如何描述现实世界事物
-
面向对象的优点
- 便于程序模拟现实世界中的实体
- 用“类”封装建模实体对象的状态和行为
- 隐藏细节
- 对象的行为和状态被封装在类中,外界通过公开的接口——调用类的方法来获得状态信息,不需要关注内部细节如何实现的
- 可重用
- 可以通过类模板,创建多个对象实列,重用类的定义代码
- 便于程序模拟现实世界中的实体
-
- Java对象的内存管理机制
- 使用new创建对象,在堆内存分配的对象空间,初始化
- 在方法栈中定义局部变量,持有堆内存中对象的引用
- 方法执行完返回,栈内存自动释放,局部变量销毁
- 如果堆内存中对象没有变量引用它,成为垃圾,由垃圾回收器回收,释放所有占堆内存。
- Java对象的内存管理机制
- Java垃圾回收器
- Java运行时系统有一个垃圾回收栈程负责清楚不再使用的对象,俗称垃圾回收器
- 垃圾回收器定期扫描内存,对于被使用的对象加上标记,按可能的路径扫描结束后清除未加标记的对象
- 被回收的对象是:
- 不再被任何变量引用的对象
- 引用变量自动放弃
- 人为将引用变量置为null
OOP三大特性
-
封装
-
继承
-
多态
-
package
- 包(package)
- 打包的意义:
- 标准Java库是由一系列包组成,包括Java.lang,Java.util,Java.net等等。标准Java包就是层次型结构,就如同硬盘上嵌套的子目录一样,我们可以使用嵌套层次结构来组织包。
- Java的包是为了更好地规划代码,防止命名冲突和混乱。所以Java出现了打包机制。
- 当把类组织起来放进一个包内时,也就给它们包访问的成员赋予了相互访问的权限,您“拥有”了该包内的程序代码。“只有您拥有的程序代码才可以访问您所有的其他程序代码”。
- 包访问权限为把类剧集在一个包中这一做法提供了意义和理由。
- package—声明包:
- package com.hwua.ch09;
- public class Teacher{
- private String name; //教员的姓名
- private int age;//教员的年龄
- /**
-
- 包访问权限
- *@returm自我介绍的内容
- */
- String introduction(){
- retum"大家好我是“+name+”,今年“+age+“岁”;
- }
- }
- 包名由小写单词组成
- Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,编程规范要求程序员在自己定义包的名称之前加上唯一前缀
- 由于互联网上的域名称是不会重复的,所以一般推荐采用公司在互联网上的域名倒置作为包的唯一前缀。
- 一个类可以使用用一个包中的所有类(不包括private),以及其他包中的所有公开类
- 我们可以通过两种方式访问其他包中的公开类
- 简单在每个类前面加上完整的包名,例如:
- java.util.Date today = new java.util.Date();
- 更简洁通用的方式是:使用 import 语句来导包
- import语句提供了引用其他包中类的快捷方式,可以免去使用完整包名的累赘
- import java.util.Date;
- …Date today = new Date();
- 可以 import 特定类,也可以导入整个包。通过在源代码文件的顶部(在打包语句后)使用import导入语句来实现
- import语句提供了引用其他包中类的快捷方式,可以免去使用完整包名的累赘
- 简单在每个类前面加上完整的包名,例如:
- 打包的意义:
- 包(package)
-
封装
- 封装概念
- 将东西包装在一起,然后以新的完整的形式展现出来
- 信息隐藏,隐藏对象的实现细节,不让外部直接访问到
- 将方法和字段包装进类中,加上具体实现的隐藏(访问修饰符),共同被称作封装,其结果是一个同时带有特征和行为的数据类型
- 定义类,定义其属性,方法的过程称为封装类
- 信息隐藏
- 信息隐藏是OOP最重要的功能之一,也是使用访问修饰符的原因
- 信息隐藏的原因包括:
- 对模块的任何实现细节所作的更改不会影响使用该模块的代码
- 防止用户意外修改数据
- 使模块易于使用和维护
- 字段封装的实现
- 修改字段的可见性来限制对字段的访问
- 为每个字段创建一对繁殖(setter)方法和取值(getter)方法,用于公开对这些字段的访问接口
- 在setter和getter方法中,根据需要加入对字段操作的限制
- public class Teacher{
- private String name; //教员的姓名
- private int age;//教员的年龄
- public int getAge(){
- returm age;
- }
- public void setAge(int age){
- if (age<22){
- System.out.println("错误!最小年龄应为22岁!”);
- this.age = 22; //如果不符合年龄要求,则赋予默认值
- }else{
- this.age = age;
- }
- }
- if (age<22){
- }
- 封装方法的目的
- 隐藏方法实现细节(方法体),像外部提供公开接口(方法头),以安全调用
- 简化调用。方便修改维护
- 根据需要,可以私有化方法以供类内部使用
- public class Teacher{
- private int year; //出生年份
- //判断出生年份是否是闰年
- public boolean ist earpYear(){
- if ((year%40&&year%100!=0)||year%4000){
- retum true;
- }else{
- retum false;
- }
- if ((year%40&&year%100!=0)||year%4000){
- }
- }
- public class Teacher{
- 封装,把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
- 变量:使用private修饰,这是封装变量
- 方法:也是一种封装,封装了多条代码
- 类:也是一种封装,封装了变量和方法
- 封装概念
-
成员变量AS局部变量
- 定义位置不同
- 定义在类中的变量是成员变量
- 定义在方法中的变量是局部变量
- 在内存中的位置不同
- 成员变量存储的堆内存的对象中
- 局部变量存储在栈内存的方法中
- 声明周期不同
- 成员变量随着对象的出现而出现在堆中,随着对象的消失而消失
- 局部变量随着方法的运行而出现在栈中,随着方法的单栈而消失
- 初始化情况不同
- 成员变量有默认的初始化值
- 局部变量没有默认的初始化值
- 定义位置不同
-
成员变量AS静态变量
- 成员变量和静态变量的区别
- 调用方式不同
- 静态变量也称为类变量,可以直接通过类名调用,也可以通过对象名调用,静态变量是属于类的
- 成员变量也称为实际变量,只能通过对象名调用,成员变量属于对象
- 生命周期不同
- 静态变量随着类的加载而加载,随着类的消失而消失,生命周期长
- 成员变量随着对象的创建而存在,随着对象的消失而消失
- 对象的相关性不同
- 静态变量是所有对象所共享的数据
- 成员变量是某个对象所特有的数据
- 调用方式不同
- 成员变量和静态变量的区别
-
this关键字
- this可以看做是一个变量,他的值是当前对象的引用
- 使用this可以处理方法中的成员变量和形参同名的问题
- 当在方法内需要用到该方法的对象时,就可以用this
-
构造方法
- 类的构造方法概念和作用
- 构造方法负责对象初始化工作,为对象的属性赋值合适的初始值
- 创建对象时,其类的构造方法确保:在用户操作对象之前,系统保证初始化的进行
- 构造方法的语法规则
- 构造方法名与类相同
- 没有返回类型
- 方法实现主要为字段赋初值
- 构造方法的调用
- 构造方法的调用很特别:new操作符(返回新建实列的引用)
- 注意:java系统保证每个类都有构造方法
- 类一定有构造方法
- 如果你没有构造方法,则编译会添加一个默认的构造方法,形式是无参的构造方法
- 如果你添加了构造方法,在编译时不会再添加默认的构造方法
- 注意
- 方法名必须是与类名相同
- 不要生名返回类型
- 类的构造方法概念和作用