Java基础语法 三大特性之一——封装

学习Java最重要的一点就是理解Java的面向对象思想,面向对象的三大特征包括了:

  • 封装:封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

  • 继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  • 多态:多态是同一个行为具有多个不同表现形式或形态的能力。

上面的表述是官方的解释,看起来非常的生硬,对于没有基础的同学来说理解会比较吃力,下面我将用举例的方式为大家介绍这三大特性,今天先说说三大特征之一的封装。

封装是一个面向对象的术语,其含义其实很简单,就是把东西包装起来。其实成员变量和成员方法的定义都是包装于类定义之中的,类的定义可以看成是将构成类的成员变量和方法封装起来,这就是最宏观的封装。

首先我们需要知道为什么在Java开发的过程中需要封装?举个例子,人类的正常年龄不会超过200岁,但是我们在定义类的时候,如果可以直接修改类中的字段那么就可能会出现以下的情况,age可以设置成1000,这合理吗?这不合理,于是就引出了封装这个概念。

讨论到封装性,我们需要先回忆一下之前说到的访问权限修饰符,正是因为它们的存在才有了封装性:其中,private是只允许自己这个类访问,其他的类都是不可见的;public就是都可见的意思。详细的解释可以参考之前的文章Java基础语法 四种访问权限修饰符详细通俗的解释

在使用private修饰成员变量的时候,这个变量就相当于被封装了,因为private是私有的,不能被外界(其他类)访问。就好比我们把一个类比作是一个箱子,里面包括了很多成员变量和方法;private修饰的成员变量就只能自己这个箱子里面可见,并且可以访问修改,但是对于其他的类(箱子)就是不可见的,这就相当于完成了封装性。

下面我用代码的实际例子给大家说明一下:

  1. 修改属性的可见性来限制对属性的访问(一般限制为private)

    public class Person {
          
          
        private String name;//私有属性
        private int age;//私有属性
    }
    

    这段代码中,我把 nameage 属性设置为私有的,只能本类才能访问,其他类都访问不了,这样就对信息进行了隐藏。

  2. 对每个值属性提供对外的公共方法访问,也就是创建一对读写方法,用于对私有属性的访问

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;
    }
}

采用 this 关键字是为了解决实例变量局部变量之间发生的同名冲突。以上代码中public方法是外部类访问该类成员变量的入口。

通常情况下,这些方法被称为getter和setter方法。

  1. 任何要访问类中私有成员变量的类都要通过这些getter和setter方法

    public class Test{
          
          
       public static void main(String args[]){
          
          
          Person person = new Person();
          person.setName("James");
          person.setAge(20);
     
          System.out.print("Name : " + person.getName()+ " Age : "+ person.getAge());
        }
    }
    

    运行结果是:

    Name : James Age : 20
    
  2. 除了setter方法可以对封装的属性进行赋值以外,还能通过构造方法对封装方法进行赋值

    //实体类
    public class Person {
          
          
        private String name;//私有属性
        private int age;//私有属性
        //无参构造
        public Test02() {
          
          
        }
    	//有参构造
        public Test02(String name, int age) {
          
          
            this.name = name;
            this.age = age;
        }
    	//重写toString方法,方便调试
        @Override
        public String toString() {
          
          
            return "Test02{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    //测试类
    public class Test{
          
          
       public static void main(String args[]){
          
          
          Person person = new Person("zhangsan",20);
     
          System.out.print(person.toString());
        }
    }
    

    运行结果:

    person{
          
          name='zhangsan', age=20}
    

通过上面的例子,我们知道了封装有两个含义:把该隐藏的隐藏起来,把该暴露的暴露出来

  • 把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问
  • 把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作

封装的另外一个好处就是:避免错误提高代码的健壮性,怎么体现呢?还记得我上面说的例子吗,人类的年龄一般不会超过200岁,下面我用代码来实现这个例子:

public class Person{
    
    
    private String name;//私有属性
    private int age;//私有属性
	//给私有成员创建可写属性
    public void setAge(int age) {
    
    
        if (age<200){
    
    
            this.age = age;
        }else{
    
    
            System.out.println("你是忍者神龟吗?");
        }
    }
	//给私有成员创建可读属性
    public int getAge() {
    
    
        return age;
    }
}

public class Test{
    
    
   public static void main(String args[]){
    
    
      Person person = new Person();
      person.setAge(2000);
 
      System.out.print(test02.getAge());
    }
}

运行结果:

你是忍者神龟吗?
0

我们可以在实现封装的时候,为外界提供访问接口,然后在接口中加一些合理的条件,这样就可以保证代码的合理性和正确性。

猜你喜欢

转载自blog.csdn.net/liulei952413829/article/details/114697037
今日推荐