封装的概念
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
举个简单的例子:我们日常中使用的电脑就是封装计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可
那么在Java中为什么要使用封装呢?
我们在程序设计的过程中要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己来完成,不允许外部干涉,低耦合:就是 仅暴露少量的方法给外部使用
在了解封装之前,先带我们了解一下Java中的访问限定修饰符和包
访问限定修饰符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用
public:可以理解为一个人的外貌特征,谁都可以看得到 default:
对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了 private:只有自己知道,其他人都不知道
protected主要是用在继承中,继承部分详细介绍 default权限指:什么都不写时的默认权限
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
包的概念
为了更好的管理类,把多个类收集在一起成为一组,称为软件包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可
导入包中的类
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());
}
}
更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况
自定义包
基本规则 在文件的最上方加上一个 package 语句指定该代码在哪个包中. 包名需要尽量指定成唯一的名字,
通常会用公司的域名的颠倒形式(例如com.bit.demo1 ) 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包,
那么会存在一个对应的路径 com/bit/demo1 来存储代码. 如果一个类没有 package 语句, 则该类被放到一个默认包中.
常见的包
- java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
- java.lang.reflect:java 反射编程包;
- java.net:进行网络编程开发包。
- java.sql:进行数据库开发的支持包。
- java.util:是java提供的工具程序包。(集合类等) 非常重要
- java.io:I/O编程开发包。
封装属性的访问
public class Student{
private static String name;
private static int age;
}
此时可以看见被private修饰的成员就被封装起来了
class Textstudent{
public static void main(String[] args) {
Student student=new Student();
student.name;
}
}
此时我们通过常规的对象去访问会发现name无法访问会报错,这是因为被封装的成员属性只能在当前类中使用无法被对象使用访问
那我们又该如何去访问被封装起来的成员呢?
通过成员构造方法在创建对象的时候去访问被封装起来的值为被封装起来的成员变量设置值
public class Student{
private static String name;
private static int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static void show(){
System.out.println(name+age);
}
}
class Textstudent{
public static void main(String[] args) {
Student student=new Student("张三",11);
student.show();
}
}
通过系统自带的get和set方法去访问被封装起来的成员变量
public class Student{
private static String name;
private static int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static String getName() {
return name;
}
public static void setName(String name) {
Student.name = name;
}
public static int getAge() {
return age;
}
public static void setAge(int age) {
Student.age = age;
}
}
class Textstudent{
public static void main(String[] args) {
Student student=new Student("张三",11);
student.setName("李四");
student.setAge(11);
System.out.println(student.getName());
System.out.println(student.getAge());
}
}
set和get快速生成的快捷键
封装作用功能
最后总结一下封装的作用
1.提高了程序的安全性,保护数据
2. 隐藏代码的实现细节
3. 统一接口
4. 增强系统的可维护性