您的位置 首页 java

一篇文章带你搞定Java封装

一篇文章带你搞定Java封装

1.:penguin:封装的概念

面对对象程序有三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是 套一个壳来隐蔽细节

比如:电脑这样一个负责的设备,提供给用户的就只是一些很容易上手的功能:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,以此来完成日常事务。

但一个计算机,真正工作的是黑匣子里面的 CPU 、显卡、内存等一些硬件元件。

一篇文章带你搞定Java封装

对于计算机使用者而言,不用去关心内部的核心不见,比如主板上的线路是如何布局的?CPU是如何设计的?

用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。

因此计算机厂商在出厂的时候,在外部套上壳子,将内部的实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可,这样能让用户操作更舒适,也更进一步得保护电脑主机。对于我们写的程序来说也是这样

那么就可以引出 Java 中封装的概念

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,进对外公开接口来和对象进行交互

2.:ice_cream:访问限定符

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

java 中提供了四种访问限定符:

No

范围

private

defaul

protected

public

1

同一包中的同一类

:watermelon:

:watermelon:

:watermelon:

:watermelon:

2

同一包中的不同类

:watermelon:

:watermelon:

:watermelon:

3

不同包中的子类

:watermelon:

:watermelon:

4

不同包的非子类

:watermelon:

比如:

public:可以理解为一个人的外貌特征,谁都可以看到

default:对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了

private:只有自己知道,其他人都不知道

:cat:【说明】:

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

这是一个计算机的类

 public class Computer {
    private String cpu;
//    CPU
    private String memory;
//    内存
    public String screen;
//    屏幕
     String  brand;
//    品牌-----》default属性 
public Computer(String brand,String cpu,String memory,String screen){
    this.brand = brand;
    this.cpu = cpu;
    this.memory = memory;
    this.screen = screen;
    
}
    public  void  Boot(){
        System.out.println("开机~~~~");
    }
    public void PowerOff(){
        System.out.println("关机~~~~");
    }
    public void SurfInternet(){
        System.out.println("网上冲浪!!");
    }
}
class TestComputer{
    public  static  void main(String[] args){
         Computer  p = new Computer("HW"," i7 ","8G","13*14");
        System.out.println(p.brand);
//        default属性:只能被本报中类访问
        System.out.println(p.screen);
//        public属性:可以任何其他类访问
        //System.out.println(p.cpu);
//        private属性:只能在Computer类中访问,不能被其他类访问
    }
}
复制代码  

3.:doughnut:封装扩展之包

3.1: cookie :包的概念

在面向对象体系中,提出了一个 软件包 的概念,即:**为了更好地管理,把多个类收集在一起为一组,称为软件包。**有点类似于文件目录。

在Java中也引入了包的概念, 包是对类、接口等的封装机制的体现,是一种对类或者接口等得很好的组织方式 ,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用: 在同一个工程中允许存在相同名称的类,只要处在不同的包中即可 。(听不懂没关系,下面我会举例一一分析的~)

3.2:birthday:导入包中的类

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

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

}
复制代码  

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

 import java.util.Date;
public class Test {
    public static void main(String[] args) {
        Date date =new Date();
        //得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}
复制代码  

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

 import java.util.*;
public class Test {
    public static void main(String[] args) {
        Date date =new Date();
        //得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
}
复制代码  

但是我们 更建议显式的指定要导入的类名,否则还是容易出现冲突 的情况

我们要完善好导入的路径

我们也可以使用import static导入包中静态的方法和字段。

 import static java.lang.Math.*;
public class Test {
    public static void main(String[] args) {
        double x = 30;
        double y = 40;
        
        //静态导入的方式写起来更方便
        //double result = Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
        double result = sqrt(pow(x,2)+pow(y,2));
        System.out.println(result);
    }
    
复制代码  

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

3.3 自定义包

:shaved_ice:基本规则

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

操作步骤

首先创建包

一篇文章带你搞定Java封装

我们这样输入之后,出来的是一个只有一行的包

一篇文章带你搞定Java封装

不用着急, 我们把compact middle packages取消勾选

一篇文章带你搞定Java封装

这样层次感就出来啦

一篇文章带你搞定Java封装

中间的bit包中依旧可以导包!

一篇文章带你搞定Java封装

我们这里观察一个小细节:point_down::

一篇文章带你搞定Java封装

package 为声明包的路径

此时我们在TestDemo2下调用demo1包中的TestDemo类:point_down::

一篇文章带你搞定Java封装

我们可以看到,这里编译器编译器悄无声息得帮我导入了包中得TestDemo类 :point_down::

一篇文章带你搞定Java封装

这时我们在src目录中再创建一个同名得TestDemo类:point_down::

一篇文章带你搞定Java封装

我们在这里必须要通过这种类似于绝对路径的方式来调用,不能通过导包,因为它们的名字都相同,就算是导包也解决不了重名的问题,编译器识别不了 :point_down::

一篇文章带你搞定Java封装

上面也介绍到了,包访问权限就是我们所说的默认权限。

是不是还有些模糊,不要着急,我再用代码为你演示一遍

一篇文章带你搞定Java封装

包权限就是默认权限,意思就是a这个成员变量在demo1这个包底下都可以访问到

我们列举三种情况:

第一种:在本类中:point_down:

一篇文章带你搞定Java封装

第二种,所在包的其他类中:point_down:

一篇文章带你搞定Java封装

第三种:

其他包的类当中:point_down:

一篇文章带你搞定Java封装

我们就可以验证了包访问权限即是默认访问权限了(default)

那么我们来观察public private修饰过后的权限:point_down:

一篇文章带你搞定Java封装

我们在TestDemo中定义了a,b,c三个变量,它们拥有不同的访问限定修饰符所修饰:point_up_2:

那么我们可以看到在TestDemo这个类中,我们是可以调用三个数据的

然后我们在继续看这个demo1底下的另外一个包的调用情况:point_down:

一篇文章带你搞定Java封装

我们可以看到,private修饰的c这个成员变量就访问不到了:point_up_2:

接着我们看其他包中的类引用情况:point_down:

一篇文章带你搞定Java封装

我们可以看到只有public修饰的成员变量才可以被访问到:point_up_2:

这个时候那张表格我们就可以差不多理解了,哪张表格?再给大家放出来看一下:point_down:

No

范围

private

defaul

protected

public

1

同一包中的同一类

:watermelon:

:watermelon:

:watermelon:

:watermelon:

2

同一包中的不同类

:watermelon:

:watermelon:

:watermelon:

3

不同包中的子类

:watermelon:

:watermelon:

4

不同包的非子类

:watermelon:

我们常用的包

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

希望能帮到你~

文章来源:智云一二三科技

文章标题:一篇文章带你搞定Java封装

文章地址:https://www.zhihuclub.com/180161.shtml

关于作者: 智云科技

热门文章

网站地图