本篇博客主要给大家介绍以下内容:
image.png
大一狗学不过来了,大家多多支持呀~

1.🐧封装的概念

面对对象程序有三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套一个壳来隐蔽细节
比如:电脑这样一个负责的设备,提供给用户的就只是一些很容易上手的功能:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,以此来完成日常事务。
但一个计算机,真正工作的是黑匣子里面的CPU、显卡、内存等一些硬件元件。
image.png
对于计算机使用者而言,不用去关心内部的核心不见,比如主板上的线路是如何布局的?CPU是如何设计的?
用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。
因此计算机厂商在出厂的时候,在外部套上壳子,将内部的实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可,这样能让用户操作更舒适,也更进一步得保护电脑主机。对于我们写的程序来说也是这样
那么就可以引出Java中封装的概念
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,进对外公开接口来和对象进行交互

2.🍨访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用
Java中提供了四种访问限定符:

No 范围 private defaul protected public
1 同一包中的同一类 🍉 🍉 🍉 🍉
2 同一包中的不同类 🍉 🍉 🍉
3 不同包中的子类 🍉 🍉
4 不同包的非子类
🍉

比如:
public:可以理解为一个人的外貌特征,谁都可以看到
default:对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private:只有自己知道,其他人都不知道
🐱【说明】:

  • protected主要是用在继承中,这一部分后面我会给大家介绍
  • defaul权限就是指默认权限
  • 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性

这是一个计算机的类

  1. public class Computer {
  2. private String cpu;
  3. // CPU
  4. private String memory;
  5. // 内存
  6. public String screen;
  7. // 屏幕
  8. String brand;
  9. // 品牌-----》default属性
  10. public Computer(String brand,String cpu,String memory,String screen){
  11. this.brand = brand;
  12. this.cpu = cpu;
  13. this.memory = memory;
  14. this.screen = screen;
  15. }
  16. public void Boot(){
  17. System.out.println("开机~~~~");
  18. }
  19. public void PowerOff(){
  20. System.out.println("关机~~~~");
  21. }
  22. public void SurfInternet(){
  23. System.out.println("网上冲浪!!");
  24. }
  25. }
  26. class TestComputer{
  27. public static void main(String[] args){
  28. Computer p = new Computer("HW","i7","8G","13*14");
  29. System.out.println(p.brand);
  30. // default属性:只能被本报中类访问
  31. System.out.println(p.screen);
  32. // public属性:可以任何其他类访问
  33. //System.out.println(p.cpu);
  34. // private属性:只能在Computer类中访问,不能被其他类访问
  35. }
  36. }

3.🍩封装扩展之包

3.1🍪包的概念

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理,把多个类收集在一起为一组,称为软件包。有点类似于文件目录。
Java类和对象(封装) - 图3
在Java中也引入了包的概念,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。(听不懂没关系,下面我会举例一一分析的~)

3.2🎂导入包中的类

Java中已经提供了很多现成的类供我们使用.例如Date类:可以使用java.util.Date导入java.util这个包中的Date类.

  1. public class Test{
  2. public static void main(String[] args){
  3. java.util.Date date = new java.util.Date();
  4. System.out.println(date.getTime());
  5. }
  6. }

但是这种写法比较麻烦一些,可以使用import语句导入包

  1. import java.util.Date;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Date date =new Date();
  5. //得到一个毫秒级别的时间戳
  6. System.out.println(date.getTime());
  7. }
  8. }

如果需要使用java.util中的其他类,可以使用import java.util.*(哈哈管它呢,全导进去!)

  1. import java.util.*;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Date date =new Date();
  5. //得到一个毫秒级别的时间戳
  6. System.out.println(date.getTime());
  7. }
  8. }

但是我们更建议显式的指定要导入的类名,否则还是容易出现冲突的情况
image.png
我们要完善好导入的路径
image.png
我们也可以使用import static导入包中静态的方法和字段。

  1. import static java.lang.Math.*;
  2. public class Test {
  3. public static void main(String[] args) {
  4. double x = 30;
  5. double y = 40;
  6. //静态导入的方式写起来更方便
  7. //double result = Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
  8. double result = sqrt(pow(x,2)+pow(y,2));
  9. System.out.println(result);
  10. }

⚠️注意事项:import和C++的#include差别很大.C++必须用#include来引入其他文件内容,但是Java不需要,import只是为了写代码的时候更方便。import更类似于C++的namespace 和using(这里就不多说了,我也不太懂,哈哈哈)

3.3🧁自定义包

🍧基本规则

  • 在文件的最上方加上一个package语句指定该代码在哪个包中
  • 包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(例如com.bit.demo1).
  • 包名要和代码路径相匹配。例如创建com.bit.demo1的包,那么会存在一个对应的路径com/bit/demo1来存储代码
  • 如果一个类没有package语句,则该类被放到一个默认包中。

    🥧操作步骤

    首先创建包
    {IUIGAP5@W`J27C2_XIV660.png
    我们这样输入之后,出来的是一个只有一行的包
    Z9R$8]X9G){4{(E4)KSX`2P.png
    不用着急, 我们把compact middle packages取消勾选 O%78$W4OH7P)$1VUU27)K75.png
    这样层次感就出来啦
    JOE@]CI2KEFQDT{GPPYQ7]6.png
    中间的bit包中依旧可以导包O[B1@Q`XF[Z]JU)NVU(@)V1.png
    我们这里观察一个小细节👇:
    J`[XVN{CXX5ZID2F_LD$AXU.png](https://cdn.nlark.com/yuque/0/2022/png/25529268/1648726366913-909360fb-71b5-4785-957e-d2056c0e6ace.png#clientId=ubf4ed5e3-bc25-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uca658ff5&margin=%5Bobject%20Object%5D&name=J%60%5BXVN%7BCXX5ZID2F_LD%24AXU.png&originHeight=386&originWidth=723&originalType=binary&ratio=1&rotation=0&showTitle=false&size=50047&status=done&style=none&taskId=uc624e191-05a4-45a8-bf06-5357bb7532f&title=)<br /> package  为声明包的路径  <br /> 此时我们在TestDemo2下调用demo1包中的TestDemo类👇:<br />![)C6E009(J@6R18$QSE%NGMP.png](https://cdn.nlark.com/yuque/0/2022/png/25529268/1648726518134-966dd6e4-9aa2-4489-bab4-a2ea23795efd.png#clientId=ubf4ed5e3-bc25-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u86d91286&margin=%5Bobject%20Object%5D&name=%29C6E009%28J%406R18%24QSE%25NGMP.png&originHeight=550&originWidth=864&originalType=binary&ratio=1&rotation=0&showTitle=false&size=83272&status=done&style=none&taskId=uff6fb14c-0080-4216-b0a9-4667599bf7a&title=)<br /> 我们可以看到,这里编译器编译器悄无声息得帮我导入了包中得TestDemo类  👇:<br />![26JC_4C]XD0`HL}A9}A9OEF.png
    这时我们在src目录中再创建一个同名得TestDemo类👇:
    })(2}`BF{U(OU`L`Y}G(@9V.png
    我们在这里必须要通过这种类似于绝对路径的方式来调用,不能通过导包,因为它们的名字都相同,就算是导包也解决不了重名的问题,编译器识别不了 👇:
    FYM8DS]{D0VPFSGTG00NO%I.png
    上面也介绍到了,包访问权限就是我们所说的默认权限。

是不是还有些模糊,不要着急,我再用代码为你演示一遍image.png
包权限就是默认权限,意思就是a这个成员变量在demo1这个包底下都可以访问到
我们列举三种情况:
第一种:在本类中👇
image.png
第二种,所在包的其他类中👇
image.png
第三种:
其他包的类当中👇
image.png
我们就可以验证了包访问权限即是默认访问权限了(default)
那么我们来观察public private修饰过后的权限👇
image.png
我们在TestDemo中定义了a,b,c三个变量,它们拥有不同的访问限定修饰符所修饰👆
那么我们可以看到在TestDemo这个类中,我们是可以调用三个数据的
然后我们在继续看这个demo1底下的另外一个包的调用情况👇
image.png
我们可以看到,private修饰的c这个成员变量就访问不到了👆
接着我们看其他包中的类引用情况👇
image.png
我们可以看到只有public修饰的成员变量才可以被访问到👆
这个时候那张表格我们就可以差不多理解了,哪张表格?再给大家放出来看一下👇

No 范围 private defaul protected public
1 同一包中的同一类 🍉 🍉 🍉 🍉
2 同一包中的不同类 🍉 🍉 🍉
3 不同包中的子类 🍉 🍉
4 不同包的非子类
🍉

我们常用的包

  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编程开发包

希望能帮到你~
感谢阅读~