目录
一、封装
1.1 初识封装
1.2 如何封装成员变量
1.3 如何使用封装后的成员变量
二、访问限定符
三、包
3.1 包的概念
3.2 如何自定义包
3.3 导入包中的类
3.4 包的访问权限控制举例
示例一:private修饰成员变量
示例二: 不去修饰成员变量
示例三:public修饰成员变量
注意:
3.5 常见的包
四、static成员
4.1 再谈学生类
4.2 static修饰成员变量
4.3 static修饰成员方法
4.4 static成员变量初始化
五、代码块
5.1 代码块概念以及分类
5.2 普通代码块
5.3 构造代码块
5.4 静态代码块
六、对象的打印
一、封装
1.1 初识封装
1. 面向对象编程有三大特性:封装、继承、多态。
2. 在类和对象阶段,主要研究的就是封装特性。
3. 封装就相当于套上一层壳子屏蔽细节。这就好比像电脑这样一个复杂的设备,对于计算机使用者而言,不用关心内部核心部件,例如主板上线路是如何布局的,CPU内部是如何设计的等。用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
4. 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
1.2 如何封装成员变量
1. 做法:用private修饰成员变量(private是私人的意思)。
2. 注意:修饰后的成员变量只能在当前类中使用。
1.3 如何使用封装后的成员变量
1. 做法:在类中给每个被private修饰的成员变量定义用public修饰的"set"、"get"方法,用于提供可对成员变量赋值和得到的接口。
2. 工具:编译器提供了可以快速生成"set"、"get"方法的开发工具,具体操作如下图
尝试使用一下这些"set"、"get"方法:
二、访问限定符
1. Java中主要通过类和访问权限来实现封装。类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
2. ① 用private修饰的成员变量和成员方法,只能在自己所在的类中使用。
② 没有用任何访问限定符修饰的成员变量和成员方法,只能在同一个包中的类中使用。
③ protected主要是用在继承中,继承部分详细介绍。
④ 用public修饰的成员变量和成员方法,在所有类中只要声明包的路径都能使用。
3. 补充1:空权限指默认权限,这里的默认权限指的是包访问权限,即没有被任何访问限定符修饰的成员变量和成员方法,它只能在同一个包中的Java文件中使用。
4. 补充2:访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。
三、包
3.1 包的概念
1. 介绍:在日常生活中你的U盘中有很多歌曲,为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。例如下图:我们可以把众多歌曲先按照歌曲类型分为4个大的文件夹,在每个大的文件夹下又可以按照歌曲属于哪个歌手分为一些小的文件夹。
同样在Java中如果你有很多的Java文件,对它们在电脑中进行管理我们也会去使用文件夹,文件夹在Java中又被称为包(每个文件夹都有属于自己的路径,即每个包也都有属于自己的路径。创建的Java文件所在的路径不同,所属于的包就不同)。
2. 特点:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
3.2 如何自定义包
src是ideal默认的一个工程包。
自定义包的包名:① 全部小写 ② 一般情况下是域名的逆置写法,例如:域名是www.baidu.com,会写成com.baidu.www ( 这里相当于我们创建了三个包,路径分别是:com\、com\baidu\、con\baidu\www\ )
设置好自定义包后,表现形式一般为下列两种,一般会采用第二种表现形式。
更改成第二种表现形式的设置步骤如下:
下图中创建的两个名叫Student的Java文件并不冲突,因为一个是在com.baidu.www包下,另一个是在src包下。下面的图片2中,scr\代表scr包下的Student.java文件,www\代表www包下的Student.java文件。
下图中用红色方框框起来的两个Student的Java文件也是不冲突的,因为第一个是在com.baidu.www包下,另一个在com.baidu.www2包下。
在自定义的包中建立的Java文件的第一行都会有一个package + 包名,这句代码的意义是声明这个Java文件所在的包的路径,例如:下图中第一行带码代表当前这个Java文件在包com.baidu.www下。如果Java文件是直接定义在默认的包src下,则Java文件的第一行是不会有package语句的。
3.3 导入包中的类
写法一:采用导入包的形式 (一般采用这种形式)
我们平常在ideal中写代码时,直接在main方法中利用类即可,编译器会自动在当前的Java文件的头部导入这个类所在的包的路径或提供用户自己选择要导入哪个包中的类。
写法二:不导入包的形式 (在利用类时,在类的前面写明它所在的包的路径)
当我们想要使用一个包中的多个类时,可以将导入包的格式写成,例如:import java.util.*,这里的*表示通配符的意思。这种写法表示"导入"了某个包中所有的类,这里的导入在Java中是你用到谁才会导入谁。
虽然有上面这种简化的格式,但是仍然建议显示的指定要导入的类名,否则会很容易出现冲突的情况。 例如:下图中,java.util底下和java.sql底下都有Date这个类,当我们同时导入java.util.*和java.sql.*并且在main方法中在使用Date类时,编译器懵了不知道到底去使用哪个包中的Date类。
上面情况的解决方法是: (在利用类时,在类的前面写明它所在的包的路径)
我们还可以使用import static导入包中静态的方法和字段,这样可以使得在使用某个类中的方法时,不用写类名直接调用方法 (这种写法的可读性非常差,不要使用!)
注意事项: import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便,import 更类似于 C++ 的 namespace 和 using。
3.4 包的访问权限控制举例
示例一:private修饰成员变量
如下图,我们在scr\路径下创建了Student和test01,private的作用是使得被修饰的只能在自己的类中使用,因此我们在test01Java文件中使用Student类创建的对象时,会报错。
示例二: 不去修饰成员变量
如下图,我们在scr\路径下创建了Student,在com.baidu.www创建了test02。没有被任何访问限定符修饰的成员变量,只会有包访问权限,因此我们在test02Java文件中使用Student类创建的对象时,会报错。
示例三:public修饰成员变量
只要导入包后,在哪里都能使用。(这里就不详细举例了)
注意:
一般情况下成员变量设置为private,成员方法设置为public。
3.5 常见的包
1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
2. java.lang.reflect:java 反射编程包;
3. java.net:进行网络编程开发包。
4. java.sql:进行数据库开发的支持包。
5. java.util:是java提供的工具程序包,(集合类等) 非常重要。
6. java.io:I/O编程开发包。
四、static成员
4.1 再谈学生类
下图中的代码,在我们利用学生类实例化三个学生对象时,既然大家都在同一个班,为什么要把班级的属性在每个对象的内存中都存一份浪费内存呢,有没有其他的写法?
答:有,可以将classRoom成员变量用static修饰。
4.2 static修饰成员变量
① 一个成员变量被static修饰后,那么此时这个成员变量就不属于对象了。
② 被static修饰的成员变量在内存中的存放位置将不再是堆区,而是在方法区 (用于存储已被虚拟机加载的类信息、常量、静态变量、以及编译器编译后的代码等数据) 。
③ 被static修饰的成员变量可以被所有实例化的对象所共用。
④ 被static修饰的成员变量,生命周期伴随类的一生(随类的加载而创建,随类的卸载而销毁)
⑤ 访问静态成员变量的方式有两种:第一种用对象的引用访问,第二种用类名访问(推荐)
⑥ 静态成员变量又称为类变量,它不依赖于对象。
4.3 static修饰成员方法
静态成员方法又称类方法。
讨论一个问题:在下图代码中,为什么在静态方法中直接调用非静态方法会报错;而在非静态方法中直接调用非静态方法不会报错?
答:这是因为,在非静态方法中有一个隐形参数this,而在静态方法中并没有隐形参数this,对于非静态方法的调用又是依赖于对象的,因此如果直接在静态方法中调用非静态方法会报错。如果非要在静态方法中调用非静态方法,可以在静态方法中实例化对象了之后再调用非静态方法,如下面第二张图。如果是在静态方法中直接调用静态方法可以不用写类名,直接调用静态方法。
总之:不能再类方法中,直接访问任何非静态的成员变量和成员方法。
4.4 static成员变量初始化
1. 静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
2. 就地初始化指:在定义时直接给出初始值。
3. 要讲清楚静态代码块初始化,那得先了解什么是代码块。
五、代码块
5.1 代码块概念以及分类
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
① 普通代码块
② 构造块
③ 静态块
④ 同步代码块(后续讲解多线程部分再谈)
5.2 普通代码块
普通代码块:定义在方法中的代码块(这种用法较少见)
5.3 构造代码块
1. 定义在类的里面,方法的外面的代码块称为构造块/示例代码块/非静态代码块,可用于初始化非静态的成员方法(也可以初始化静态的成员方法)。
2. 讨论问题1:在下面的代码中,构造方法和构造块谁先执行?
答:构造块先执行。
3. 讨论问题2: 在下面的代码中,成员变量和构造块谁先执行?
答:取决于在代码中定义的顺序。(一般,我们在类中会先定义属性,再定义其他的方法)
5.4 静态代码块
1. 静态的所有都不依赖于对象。
2. 静态代码块,用于初始化静态的成员变量(不可以用于初始化非静态的成员方法)。
3. 根据下图代码的运行结果可以发现,静态代码块>>构造块>>构造方法
4. 静态成员变量和静态代码块谁先执行?答:和成员变量和构造块谁先执行一样,取决于在代码中定义的顺序(这里就不举例了)。
六、对象的打印
利用重写toString方法,可以在类中不自己定义show方法。
例如,如下代码中,如果我们想要打印成员变量的信息,就需要自己写show方法。
如何利用重写toString方法?
本篇文章已完结,谢谢支持哟 ^^ !!!