• Java_封装


    目录

    1.访问修饰限定符

    2.封装扩展之包

    导入包中的类

    3.自定义包

    4.包的访问权限控制举例 

    5.常见的包

    6.通过构造方法进行初始化

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

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

    1.访问修饰限定符

    比如:

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

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

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

    【说明】 

    1)protected主要是用在继承中;

    2)default权限指:什么都不写时的默认权限;

    3)访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。

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

    2.封装扩展之包

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

    导入包中的类

    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. // 得到一个毫秒级别的时间戳
    5. System.out.println(date.getTime());
    6. }
    7. }

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

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

    如果需要使用 java.util 中的其他类, 可以使用 import java.util.*,但是更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.

    1. import java.util.*;
    2. import java.sql.*;
    3. public class Test {
    4. public static void main(String[] args) {
    5. // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
    6. Date date = new Date();
    7. System.out.println(date.getTime());
    8. }
    9. }
    10. // 编译出错
    11. //Error:(5, 9) java: 对Date的引用不明确
    12. // java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

    在这种情况下需要使用完整的类名:

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

    3.自定义包

    基本规则

    1.在文件的最上方加上一个 package 语句指定该代码在哪个包中.

    2.包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).

    3.包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径com/bit/demo1 来存储代码.

    4.如果一个类没有 package 语句, 则该类被放到一个默认包中.

    操作步骤:

    1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包

     2. 在弹出的对话框中输入包名, 例如 com.baidu.www

     可以把这个勾去掉;

     3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可

     4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

    5. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句

    4.包的访问权限控制举例 

    Computer类位于com.baidu.demo1包中,TestComputer位置com.baidu.demo2包中:

    1. package com.baidu.demo1;
    2. public class Computer {
    3. private String cpu; // cpu
    4. private String memory; // 内存
    5. public String screen; // 屏幕
    6. String brand; // 品牌
    7. public Computer(String brand, String cpu, String memory, String screen) {
    8. this.brand = brand;
    9. this.cpu = cpu;
    10. this.memory = memory;
    11. this.screen = screen;
    12. }
    13. public void Boot(){
    14. System.out.println("开机~~~");
    15. }
    16. public void PowerOff(){
    17. System.out.println("关机~~~");
    18. }
    19. public void SurfInternet(){
    20. System.out.println("上网~~~");
    21. }
    22. }
    23. ///
    24. package com.baidu.demo2;
    25. import com.baidu.demo1.Computer;
    26. public class TestComputer {
    27. public static void main(String[] args) {
    28. Computer p = new Computer("HW", "i7", "8G", "13*14");
    29. System.out.println(p.screen);
    30. // System.out.println(p.cpu); // 报错:cup是私有的,不允许被其他类访问
    31. // System.out.println(p.brand); // 报错:brand是default,不允许被其他包中的类访问
    32. }
    33. }
    34. // 注意:如果去掉Computer类之前的public修饰符,代码也会编译失败

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

    6.通过构造方法进行初始化

    1. class Person {
    2. private String name;
    3. private int age;
    4. //被private修饰,只能在当前类使用!!!
    5. private void eat() {
    6. System.out.println("吃饭!");
    7. }
    8. public void show() {
    9. System.out.println(name + " " + age);
    10. }
    11. }
    12. public class test {
    13. public static void main(String[] args) {
    14. Person person = new Person();
    15. }
    16. }

    因为name和age只能在当前类的使用,故可以通过构造方法对其进行初始化!

    1. class Person {
    2. private String name;
    3. private int age;
    4. //被private修饰,只能在当前类使用!!!
    5. public Person(String name, int age) {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. public String getName() {
    10. return this.name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;//通过这个方法进行修改
    14. }
    15. private void eat() {
    16. System.out.println("吃饭!");
    17. }
    18. public void show() {
    19. System.out.println(name + " " + age);
    20. }
    21. }
    22. public class test {
    23. public static void main(String[] args) {
    24. Person person = new Person("zhangsan",11);
    25. person.show();
    26. //如果要修改名字,因为name是private修饰的,所以不能在类test直接修改
    27. //所以需要提供其他方法进行修改
    28. person.setName("lisi");
    29. person.show();
    30. }
    31. }

     

  • 相关阅读:
    Auto.js Pro 编写第一个脚本hello world
    Jackson ImmunoResearch免疫球蛋白类分析方案
    Sql Server系列:子查询
    【从零学Python_1.5】自定义函数和类
    Qt中的Resource
    【C语言】预处理超级详细解析
    C++入门 第二篇( 引用、内联函数、auto关键字、指针空值nullptr)
    好看的风筝
    如何使用websocket+node.js实现pc后台与小程序端实时通信
    在国内企业做数据治理,建议您考个DAMA-CDGA/CDGP证书
  • 原文地址:https://blog.csdn.net/m0_68071216/article/details/127857142