封装
封装(Encapsulation)是面向对象的基本特征之一。 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。
- 封装的简单例子:
public class Man{
private String name;
private int age;
private Woman wife;}
方法封装
public void setWife(Woman wife)
{this.wife = wife;}
- 封装的作用
1.对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
2.对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
- 实现封装
1.将不能暴露的成员隐藏起来,例如Customer类中的age,不能让其在类的外部被直接赋值。实现方法是将该成员定义为私有的,在成员定义前加上修饰符private。
2.用公共方法来暴露对该隐藏成员的访问,可以给函数加上修饰符public,将该方法定义为公共的。
- 注意:
1.私有成员只能在定义它的类的内部被访问,在类的外部不能被访问。
2.一般情况下,可以讲成员变量定义为private的,通过public函数对其进行访问。例如要给一个成员赋值,可以使用setter函数;要获得该变脸的值,可以使用getter函数。
3.private和public都是访问区分符。
- 封装的主要功能:
可以修改自己的实现代码,而不需要修改调用代码的程序片段。
适当的封装可以使代码更容易理解和维护,并增强代码的安全性。
- 封装的优点:
- 良好的包装可以减少耦合。
- 类的内部结构可以自由修改。
- 可以更精确地控制成员变量。
- 隐藏信息和实现细节。
- 如何实现封装
- 私有化成员变量,使用private关键字修饰;
public class Person {
private String name;
private int age;
}
2.提供公有的get和set方法,在方法体中进行合理值的判断,使用public关键字修饰;
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
3.在构造方法中使用set方法进行合理值的判断;
- Java的封装作用
- 提高了程序的安全性,保护数据
2. 隐藏代码的实现细节
3. 统一接口
4. 增强系统的可维护性
- This关键字是什么意思?
有时一个方法需要引用调用它的对象。为此,Java定义了this这个关键字。简单地说,this是在对象内部指代自身的引用。可以直接引用对象,可以解决实例变量和局部变量之间发生的任何同名的冲突。
- 什么是构造方法,实现封装的具体方法?
构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值。
构造方法的语法规则:方法名与类名相同,没有返回类型。
使用new关键字实例化对象的过程实际上就是调用构造方法的过程。或者说实例化一个对象实际上就是去调用这个对象的构造方法。
Xin xin = new Xin();
在实例化对象的时候,已经实例变量赋予了初始值,完成了对象的初始化工作。
- 为什么需要构造方法?
为属性赋值时,很容易忘记对其中的一项或多项进行赋值。构造方法可以简化对象初始化,为实例变量赋值。
- 带参数的构造方法:可以显示地为实例变量赋予初始值。在不同的条件下创建不同的对象,这些对象的实例变量具有不同的值。
注意:在使用带参数的构造方法实例化对象时,传递的值和构造方法的参数应当在个数,次序和数据类型上相互配备。
通过调用带参数的构造方法,在创建对象时,一并完成了对象的初始化工作,简化了对象初始化的代码。
- 什么是方法重载?
方法名称相同,参数项不相同。那么认为一个方法是另一个方法的重载方法。
注意:重载只跟参数有关,与返回类型无关。方法名和参数相同而返回类型不同,不能说是重载。
典型的方法重载:
System.out.println();System.out代表了一个Java。PrintSteam对象,具有多个pringtln(打印)方法,该方法可以接收不同类型的数据作为参数根据类型不同。
调用不同的打印方法:
在Java.lang包中的Math类中的max方法
Public static int max(int a;int b);
Public static int max(long a,long b);
Public static int max(float a,float b);
Public static int max(double a,double b);
在调用方法之前,Java虚拟机先判断给定的类型,然后决定到底调用执行那个max()方法。
- 封装的意义:
- 封装可以提高程序的安全性
- 隐藏代码的实现细节性
- 可以统一接口
- 系统的可维护性增加
包
- 认识包
编写好的代码,所有的类都在一个java.文件中,可能会使文件特别臃肿。在实际操作中,最好将类写在单独的文件中。当系统庞大之后,类的个数很多,功能也分门别类,可以从操作系统管理文件的方法中得到启发。在操作系统中可能存在大量文件,将文件用文件夹进行管理。在java中使用类似的方法管理类,这就是包(Package)。
方法很简单,只要在类的定义文件头上加“package包名;”即可。也可以在Eclipse中快速建立一个包,将类放在包中,输入包的名称,单击Finish按钮即可。
Package chinasei;
Class Customer;
String name;
String sex;
Private int age;
Public void setAge(int age){
If(age<0||age>100)
System.out.println(“age无法赋值”);
Return;
}
This.age=age;
}
Public int getAge(){
Return this.age;
}
}
注意:
- 在源代码中,“package chinasei;”表示该源文件中的所有类都位于包chinasei中。package语句必须在源文件的最前面,也可以不指定package语句,相当于将类放在默认包中,不过指定包,使用更加方便,可靠。
- 在Java中,推荐包名字的字母小写,例如“chinasei”,为了便于阅读,有时候还用“,”隔开,例如“school”“school.stu”等/
- 在将类放入某个包中之后,包将会用专门的文件夹来表示,例如上面的Customer类,编译出来的。
- 如果要用命令行来运行某个包中的类,必须首先到达包目录所在的上一级目录。
- 使用命令行编译一个,java文件,在默认的情况下不会生成相应目录。
- 编写一个类,编译成class.文件之后任意放在一个目录下,这并不等于就将该类放在包中。包名必须在源代码中,通过package语句指定,而不是靠目录结构来确定。
- 访问包中的类
- 在同一个包中直接用类名来访问,不用指定类所在的包
- 两个类不在同一个包中的情况
在chinasei包中建立一个TeacherTest类,并在其中使用school.admin包中的Teacher类。
注意:
- private类型的成员只能在定义它的类的内部被访问。
- default类型的成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问。
- protected类型的成员可以在定义它的类的内部被访问,也可以被这个包中的其他类访问,还可以被包外的子类访问。
- public类型的成员可以在定义它的类的内部被访问,也可以被包内,包外的所有其他类访问。
- 很明显,从开放的程度上讲:private



