类和对象(两万字超详解析)(三)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 类和对象(两万字超详解析)

6.3 封装扩展之包


6.3.1 包的概念


在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件

下,也可以对某个文件夹下的音乐进行更详细的分类。

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。


6.3.2 导入包中的类


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.*;     //不是把util包中所有的类都导进来,而是随用随取,用到哪个类就导哪个类进来
public class Test {     
  public static void main(String[] args) {
  Date date = new Date();
  // 得到一个毫秒级别的时间戳
  System.out.println(date.getTime());
  }
}


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

比如:


import java.util.*;
import java.sql.*;
public class Test {
  public static void main(String[] args) {
  // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
  Date date = new Date();
  System.out.println(date.getTime());
  }
} // 编译出错


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


import java.util.*;
import java.sql.*;
public class Test {
  public static void main(String[] args) {
  java.util.Date date = new java.util.Date();  //具体说明
  System.out.println(date.getTime());
  }
}


可以使用import static导入包中静态的方法和字段。(不建议这样写,旁门左道)


import static java.lang.Math.*;  //导入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);
  }
}


注意事项: import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要.

import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using


6.3.3 自定义包


基本规则


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


操作步骤


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


dcb20bf926ce478fba80ed1be6d515e5.png


  1. 在弹出的对话框中输入包名, 例如 com.baidu.demo1
  2. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可.


77853b89e26447f7913cc21a6eba349e.png


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


d80ac5abfcaa4272a543da816e5a9b46.png


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


95c4bdeb5f56480b9b4b94ce952d8020.png


6.3.4 包的访问权限控制举例


如下两段代码分别在两个包中:Computer类位于com.baidu.demo1包中,TestComputer位置com.baidu.demo2包中:


package com.baidu.demo1;
class Computer {
    private String cpu; // cpu
    private String memory; // 内存
    public String screen; // 屏幕
    String brand; // 品牌
    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("上网~~~");
    }
}


package com.baidu.demo2;
import com.baidu.demo1.Computer;
public class TestComputer {
    public static void main(String[] args) {
        Computer p = new Computer("HW", "i7", "8G", "13*14");
        System.out.println(p.screen);
// System.out.println(p.cpu); // 报错:cpu是私有的,不允许被其他类访问
// System.out.println(p.brand); // 报错:brand是default,不允许被其他包中的类访问
    }
}


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


7. static成员


7.1 再谈学生类


使用前文中介绍的学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别,年龄,学分绩点等成员信息,这些信息就是对不同学生来进行描述的,如下所示:


public class Student{
  public String name;
    public String gender;
    public int age;
    public double score;
    public Student(String name,String gender,int age,double score) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }
  public static void main(String[] args) {
  Student s1 = new Student("Li leilei", "男", 18, 3.8);
  Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
  Student s3 = new Student("Jim", "男", 18, 2.6);
  }
}


f907c099bf4046b0995b68e14439fff0.png

假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。

之前在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),因为需要使用这些信息来描述具体的学生。而现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所

有的学生来共享。此时我们可以定义一个静态成员。


在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。


7.2 static修饰成员变量


static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。


【静态成员变量特性】


  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
public class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    public static String classRoom = "Bit306";
    public Student(String name,String gender,int age,double score) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.score = score;
    }
    public static void main(String[] args) {
// 静态成员变量可以直接通过类名访问
        System.out.println(Student.classRoom);  //通过类名直接访问
        Student s1 = new Student("Li leilei", "男", 18, 3.8);
        Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
        Student s3 = new Student("Jim", "男", 18, 2.6);
// 也可以通过对象访问:但是classRoom是三个对象共享的
        System.out.println(s1.classRoom);
        System.out.println(s2.classRoom);
        System.out.println(s3.classRoom);
    }
}

1781403518234f0bb08ec5224d326eda.png


相关文章
|
17天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
数据可视化 数据挖掘 BI
团队管理者必读:高效看板类协同软件的功能解析
在现代职场中,团队协作的效率直接影响项目成败。看板类协同软件通过可视化界面,帮助团队清晰规划任务、追踪进度,提高协作效率。本文介绍看板类软件的优势,并推荐五款优质工具:板栗看板、Trello、Monday.com、ClickUp 和 Asana,助力团队实现高效管理。
87 2
|
3天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
17 5
|
13天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
60 12
|
5天前
|
机器学习/深度学习 人工智能 监控
鸿蒙赋能智慧物流:AI类目标签技术深度解析与实践
在数字化浪潮下,物流行业面临变革,传统模式的局限性凸显。AI技术为物流转型升级注入动力。本文聚焦HarmonyOS NEXT API 12及以上版本,探讨如何利用AI类目标签技术提升智慧物流效率、准确性和成本控制。通过高效数据处理、实时监控和动态调整,AI技术显著优于传统方式。鸿蒙系统的分布式软总线技术和隐私保护机制为智慧物流提供了坚实基础。从仓储管理到运输监控再到配送优化,AI类目标签技术助力物流全流程智能化,提高客户满意度并降低成本。开发者可借助深度学习框架和鸿蒙系统特性,开发创新应用,推动物流行业智能化升级。
|
17天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
17天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
5月前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
103 3
|
4月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
141 2

热门文章

最新文章

推荐镜像

更多