目录
引入:
封装的概念:
访问限定符:
正确的使用封装:
封装扩展之包:
导入包中的类:
import导入包:
import static导入包中静态的方法和字段:
自定义包:
创建步骤:
使用包的好处:
常见的包:
结语:
JAVA是面向对象的编程语言,面向对象程序三大特征封装,继承,多态。本文章主要介绍封装。所谓封装就是套壳屏蔽细节。
我们现实生活中处处都用到了封装的思想例如一台计算机的主机不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机,关机即可。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
No | 范围 | private | default | protected | public |
1 | 同一包中的同一类 | ✔ | ✔ | ✔ | ✔ |
2 | 同一包中的不同类 | ✔ | ✔ | ✔ | |
3 | 不同包中的子类 | ✔ | ✔ | ||
4 | 不同包中的非子类 | ✔ |
说明 :
1.protected主要是用在继承中。
2.default权限指:什么都不写时的默认权限。
3.访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。
测试:
测试代码如下:
Computer类
用private封装了cpu和memory,前面没有修饰符的是default类型。下面的public Computer构造方法。
public class Computer {
private String cpu;
private String memory;
String brand;
public Computer(String cpu,String memory,String brand){
this.cpu = cpu;
this.memory = memory;
this.brand = brand;
}
public void setCpu(String cpu){
this.cpu = cpu;
}
public String getCpu(){
return this.cpu;
}
public void setMemory(String memory){
this.memory = memory;
}
public String getMemory(){
return this.memory;
}
public void open(){
System.out.println("开机---");
}
public void close(){
System.out.println("关机---");
}
}
TestComputer类
利用new新创建一个p的对象,根据构造方法的设置参数传递参数初始化。
public class TestComputer {
public static void main(String[] args){
Computer p = new Computer("cpu","30","lianxian");
System.out.println(p.brand);
p.open();
System.out.println(p.getCpu());
p.setCpu("hehe");
System.out.println(p.getCpu());
}
}
我们可以看到:
在private修饰符后的变量它的范围只能是同一包中的同一类,否则就像下面这个一样会报错。
在类中一般情况下成员变量设置为private,成员方法设置成public,通过成员方法来修改成员变量,不能直接拿到成员变量,必须要通过成员方法这样就是实现了封装,一定注意封装不是意味着不可改变,而是指定改变的路径。这样可以大大的增加代码的安全性。
如:下面这样。
修改cpu和memory成员变量只能通过构造方法,和下面public修饰的get和set函数来修改和设置变量。
下面就是在TestComputer类中的测试,为了简单要把这两个类放在同一个包下。
概念:
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可 。
import java.util.Scanner; /** * Created with IntelliJ IDEA. * Description: * Date: 2024-01-31 * Time: 11:41 */ public class Test2 { public static void main(String[] args){ Scanner in = new Scanner(System.in); int a = in.nextInt(); System.out.println(a); in.close(); } }
如果需要使用 java.util 中的其他类, 可以使用 import java.util.*
但是我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况。
例如:Data类
下面这样是可以的Java.util.中有Data类
但是加上import java.sql.*;就不可以了这是因为sql和util中都有Data类型,编译器不知道要哪一个所以报错了,如果我们指名道姓要哪一个包中的类,那么这种错误就不会发生了。
例如:
import static java.lang.Math.*;
public class Test2 {
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。
基本规则:
(1)在文件的最上方加上一个 package 语句指定该代码在哪个包中.
(2)包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.hxl.www).
(3)包名要和代码路径相匹配. 例如创建com.hxl.www的包,那么会存在一个对应的路径com/hxl/www来存储代码.
(4)如果一个类没有 package 语句, 则该类被放到一个默认包中.
声明:本操作是在IDEA2021上进行。
1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包。
2. 在弹出的对话框中输入包名。
3.在我们的磁盘上会变成这样
4.最后会变成这样,那么你的包就创建好啦。
如果创建后的包变成这样:
不用担心,步骤是没有错误的只是IDEA没有设置好。设置如下:
5. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句
创建完包后我们就可以在包上运行我们的代码。
在Computer上
package com.hxl.www;
在TestComputer上
package com.hxl.www; import com.hxl.www.Computer;
这样就完成了包的使用。
可以更好的管理类,把多个类收集在一起成为一组使代码一目了然。在不同包类可以重名这可以解决命名问题,命名本来就是让人头疼的事情。包还是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。
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编程开发包。
其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。