理解Java基本概念----封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Java基本概念----封装相关的知识,希望对你有一定的参考价值。

Java当中的封装

    一:封装的概念

      把对象的属性和操作(或功能)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,主要的体现是隐藏性与代码的重用性。一般情况下我们理解概念是                        不容易理解的,下面我们可以用简单的例子代码和通俗易懂的话来解释上面的概念。其实java当中的类就是一个体现封装的良好的例子,类是抽象的概念集合,表示的是一               个共性的产物,类之中定义的是属性和行为(方法),比如我们一个一个的人,虽然每个个体都是不一样的,比如兴趣,身高,长相,性格等,但是 所有人都会体现出来共               性,比如都有年龄,身高,眼睛,嘴巴,都会吃饭,都会睡觉等等。所以把人的共性抽象出来,形成概念的集合,我们常常定义一个Person类,其实就是这样的。

      二:对概念的理解以及对“隐藏对象的内部细节”与“代码重用性的重点的讲解”

    在理解“隐藏对象的内部细节”的概念时,我们必须要弄懂一个概念,就是访问修饰符的问题:

    Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节访               问控制分为四种级别:

  (1)public: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;

  (2)protected: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问(此处稍后解释),protected重点突出继承;

  (3)default: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默

       认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default                 重点突出包

  (4)private: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。 

访问级别

访问控制修饰符

同类

同包

子类

不同的包

公开

public

受保护

protected

--

默认

没有访问控制修饰符

--

--

私有

private

--

--

--

 

 

  我们看一段代码:

public class StudentBoKe{

//属性
private String name;
private String number;
private int age;

//setter与getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}

//是一个姓名与学号验证的函数
public boolean yangZheng(String name,String number){
if(name.equals("小明")&&number.equals("123")){
return true;
}else{
return false;
}
}

//这个是一个A函数
public void A(){
// 在打印System.out.println("这是一个A函数")之前要进行姓名与学号的验证
yangZheng("A","A");
System.out.println("这是一个A函数");
}

//这个是一个B函数
public void B(){
// 在打印System.out.println("这是一个B函数");之前也要进行姓名与学号的验证
yangZheng("B","B");
System.out.println("这是一个B函数");
}
}
 

    我们看到了上面这个类的age这个属性是private访问修饰符且没有提供setter与getter方法,这就意味着,除了在这个类之内访问这个age属性,其外的地方不可以访问这个age, 其他的两个属性name,number同样使用private修饰,为什么就可以在类以外访问呢,这是因为他们都设置了公开的setter与getter方法,虽然我们不可以在类之外使用:new StudentBoKe().name来访问name属性,但是却可以使用new StudentBoKe().getName()来访问name属性,这就叫使用已经敞开的接口,而private的使用则体现了封装的隐藏性。

 

另一个体现封装的隐藏的一个例子是单例设计模式:

 1 public class Singleton{
 2     //定义一个私有类变量来存放单例,私有的目的是指外部无法直接获取这个变量,而要使用提供的公共方法来获取
 3     private static Singleton singleton = null;
 4     //定义私有构造器,表示只在类内部使用,亦指单例的实例只能在单例类内部创建
 5     private Singleton(){}
 6     //定义一个公共的公开的方法来返回该类的实例
 7     public static Singleton getInstance(){
 8         if(singleton == null){
 9             singleton = new Singleton();
10         }
11         return singleton;
12     }
13 }

  该示例中,我们看到它把有一个构造器都给私有化了(隐藏),所以我们不可能使用new Singleton() 的方式再new出一个实例来,那只能够使用getInstance方法来获得一个实例。

 

    我们学习java的时候,往往听说要把一个功能封装成一个方法,其实这也是封装一个方面的体现,如果上面 代码我们有两个函数,A函数与B函数,在这两个函数最前面有一个需要,就是要进行一个name与number的验证,如果我们把这个验证的功能分别写在A函数与B函数里面,是不是就会这样:

 1     //这个是一个A函数
 2     public void A(){
 3 
 4         if(name.equals("A")&&number.equals("A")){
 5             return true;
 6         }else{
 7             return false;
 8         }
 9 
10         System.out.println("这是一个A函数");
11     }
12 

13 //这个是一个B函数 14 public void B(){ 15 16 if(name.equals("B")&&number.equals("B")){ 17 return true; 18 }else{ 19 return false; 20 } 21 22 System.out.println("这是一个B函数"); 23 }

  这样是不是就会带来两个问题一个是代码的冗余度加大,另一个问题就是降低了代码的可维护性,因为我要修改yanZheng方法,如果它被封装成一个方法,那么在维护的时候,只要在维护这一处就可以了。而如果分别放在A,B两个方法中,那就要维护两个地方。

 

 三:通过上面的描述,我们可以简单的总结出封装的好处

  • 1. 良好的封装能够减少耦合和提高维护性。

  • 2. 可以对成员变量进行更精确的控制。

  • 3. 隐藏信息,实现细节。

    















































以上是关于理解Java基本概念----封装的主要内容,如果未能解决你的问题,请参考以下文章

Java 封装

Java 封装

Java 封装

Java 封装

Java 封装

Java 封装