以下为本人观看尚硅谷Java学习视频所做的笔记
目录
Java面向对象学习的三条主线
1、Java类及类的成员:
属性、方法、构造器、代码块、内部类
2、面向对象的三大特征:
封装性、继承性、多态性、(抽象性)
3、其它关键字:
this、super、static、final、abstract、interface、package、import等
理解面向过程和面向对象
面向过程(POP)Procedure Oriented Programming
面向对象(OOP)Object Oriented Programming
二者都是一种思想,面向对象是相对于面向过程而言的。
面向过程,强调的是功能行为,以函数为最小单位,考虑周末做。
面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
类和对象
类和对象是面向对象的核心概念
类是对一类事物的描述,是抽象的、概念上的定义
对象是实际存在的该类实物的每个个体,因而也称为实例
面向对象程序设计的重点是类的设计
设计类,就是设计类的成员
属性:对应类中的成员变量
行为:对应类中的成员方法
类和对象的使用:
1、创建类,设计类的成员
2、创建类的对象
3、通过“对象.属性”或“对象.方法”调用对象的结构
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着如果我们修改一个对象的属性a,则不影响另一个对象属性a的值。
注意:
Person p1 = new Person();
Person p3 = p1;
此时是将p1保存的对象地址赋值给p3,导致p1和p3指向了堆空间中的同一个对象实体。
对象内存解析:
堆 — 此内存区域的唯一目的就是存放对象实例,几乎所有对象实例都是在这里分配内存。
虚拟机栈 — 通常所说的栈。用于存储局部变量等。方法执行完后会自动释放。
方法区 — 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
属性(成员变量)vs局部变量
属性:类的成员变量
局部变量:类的方法中定义的局部变量
1、相同点:
1.1定义变量的格式:数据类型 变量名 = 变量值
1.2先声明,后使用
1.3变量都有对应的作用域
2、不同点:
2.1在类中声明的位置不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量。
2.2关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。常用的权限修饰符:private、public、缺省、protected —>封装性
局部变量:不可以使用权限修饰符。
2.3默认初始化的情况:
属性:类的属性,根据其类型,都有默认初始化值。
整型:0
浮点型:0.0
字符型:0
布尔型:false
引用数据类型:null
局部变量:没有默认初始化值
意味着在使用局部变量之前,一定要显式赋值。
特别地,形参在调用时,我们赋值即可。
2.4在内存中加载的位置:
属性:加载到堆空间中(非static)
局部属性:加载到栈空间中
理解“万事万物皆对象”:
1、在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
- Scanner、String等
- 文件:File
- 网络资源:URL
2、涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
内存解析的说明:
引用类型的变量,只可能存储两类值:null或地址值(含变量的类型)
匿名对象的使用:
1、理解:我们创建的对象,没有显式的赋给一个变量名,即为匿名对象
2、特征:匿名对象只能调用一次
3、使用:
设Phone为一个类,包含方法sendMail,同时在Mail类中包含方法public void show(Phone phone)
1)new Phone().sendMail()
2)Mail.show(new Phone())
方法
方法:描述类应有的功能
方法的声明:
1、权限修饰符:
Java规定的4种权限修饰符:private、public、缺省、protected
2、返回值类型:
有返回值 vs 无返回值
如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量。
如果方法没有返回值,则方法声明时,使用void来表示。
3、方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
4、return关键字的使用
使用范围:使用在方法体中
作用:结束方法;针对于有返回值类型的方法,使用“return 数据”方法返回所要的数据
注意点:return关键字后面不可以声明执行语句
5、方法的使用中,可以调用当前类的属性或方法;方法中不可以定义方法
特殊的,方法A又调用方法A:递归方法
方法的重载:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或参数类型不同即可。
与方法的权限修饰符、返回值类型、形参变量名、方法体都无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
可变个数的形参:
JavaSE5.0中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参,从而,可以用一种更简单的方式,来传递个数可变的实参。
JDK5.0以前:采用数组形参来定义方法,传入多个同一类型变量
JDK5.0:采用可变个数形参来定义方法,传入多个同一类型的变量
可变个数形参的格式:数据类型 … 变量名
当调用可变个数形参的方法时,传入的参数个数可以是任意个
可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载,二者不能共存
可变个数形参在方法的参数列表中,必须声明在末尾(若参数使用的是数组则无需必须在末尾)
可变个数形参在方法的参数列表中,最多只能声明一个可变形参
关于变量的赋值:
如果变量是基本数据类型,此时赋值的是变量所保存的数据值
如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
例子:
方法参数的传递机制:值传递
1、形参与实参
形参:方法定义时,声明的小括号内的参数
实参:方法调用时,实际传递给形参的数据
2、值传递机制:
如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值
如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值
封装与隐藏
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合“仅对外暴露少量的方法用于使用
隐藏对象内部的复杂性,只对外公开简单的借口。用于外界调用,从而提高系统的可扩展性、可维护性。通俗讲,把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的设计思想。
问题的引入:
当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受属性的数据类型和存储范围的制约。除此之外,没有其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加(比如:set方法)。同时,我们需要避免用户再使用“对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)—>此时,针对于属性就体现了封装性。
封装性的体现:
我们将类的属性xxx私有化,同时,提供公共的public方法来获取(get方法)和设置(set方法)该属性的值。注意这个是封装性的体现,不等同于封装性。另外,不对外暴露的私有(private)方法和单例模式也是封装性的体现。
封装性的体现,需要权限修饰符来配合:
1、Java规定的4种权限(从小到大排列):private、缺省、protected、public
对于class的权限修饰只可以用public和default(缺省)
- public类可以在任意地方被访问
- default类只可以被同一个包内部的类访问
2、4种权限可以用来修饰类的内部结构:属性、方法、构造器、内部类
构造器
构造器(构造方法):constructor
构造器的特征:
- 具有与类相同的名称
- 不声明返回值类型,(与声明void不同)
- 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
构造器的作用:创建对象;给对象进行初始化
说明:
1、如果没有显式定义类的构造器的话,则系统默认提供一个空参的构造器
2、定义构造器的格式:权限修饰符 类名(形参列表){}
3、一个类中定义多个构造器,彼此构成重载
4、一旦我们显式的定义了类的构造器之后,系统就不再提供默认的空参构造器
5、一个类中,至少会有一个构造器
属性 赋值的先后顺序:
1、默认初始化
2、显式初始化 / 在代码块中赋值(在类中先写的先赋值)
3、构造器中赋值
4、通过“对象.方法”或“对象.属性”的方式赋值
JavaBean
JavaBean是一种Java语言写成的可重用组件
所谓JavaBean,是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共构造器
- 有属性,且有对应的get、set方法
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴功能,而不用关心任何改变。
this的使用
this的作用和其词义很接近
- 在方法内部使用,即这个方法所属对象的引用
- 在构造器内部使用,表示该构造器正在初始化的对象
this表示当前对象,可以调用类的属性、方法和构造器
使用this关键字的时机:
当在方法内需要用到调用该方法的对象时,就用this
具体的:我们可以用this来区分局部变量和属性
例:this.name = name
this修饰属性和方法:
this理解为 —> 当前对象 或 当前正在创建的对象
在类的方法中,我们可以使用“this.属性”或“this.方法”的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略“this.”。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用“this.变量”的方式,表示此变量是属性,而非形参。
this调用构造器:
- 我们在类的构造器中,可以显式的使用“this(形参列表)”方式,调用本类中指定的其他构造器
- 构造器中不能通过“this(形参列表)”方式调用自己
- 如果一个类中有n个构造器,则最多有n-1构造器中谁用“this(形参列表)”,意味着不能在调用构造器的过程中形成构造器调用间的闭环
- 规定:“this(形参列表)”必须声明在当前构造器的首行
- 构造器内部,最多只能声明一个“this(形参列表)”,用来调用其他的构造器
package的使用
1、为了更好的实现项目中类的管理,提供包的概念
2、使用package声明类或接口所属的包,声明在源文件中的首行
3、包,属于标识符,遵循标识符的命名规则、规范(xxxyyyzzz)、“见名知意”
4、每出现一次“.”代表一层文件目录
补充:同一个包下不能命名同名的接口、类。不同的包下可以命名同名的接口、类
MVC设计模式
MVC是常用的设计模式之一,将整个程序分为三个层次:视图模型层、控制器层、数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性
模型层 model 主要处理数据
- 数据对象封装 model.bean/domain
- 数据库操作类 model.dao
- 数据库 model.db
控制层 controller 处理业务逻辑
- 应用界面相关 controller.activity
- 存放fragment controller.fragment
- 显式列表的适配器 controller.adapter
- 服务相关的 controller.service
- 抽取的基类 controller.base
视图层 view 显示数据
- 相关工具类 view.utils
- 自定义view view.ui
import的使用
import:导入
1、在源文件中显式地使用import结构导入指定包下的类、接口
2、声明在包的声明和类的声明之间
3、如果需要导入多个结构,则并列写出即可
4、可以使用“xxx.*”的方式,表示导入xxx包下的所有结构
5、如果使用的类或接口是java.lang包下定义的,则可以省略import结构
6、如果使用的类或接口是本包下定义的,则可以省略import结构
7、如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示(例: Account 和 om.atguigu.exer3.Account)
8、使用“xxx.*”方式表明可以使用xxx包下的所有结构,但是如果使用的是xxx子包下的结构,则仍需要显式导入
9、import static:导入指定类或接口中的静态结构:属性或方法(区别于import导入的是类或接口)