目录:
一、 面向对象和面向过程
二、 类和对象的关系
三、 成员变量和局部变量
四、 引用类型的兼容性
五、 单一职责原则
六、 代码块
七、 类的访问控制权限
八、 Packaging Classes
一、 面向对象和面向过程
1. 概述
- 什么是面向对象?:关注现实存在的事物的各方面的信息,从对象的角度出发,根据事物的特征进行程序设计
-
面向过程,是遇到一件事时,思考
我该怎么做
,然后一步步实现的过程
-
面向对象,是遇到一件事时,思考
我该让谁来做
,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了 -
总结:
面向过程:自己该怎么做
面向对象:找人帮我们做
-
对象:用来描述客观事物的一个实体
-
类:具有 相同属性和方法 的一组对象的集合
- 是一个模子,用以确定对象将会拥有的特征和
- 这里的特征和行为可以称之为属性和方法
-
属性:就是对象所具有的各种静态特征,通俗理解为对象有什么特点
-
方法:就是对象具有的各种动态行为,通俗理解为对象能做什么
-
总结:
类是对象的类型、对象是类的实例化表现
2. 面向对象的一般步骤:
- 先按照名词提炼问题领域中的对象
- 对 对象 进行描述,其实就是在明确对象中应该具备的属性和行为
- 通过 new 的方式,创建该事物的具体对象(
对象实例化
) - 通过该对象调用它以后的功能
面向对象
-
创建对象的内存图:
创建对象
二、 类和对象的关系
1. 概述
-
类
,用于描述多个对象的共同特征,它是对象的模板 -
对象
,用于描述现实中的个体,它是类的实例 - 比如:可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系
2. 对象的内存图:
对象的内存图三、 成员变量和局部变量
1. 变量的作用域 {}:
- 一对大括号,就是一个作用域
- 同一作用域中,不能出现同名变量
2. 成员变量和局部变量的区别
-
定义的位置不同
- 定义在类中的变量是成员变量
- 定义在方法中或者{}语句里面的变量是局部变量
-
在内存中的位置不同
- 成员变量存储在
堆内存
的对象中 - 局部变量存储在
栈内存
的方法中
- 成员变量存储在
-
声明周期不同
- 成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失
- 局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失
-
初始化不同
- 成员变量因为在堆内存中,所以有默认的初始化值,还可以用构造方法初始化
- 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用,
不赋值不能使用
成员属性的初始值
3. 对象数组:存储对象
- 数组中可以存储基本数据类型的变量,同时我们的数组中还可以存储对象
public class Demo {
public static void main(String[] args) {
//这个数组就是一个用来存储Obj类型的对象的数组
Obj[] b = new Obj[2]; //声明一个存储对象的数组
b[0] = new Obj();
b[1] = new Obj();
b[0].show();
}
}
class Obj {
public void show() {
System.out.println("show");
}
}
-
对象数组内存图:
对象数组
4. 方法参数
- 对于
基本类型
形式参数改变不会影响到实际参数 - 对于
引用类型
形式参数改变会影响到实际参数
-
方法参数内存图:
方法参数
四、 引用类型的兼容性
赋值兼容性规则:
- 对引用类型的变量进行赋值操作时,赋值号 右边 的表达式的类型必须与赋值号 左边 的对象引用类型 相同或是其子类型 (陪同赋值赋值类型兼容)
- 方法的** return **语句返回的结果的类型,必须与方法声明中的返回类型 相同 或是其子类型 (返回值的类型兼容)
- null 值与所有的引用类型兼容,所有引用类型的变量都可被赋值为 null
五、 单一职责原则
- 也叫:单一功能原则
-
定义:一个类有且只有一个引起功能变化的原因,即一个类有且只有一个功能
- 如果在一个类中,承载的功能越多,交融和耦合性会越高,被复用的可能性越低;
- 同时,因为耦合性较高,当类中其中一个职责发生变化时,有可能引发同类中其他职责的变化,进而影响整个程序的运行。
六、 代码块
1. 概述
- 在Java中,使用
{}
括起来的代码被称为代码块 - 根据其 位置和声明 的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。
2. 局部代码块
- 局部代码块是定义在 方法或语句中,方法和类都是以代码块的方式划定边界的
- 优点:在方法中出现,限定变量生命周期,及早释放,提高内存利用率
- 缺点:会使得代码可读性很差,实际开发中不会用
3. 构造代码块
- 定义在类中 成员位置,方法之外 的代码块
-
特点:
- 优先于 构造方法执行,构造代码块用于执行 所有对象 均需要的初始化动作
- 每创建一个对象均会执行一次构造代码块
4. 静态代码块
- 静态代码块是定义在成员位置,方法之外,使用 static 修饰的代码块。
-
特点:
- 它 优先于 主方法执行、优先于 构造代码块执行,在 类加载时 执行。
- 该类不管创建多少对象,静态代码块 只执行一次 。
- 可用于给 静态变量 赋值,用来给类进行初始化。
七、 类的访问控制权限
1. 概述
- 通过访问控制修饰符 (access modifiers)可以限制 成员 在类或对象外部的可见性
- 对于类而言,只有两种权限修饰符:
public
不写,默认
2. 公有的: public
- 访问限定范围最大,可以在
任何位置
被访问 - 只要能正确加载
public
成员所在的类型,就可以通过类型访问public
成员。
3. 私有的: private
- 访问限定范围最小,只允许在
本类中
进行访问
4. 受保护的: protected
- 只允许
当前类
,同包任意类
,跨包子类
可以访问
5. 默认
(不加任何访问修饰符)
- 只允许
当前类
,同包任意类
可以访问
注意:如果类用
public
修饰,则 类名必须与文件名相同。一个文件中 只能有一个public
修饰的类。
6. 访问权限图:
访问权限八、 Packaging Classes
1. 类的完全限定名(全类名)
- 类的完全限定名(全类名):在类名前面加上类所属的包名,中间用句点
“.”
分隔,称为类的完全限定名(Full Qualified Name),简称类的限定名
2. 我们如何唯一确定操作系统上的文件呢?
- 通过文件在操作系统上的 绝对路径,来唯一的确定一个文件
3. java 类比于 操作系统唯一确定一个文件的方式,如何唯一确定java中的一个类呢?
- 通过一个类的
所属包的包名 + 类名
唯一确定 java 中的一个类
ImportDemo: 简单类名 --> 全类名 com.cskaoyan.packages.ImportDemo;
4. 当在类体中使用了与当前类不同包的类名时,编译器编译时因为无法找到该类的定义而失败,有两个解决办法:
- 使用不同包类的完全限定名
- 使用
import
声明,为编译器提供该类的定义信息 (简单来讲,就是,将其他包的类型导入到当期的Java文件)
5. import 关键字
-
import
声明一般紧跟在package
声明之后,必须在类声明之前,其基本语法如下:
import <类的完全限定名>;
- Java语言核心包
java.lang
包中的类将被隐式导入,可以直接使用其中的类 -
import <包名>.*;
含义就是在当前java文件中,导入某个包下的 所有类(没有嵌套导入的功能)
6. package
- 在Java源程序文件的第一行使用
package
声明: 可以使文件中定义的类成为指定包的成员(java类是由包组织起来的)- package声明的语法如下:
package <包名>; 常规的命名的方式,域名反转的形式
- package声明的语法如下:
- 包名通常由多个名字字符串构成,中间用句点
“.”
分隔,每个名字表示的包称为其前面的名字表示的包的子包,- 通常以组织机构的域名反转形式作为其所有包的通用前缀,如
com.cskaoyan.packages
com.cskaoyan.packages 称之为 com.cskaoyan子包
7. 包的用途:
- 将相关的类和接口分组,包名通常表示包中各个类和接口的 用途 (分类组织java代码,方便管理我们的代码)
- 包创建了不同的 命名空间(Namespace),从而有效地解决了 类型命名 冲突问题
- 包提供了对应用程序内部实现机制的保护域
default
权限修饰符protected
权限修饰符 - 如果有一个java文件,没有写
package
关键字,这些类都被认为,属于java中的默认包的成员
网友评论