第六章:面向对象编程(基础)
java类及类耳朵成员:属性、方法、构造器;代码块、内部类
面向对象的特征:封装、继承、多态、(抽象)
其他关键字的使用:this、super、package、import、static、final、interface等等
1.面向对象编程概述
面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象还有面向过程、指令式编程和函数式编程。
关注的焦点是类:参照现实中的事务,将事务的特征,行为特征抽象出来,用类来表达
2.java语言的基本元素:类和对象
类(Class)和对象(Object)是面向对象的核心概念
1.什么是类:
具有相同特征的事物的抽象描述,是抽象的,概念上的定义
2.什么是对象:
实际存在的该类事物的每个个体。是具体的
类是一组相关属性和行为的集合
属性:该类事物的状态信息
行为:该类事物要做什么操作
设计类其实就是设计类的成员
成员之一:属性、成员变量
成员之二:方法、函数、method

调用

3.面向对象完成具体功能的操作的三步流程:
步骤2:创建类的对象
步骤3:通过对象,调用它内部声明的属性或者方法,完成相关内容
4.对象在内存中的分配涉及到的内存结构
栈:方法内定义的变量如phone1,phone2
堆:new出来的结构(比如:数组实体,对象的实体)。包括对象中的属性
方法区:存放类的模版。比如:Phone类的模版
1.创建类的一个对象



5.类的成员之一:属性
角度一:按照数据类型来分:基本数据类型、引用数据类型
角度二:按照变量在类中声明的位置的不同:成员变量(属性)、局部变量(方法内、构造器内)
2.变量的几个称谓:成员变量、属性、field
相同点:
变量声明的格式相同
都有它有效的作用域
都要先声明,后赋值,再使用
类中声明的位置的不同:
属性:什么在类内,方法外的变量
局部变量:声明方法、构造器内部的变量
属性:随着对象的创建,存储在堆空间中
局部变量:存储在栈空间中
生命周期:
属性:随着对象的创建消亡而创建消亡
局部变量:随着方法对应的栈帧入栈出栈而分配消亡
属性:整个类的内部都是有效的
局部变量:仅限于声明此局部变量所在的方法
是否可以有权限修饰符进行修饰:
都有哪些权限修饰符:public、protected、private(用于表明所修饰的结构可调用的范围的大小)
属性:可以使用权限修饰符修饰
局部变量:不能使用
属性:都有默认初始化值
局部变量:都没有默认初始化值



6.类的成员之二:方法
方法是类或者对象行为特征的抽象,用来完成某个功能的操作
功能封装为方法的目的是,减少代码的重复,减少冗余
java里面方法不能独立存在,必须的定义在类里面:
比如Math.random()
public Person(String name, int age)
public void say()
public String interests(String hobby)
public int getAge()
2.声明方法的格式
权限修饰符[其他修饰符] +返回值类型 +方法名(形参列表)[throws 异常类型]{
//方法体
}
注:[]中的内容不是必须
①java规定了那些权限修饰符:private 缺省 protected public
②返回值类型:描述当调用完此方法时,是否需要返回一个结果
分类:无返回值类型:使用void表示
有具体返回值类型:可以是基本数据类型,也可以是引用数据类型。有具体返回值类型,需要指明返回的数据的类型,需要在方法内部配合使用return + 返回值类型的变量或常量
③方法名:输入标识符,见名知意
④形参列表:形参,输入局部变量。可以声明多个。
格式:(形参类型1 形参1,形参类型2 形参类型2,...)
分类:无形参列表 有形参列表
无形参列表:不能省略一对()
有形参列表:根据方法调用时,需要的不确定的变量的类型和个数,确定形参的类型和个数
⑤return:
结束一个方法
结束一个方法的同时,返回数据
4.方法调用的内存解析:
-形参:方法在声明时,一对()内声明的一个或者多个形式参数
-实参:方法被调用时,实际传递给形参的变量或者常量

一个方法用完就出栈
数组的元素是引用数据类型



第二种写法


封装方法
内存解析:

8.再谈方法
定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数列表不同即可,满足这样特征的多个方法,彼此之间构成方法的重载
总结为:"两同一不同"
两同:同一个类,同一个名
不同:参数列表不同。①参数个数不同 ②参数类型不同
注意:方法的重载与形参的名字、权限修饰符、返回值类型都没有关系

可以看到两个标红的地方,形参名字不同但是类型相同,报错
2.可变个数形参的方法:
1.使用场景:
在调用方法时候,可能会出现方法形参的类型是确定的,但是参数的个数不确定,此时可以使用这个
2.格式:(参数类型 ... 参数名)
3.说明:
①可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为:0,1,2...
②可变个属形参的方法与同一个类中,同名的多个方法之间可以构成重载
③特例:与同类型数组参数不构成重载
④可变个数的形参必须声明在形参列表的最后
⑤可变个数的形参最多在形参列表中出现一次
1.对于方法内声明的局部变量来说:

基本数据类型没有地址,传递的是数据值
2.方法的参数的传递机制:值传递机制
2.1概念
形参:定义方法时候,()内声明的变量
实参:调用方法时候,()内实使用的值/变量/表达式
2.2规则:实参给形参赋值的过程

如果形参是基本数据类型变量,直接把数据值赋给形参
如果形参是引用数据类型变量,地址值赋给形参
9.递归方法:
1.何为递归? 方法自己调用自己的现象叫递归
2.递归方法分类:直接递归、简介递归
3.使用说明:
-递归方法包含了一种“隐式的循环”
-递归方法会“重复执行”某段代码,但这种重复执行无须循环控制
-递归一定要向已知方向递归,否则停不下来,类似死循环,最终导致“栈内存溢出”

注意:递归调用会占用大量的系统堆栈,内存消耗多,在递归调用层次多时速度要比循环慢得多,所以要慎用
1.说明:
package: 包
- package 用于指明该文件中定义的类、接口等结构所在的包
- 一个源文件只能有一个声明包的 package 语句
- package 语句作为 Java 源文件的第一条语句出现。若缺省该语句,则指定为无名包。
- 包名,属于标识符,满足标识符命名的规则和规范(全部小写)、见名知意
- 包通常使用所在公司域名的倒置:com.atguigu.xxx。
- 大家取包名时不要使用 "java.xx" 包
- 包对应于文件系统的目录,package 语句中用 “.” 来指明包 (目录) 的层次,每.一次就表示一层文件目录。
- 同一个包下可以声明多个结构(类、接口),但是不能定义同名的结构(类、接口)。不同的包下可以定义同名的结构
2.包的作用:
- 包可以包含类和子包,划分项目层次,便于管理
- 帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC 的设计模式
- 解决类命名冲突的问题
- 控制访问权限
3.JDK中主要的包
java.lang-----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
java.net-----包含执行与网络相关的操作的类和接口。
java.io -----包含能提供多种输入/输出功能的类。
java.util-----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text-----包含了一些java格式化相关的类
java.sql-----包含了java进行JDBC数据库编程的相关类/接口
java.awt-----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用
import关键字的使用:
import:导入
- import语句来显示引入指定包下所需要的类。相当于告诉编译器去哪里的包
- import语句,声明在包的声明和类的声明之间。
- 如果需要导入多个类或接口,那么就并列显示多个import语句即可
- 如果使用a.*导入结构,表示可以导入a包下的所有的结构。举例:可以使用java.util.*的方式,一次性导入 util 包下的所有类 / 接口
- 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
- 如果已经导入java.a包下的类,那么如果需要使用a包的子包下的类的话,仍然需要导入。
- 如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类。
- (了解)import static组合的使用:调用指定类或接口下的静态的属性或方法
11.面向对象特征之一:封装性
理论上:
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅暴露少量的方法给给外部使用,尽量方便外部的调用
通俗说:把该隐藏的隐藏,该暴露的暴露
2.如何实现数据封装
java规定了4种权限修饰:privat、缺省、protected、public

2.2作用
我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小


2.4 4种权限具体使用
类:只能使用public、缺省
类的内部成员:都能用
比较高:public、private
比较低:缺省、protected
3.封装性的体现
场景1:私有化类的属性,提供公共的get和set方法,对此属性进行获取和修改
场景2:将类中不需要对外暴露的方法,设为private
场景3:单例模式中构造器private的了,避免在类的外部创建实例
1.构造器的作用
作用1:搭配ne关键字,创建类的对象
作用2:在创建对象的同时,可以给对象的相关属性赋值
2.构造器的使用说明
>构造器声明的格式:权限修饰符 类名(形参列表){}

>创建类以后,没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类声明的权限相同
>一旦类中显示声明了构造器,系统不再提供默认的空参的构造器
>一个类中可以声明多个构造器,彼此之间构成重载
13.类中属性赋值过程
1.在类的属性中,可以有哪些位置给属性赋值?
①默认赋值;
②显式赋值;
③构造器中赋值;
④通过“对象.方法”的方式赋值;
⑤通过“对象.属性”的方式赋值
2.这些位置执行的先后顺序是怎样?
①-②-③-④/⑤
3.以上操作在对象创建过程中可以执行的次数如何?
>只能执行一次:①②③
>可以多次执行:④⑤
JavaBean 是一种 Java 语言写成的可重用组件。
- 好比你做了一个扳手,这个扳手会在很多地方被拿去用。这个扳手也提供多种功能 (你可以拿这个扳手扳、锤、撬等等),而这个扳手就是一个组件。
所谓 JavaBean,是指符合如下标准的 Java 类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的 get、set 方法
用户可以使用 JavaBean 将功能、处理、值、数据库访问和其他任何可以用 Java 代码创造的对象进行打包,并且其他的开发者可以通过内部的 JSP 页面、Servlet、其他 JavaBean、applet 程序或者应用来使用这些对象。用户可以认为 JavaBean 提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
《Think in Java》中提到,JavaBean 最初是为 Java GUI 的可视化编程实现的。你拖动 IDE 构建工具创建一个 GUI 组件(如多选框),其实是工具给你创建 Java 类,并提供将类的属性暴露出来给你修改调整,将事件监听器暴露出来。


