《JavaSE》---11.<面向对象系列之(封装)>


系列文章目录

第一章 Java 类和对象

第二章 Java 封装

第三章 Java 继承

第四章 Java 多态

附:static关键字

附:this和super


前言

本篇博客主要讲解Java基础语法中的

面向对象系列之

封装的概念、四大访问修饰符的详细解释、封装成员变量配套的setter和getter方法及快捷键的使用、封装的意义。

的概念的引入、如何导入包、快捷查看我们导入包中的类的方法、查看导入包的jdk中的源码、通配符*、import和c语言中include的区别、自定义包(如何分解)、常见的包的介绍。


      大家好,本人是普通一本的在校大学生一枚,目前在学习java。之前也学了一段时间,但是没有发布博客。本人现在已经大二结束了,开学就大三了,时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!!

      喜欢我文章的兄弟姐妹们可以点赞,收藏和评论我的文章。喜欢我的兄弟姐妹们以及也想复习一遍java知识的兄弟姐妹们可以关注我呦,我会持续更新滴,并且追求完整。
望支持!!!!!!一起加油呀!!!!

语言只是工具,不能决定你好不好找工作,决定你好不好找工作的是你的能力!!!!!

学历本科及以上就够用了!!!!!!!!!!!!!!!!!!!!!!!!!!!!


封装的意义:

封装的主要作用在于对外隐藏内部实现细节提高程序的安全性

为了更好的讲封装,我们先引入包的概念。

软件包的引入

1.包的概念

在面向对象体系中,提出了一个软件包的概念,即:

为了更好的管理类,把多个类收集在一起成为一组,称为软件包。

类似于目录。

在Java中也引入了包

包是对类、接口等的封装机制的体现,是一种对或者接口等的很好的组织方式,

比如:一个包中的类不想被其他包中的类使用。

包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。

2.导入包中的类

使用 import语句导入包

例如我们之前讲到的java键盘的输入,当我们写出Scanner。上方就会自动导包出现

import java.util.Scanner;

这个语句,实际上就是导入包中的Scanner类。

通配符:*

如果想导入java.util包下面的所有类。那么可以使用

import java.util.*;

这个语句。

注:更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.

比如:

import java.util.*;

import java.sql.*;

util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错。

java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

更多关于包的概念在这篇文章的后面会再讲到


再了解封装之前我们首先了解一下四大访问修饰限定符。

一、四大访问修饰限定符

谈到封装我们首先了解一下访问修饰限定符。后面会用到

private:

是类访问权限。只能访问同一包中的同一类。

default:

是包访问权限。只能访问同一包下面的同类或者不同类。

是默认的,你不加访问修饰限定符,编译器默认就是default权限。

protect(难点):

不同包中的子类的访问权限。

可以访问在不同包之中是子类的访问(子类继承中的知识)。也可以访问同一包中的同类和不同类。

在其他包继承了protect修饰的类那么需要在非静态方法中使用super去访问父类的成员

public:

同包还是不同包,同类还是不同类,哪里都可以访问到。

我们用一张图,更直观的感受四大访问修饰符。 


二、封装

2.1封装的概念:

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

(比如我们的电脑主机,只提供了一些接口供我们用户使用,而用户不需要去管内部是怎样实现的)

2.2封装的代码示例:

(被private修饰就相当于封装。)

class PetDog {
    //成员变量
    private String name;//名字
    private String color;//颜色
    private int age;   //年龄
    // 狗的属性

    //构造方法
    public PetDog() {
        this("阿花", "花色", 25);
        System.out.println("构造方法1");
    }

    public PetDog(String name, String color, int age) {
        this.name = name;
        this.color = color;
        this.age = age;
        System.out.println("构造方法2");
    }

    //成员方法
    // 狗的行为
    public void barks() {
        System.out.println(this.name + ": 旺旺旺~~~");
    }
    public void wag() {
        System.out.println(this.name + ": 摇尾巴~~~");
    }
}

public class Test {
    //在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
    public static void main(String[] args) {
        PetDog dog1 = new PetDog();
        System.out.println("姓名:" + dog1.name);
        System.out.println("颜色:" + dog1.color);
        System.out.println("年龄:" + dog1.age);
        dog1.barks();
        dog1.wag();
    }
}

我们发现与类和对象讲的相似的,我们这里代码的区别就是将成员变量用了private修饰,而不是以前的public。在前面我们看到private修饰之后这个变量就只能在当前类之中使用了,因此上述主函数中就不能这么写了。如下:会编译报错。

 那么我们还想要去访问这个成员变量该如何访问呢,这里我们就用到了setter和getter这两个方法去初始化和访问它们。

Setter(初始化封装的成员变量)

代码示例:(相当于创建了setter这个公开的成员方法去初始化我们的对象)

快捷键:

快捷1:在这个类当中鼠标右键,点击generate...再点击Setter,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了

快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Setter,之后与快捷1同理。

下面代码中还用到了Getter,Getter的快捷健我们也在下面说到了。

//创建一个狗类
class PetDog {
    //成员变量
    private String name;//名字
    private String color;//颜色
    private int age;   //年龄
    // 狗的属性

    //构造方法,//我们在这里创建了多个构造方法,方便后面的使用。


    public void setName(String name) {
        this.name = name;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public int getAge() {
        return age;
    }

    //成员方法
    // 狗的行为
    public void barks() {
        System.out.println(this.name + ": 旺旺旺~~~");
    }
    public void wag() {
        System.out.println(this.name + ": 摇尾巴~~~");
    }
}

public class Test {
    //在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
    public static void main(String[] args) {
        PetDog dog1 = new PetDog();
        dog1.setName("阿绿");
        dog1.setColor("绿色");
        dog1.setAge(15);
        System.out.println("姓名:" + dog1.getName());
        System.out.println("颜色:" + dog1.getColor());
        System.out.println("年龄:" + dog1.getAge());
        dog1.barks();
        dog1.wag();
    }
}

输出结果:

姓名:阿绿
颜色:绿色
年龄:15
阿绿: 旺旺旺~~~
阿绿: 摇尾巴~~~

通过setter和getter我们就可以在外部成功初始化和访问我们已经封装好的成员变量。setter与构造方法类似,不过它不是构造方法,相当于成员方法。但是它方法实现的内容就是给我们的成员变量进行初始化。如果我们不想用setter去初始化对象,可以用构造方法去初始化,之后用Getter获取相应的值也是可以的,如下:

Getter((得到封装的成员变量的值))

快捷键:

快捷1:在这个类当中鼠标右键,点击generate...再点击Getter,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了

快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Getter,之后与快捷1同理。

代码示例:


//创建一个狗类
class PetDog {
    //成员变量
    private String name;//名字
    private String color;//颜色
    private int age;   //年龄
    // 狗的属性

    //构造方法,//我们在这里创建了多个构造方法,方便后面的使用。
    public PetDog() {
        this("阿花", "花色", 25);
        System.out.println("构造方法1");
    }

    public PetDog(String name, String color, int age) {
        this.name = name;
        this.color = color;
        this.age = age;
        System.out.println("构造方法2");
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public int getAge() {
        return age;
    }

    //成员方法
    // 狗的行为
    public void barks() {
        System.out.println(this.name + ": 旺旺旺~~~");
    }
    public void wag() {
        System.out.println(this.name + ": 摇尾巴~~~");
    }
}

public class Test {
    //在主函数中,我们进行实例化这个类。并对实例化出的类进行使用。
    public static void main(String[] args) {
        PetDog dog1 = new PetDog();
        System.out.println("姓名:" + dog1.getName());
        System.out.println("颜色:" + dog1.getColor());
        System.out.println("年龄:" + dog1.getAge());
        dog1.barks();
        dog1.wag();
    }
}

输出结果:

构造方法2
构造方法1
姓名:阿花
颜色:花色
年龄:25
阿花: 旺旺旺~~~
阿花: 摇尾巴~~~

如果不用setter,我们可以用构造方法进行初始化,之后直接用getter获取到也可以。

Setter和Getter

setter和getter相当于一个组合,一个对封装的变量进行赋值,另一个用来返回这个变量的值。如果要一起使用Setter和Getter,那么还有一个快捷健就是

快捷1:在这个类当中鼠标右键,点击generate...再点击Getter and Setter和,之后我们可以选择参数,再点击ok就行了,如果需要选择多个参数,只需要按住Ctrl点击就可以选择多个参数了

快捷2:光标点在这个类当中,按键盘Alt+Insert,再点击Getter and Setter,之后与快捷1同理。

这样Setter和Getter就可以一起被创建了。


三、封装的拓展之包

3.1导入包当中的类(上文简单讲过)

通过import去导入包当中的类。例如:

我们在打印数组时,将数组转换为字符串需要用到toString(数组名)这个方法,我们的写法是Arrays.toString(array);此时就需要导入包当中的类,我们才可以使用这个方法,我们的写法是在代码开头添加

import java.util.Arrays;

这样一个语句。

Arrays就是Java中给我们提供的现成的类。(这些源码是我们安装JDK时当中有个src里面的)

这个类存在在java.util这个包中。需要我们导入这个类,这样我们就可以在当前类中使用Arrays类中已经编译好的方法了。

如何查看导入类中的方法

1.按住Ctrl再点击我们使用的导入的类中的方法,我们就可以进入到这个类中看这个方法的源码是什么,

2.左下角有个structure点击它或者我们按Alt+键盘上方的数字7。在左下角我们就可以看到这样类中的所有的方法了。

查看JDK为我们提供的源码

IDEA左边有一个叫External Libraries文件,点开后我们可以看到我们安装的JDK的本版文件。

 我安装的是JDK1.8。再点开这个1.8文件

 我们看到了这些。而源码的文件在一个叫rt的文件中后缀名是jar。点开后我们就可以看到java,再点开java我们就能看到util这个包。我们导入的包中的类就是在这里啦!

让我们找到我们常用的Arrays这个类

我们发现它的顶行有一个

package

package java.util;

 这样的声明。这个声明的作用是说明当前的(java文件)类在哪一个包里面。package java.util;意思就是当前这个类(文件)在包java中的包util里面。再用;表示结束

3.2import与c语言中include的区别

include  是在预编译时,将那个文件全部导入进来

import   并没有将那个文件全部导入进来,而是用到了这个文件中的哪个方法就去找对应的方法,不用也不会导入进来。

注意事项 : import C++ #include 差别很大 . C++ 必须 #include 来引入其他文件内容 , 但是 Java 不需要 .
import 只是为了写代码的时候更方便 . import 更类似于 C++ namespace using

 3.3 包的静态导入(了解即可)

在import后面加一个static再写出包中的类再

.*   星号是通配符的意思。意思是这个类中所有的方法都可以匹配到。

如下,这样静态导入之后我们就

不用再先写出Math再用点号来引用sqrt方法。相当于将这个方法变成静态。直接用就好了

直接写出方法就可以了,不过这样很少用,了解即可。

 3.4自定义包

注:包名一般是公司域名的倒置。比如www.bat.com,而包名写成com.bat.www。这样写包名实际上我们创建了三个文件夹,我们想在哪个文件里写东西都是可以的。

基本规则
1.在文件的最上方加上一个 package 语句指定该代码在哪个包中 .
2.包名需要尽量指定成唯一的名字 , 通常会用公司的域名的颠倒形式 ( 例如 com.bit.www  ).
3. 包名要和代码路径相匹配. 例如创建 com.bit.www  的包 , 那么会存在一个对应的路径 com/bit/www  来存储 代码.
4.如果一个类没有 package 语句 , 则该类被放到一个默认包中 .
5.包名的所有字母都必须是小写。

 建好之后,我们再建一个Test类,之后就如上图所示。顶上会自动有一个声明。表示这个类存在在哪个包里面。

点击小齿轮,我们可以将点号分开的名字转换成单个的包的形式。

 将Compact Middle Packages的对勾取消掉即可。

就变成了这样

 

当我们打开电脑中Java项目中的文件夹,我们发现我们的包文件名被点号分成了三个文件,我们可以在任意文件也就是包中再去创建类。 (当然也可以在包中再去创建包)

3.5 常见的包

1. java.lang: 系统常用基础类 (String Object), 此包从 JDK1.1 后自动导入。
(lang底下直接的类不需要import导入。)其他都需要导入。
2. java.lang.reflflect:java 反射编程包 ;
3. java.net: 进行网络编程开发包。
4. java.sql: 进行数据库开发的支持包。
5. java.util: java 提供的工具程序包。 ( 集合类等 ) 非常重要
6. java.io:I/O 编程开发包。

以上就是我们将的包中的所有内容了。


总结

1.什么是封装?

对类的成员进行隐藏,通过关键字private,只是对类外提供公开的接口来进行访问。

2.封装的意义?

隐藏类的实现细节,从而达到安全性。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
面向对象编程是一种编程范式,它将程序的构建和设计思路以面向对象的方式进行组织和实现。在Java中,面向对象编程是基于Java SE(Standard Edition)的一种编程方式。第07讲主要介绍了面向对象编程中的一些基本概念和关键术语。 在面向对象编程中,我们将程序中的数据和对数据的操作(方法)封装在一起,形成一个对象对象由两部分构成:属性和方法。属性是用来描述对象的特征,而方法则是对象可以执行的操作。对象之间通过消息(方法调用)进行通信和交互。面向对象的核心思想是通过封装、继承和多态实现程序的复用和扩展。 封装面向对象编程中的一个重要概念,它指的是将类的属性和方法进行封装,使得外部无法直接访问和修改对象的内部状态,只能通过公共的方法来操作属性和执行方法。封装提供了一种将数据和行为组合在一起的方式,可以保护数据的完整性和安全性。 继承是面向对象编程中的另一个重要概念,它指的是通过定义一个新的类来继承现有类的属性和方法。通过继承,子类可以继承父类的属性和方法,并可以在此基础上进行扩展和修改。继承提供了一种代码复用的机制,可以减少重复编码的工作量。 多态是面向对象编程的又一个重要概念,它指的是同一类型的对象在不同的情况下可以有不同的表现形式。多态通过方法的重写和方法的重载实现。方法的重写指的是在子类中重新定义和实现父类的方法,方法的重载指的是在同一个类中可以定义多个同名但参数列表不同的方法。 总结来说,面向对象编程是一种将程序组织和设计思路以对象为中心的编程方式。在JavaSE中,我们可以通过封装、继承和多态来实现面向对象编程的目标。封装可以提高程序的可维护性和可复用性,继承可以减少重复编码的工作量,多态可以灵活地操作对象。掌握这些基本概念和关键术语,可以帮助我们更好地理解和应用面向对象编程的思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祁思妙想

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值