类的封装:将东西包在一起,然后以新的完整形式呈现出来,将方法和字段一起包装到一个单元中,单元以类的形式实现。类别C语言就是封装就是以结构体的形式实现,字段相当于是int型、char型等数据;方法相当于是结构体内的函数指针(或者函数)。所以将数据和方法包装进类中,加上具体实现的隐藏(访问修饰符),共同被称为封装类,其结果是一个同时带有特征和行为的数据类型。即:定义类,定义其属性、方法的过程称为封装类。
访问修饰符:信息隐藏,隐藏对象的实现细节,不让外部直接访问到。信息隐藏是00P最重要的功能之一,也是访问修饰符的原因。信息隐藏的原因包括:
(1)对模块的任何实现细节所作的的更改不会影响该模块的代码
(2)防止用户意外修改数据,使模块易于维护和使用
访问修饰符包含4种:private、protected、public、默认。
public:该类或非该类均可以访问
private:只有该类可以访问
protected:该类及其子类的成员可以访问,同一个包中的类也可以访问
默认:同一包中的类可以访问
3.1属性封装的实现:修改属性的可见性来限制对属性的访问。
代码实例:
- class Student{
- private int age;
- String name;
- double score;
- private int sex;
-
- private void myAge(int myage){
- age = myage;
- }
- public int getAge(){
- myAge(24);
- return age;
- }
- public void setAge(int realage){
- age = realage;
- }
- public void setSex(int finalsex){
- sex = finalsex;
- }
- public int getSex(){
- return sex;
- }
- void introduce(){ //方法=函数
- System.out.println("sex:"+sex+", name:"+name+", age:"+age+", score:"+score);
- }
- void testFunc(){
- System.out.println("testFunc");
- }
-
-
- }
- public class Demo1 {
- public static void main(String[] args) {
- Student stu1 = new Student(); //需先实例化一个对象,即开辟空间
- //类=模板,且不能直接使用,不能直接访问变量,先实例化开辟一个空间
- /*类似于:
- * struct Student *p;
- * p = malloc(sizeof(struct Student)); 给指针开辟空间
- */
- //stu1.age = 24;
- //stu1.sex = 1; 因为sex属性修饰词为private,同一个包的类是没有直接访问权限的
- stu1.name = "kk";
- stu1.score = 99.6;
-
- stu1.setSex(1);
- stu1.setAge(36);
- stu1.getAge();
- stu1.introduce();
- stu1.testFunc();
- System.out.println("sex="+stu1.getSex());
- }
- }
由于类成员age前是private修饰的,所以main函数中类实例化后是无法对其进行访问修改操作的,除非将private修改为public或者删除它。
3.2方法的封装
目的:隐藏方法实现细节(方法体),向外部提供公开接口(方法头),以供安全调用简化调用,方便修改维护。根据需要,可以私有化方法,以供内部使用。
在上述实例中,getAge()中调用私有方法myAge(int myage)来修改年龄。
3.3封装之构造方法
UML类图:又称统一建模语言,类的命名尽量应用领域中的术语。应明确、无歧义,以利于相互交流和理解。类的属性,操作中的可见性使用+、#、-分别表示public、protected、private。
类的构造方法的概念和作用:
(1)构造方法负责对象的初始化工作,为对象的属性赋合适的初始值。
(2)创建对象时,其类的构造方法确保在用户操作对象之前,系统保证初始化的进行
构造方法的语法规则:
(1)构造方法与类名一致
(2)没有返回类型(注意不是void类型,而是去掉它)
(3)方法实现主要为字段赋初值
构造方法的调用:比较特别--->>:new 操作符(实例化对象时,自动被调用),Java系统保证每个类都有构造方法。
构造方法实例:
- class Student
- {
- private int age;
- String name;
- double score;
-
- Student(){ //java语言中,方法(没有返回值)是可重载的,函数名即Student可以一样,但是参数列表不同,这在C语言中确是不允许的
- System.out.println("构造方法1被调用");
- }
-
- Student(int newage, String newname){
- System.out.println("构造方法2被调用");
- age = newage;
- name = newname;
- }
- Student(int newage, String newname, double newscore){
- System.out.println("构造方法3被调用");
- age = newage;
- name = newname;
- score = newscore;
- }
-
- void introduce(){ //方法=函数
- System.out.println("name:"+name+", age:"+age+", score:"+score);
- }
- }
- public class Demo2 {
- public static void main(String[] args) {
- Student stu1 = new Student();
- Student stu2 = new Student(24, "xiaoshimei");
- Student stu3 = new Student(24, "kobe", 89.0);
- stu3.introduce();
-
- }
- }