封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。
使用封装有四大好处:
1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。
java封装信息有四种访问权限
包访问权限,public,protected和private.注意:类的访问权限仅仅只有两种,默认访问权限和public.平时所说的四种访问权限主要是针对它内部的成员变量和成员方法。一个类内部的成员不管是private,protected都可以相互直接访问。四种访问权限通常是指通过该类对象对该类成员进行访问的权限。因为程序对外提供的接口就是对象。通过对象类实施具体操作。如:该成员变量或方法具有包访问权限是指该类的对象可以在包内随意访问它(成员变量/成员方法)
public>protected>包访问权限>private
1、public
是指该类的对象可以在任何地方都可以访问到该类具有public的成员变量或方法。要保证方法和变量能够挎包访问,则首先得保证类能够跨包创建对象,即类首先是public.当然首先这个类也应当是public,否则在不同包中还是不能访问,因为首先这个类就不能创建对象,即使import也不行。如果这个类是默认权限,即使类的成员变量或方法是public,它也不能在包外进行访问,仅仅在包内进行访问。
package jin.feng1; public class Cookie2 //此类必须是public否则类不能挎包访问 { public int i; public Cookie2(int i){this.i=i;} public void print(){ System.out.println("i:"+this.i); } } package jin.feng2; import jin.feng1.Cookie2; public class Access { public static void main(String[] args) { Cookie2 cie2=new Cookie2(3); cie2.print(); } }
2、protected
如果创建了一个新包,并自另一个包中继承类,那么唯一可以访问的成员就是源包的public成员,有时类的创建者希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类。这就需要protected.protected也提供包访问权限。
protected有两种访问方式,一是通过对象访问,二是通过在一个派生类内部直接访问基类内部的成员。
为什么之前的仅仅通过对象进行访问,因为两个类没有建立关系。
package jin.feng1; public class Cookie2 { protected int i; public Cookie2(int i){this.i=i;} protected void print(){//包访问权限 System.out.println("i:"+this.i); } } package jin.feng2; import jin.feng1.Cookie2; public class Access extends Cookie2 { public Access(){ //如果基类的构造函数带参数,则派生类必须显示声明构造函数。 super(3); print(); //类内部直接访问,派生类直接访问 } public static void main(String[] args) { //Cook1 cook1=new Cook1(1, 2); Access asAccess=new Access(); asAccess.i=9; //通过对象访问。 asAccess.print(); } }
3、包内访问权限(默认访问权限,不写):
该成员变量或方法具有包访问权限是指该类的对象可以在包内随意访问它(成员变量/成员方法)
包内访问权限
class Cook1{ int i;//包访问权限 int j;//包访问权限 public Cook1(int i,int j){ this.i=i; this.j=j;} void print(){//包访问权限 System.out.println("i:"+this.i+" j:"+this.j); } } public class Access { public static void main(String[] args) { Cook1 cook1=new Cook1(1, 2); cook1.print();//该类的对象可以在包内访问具有包访问权限的成员变量/方法 cook1.i=9;//该类的对象可以在包内访问具有包访问权限的成员变量/方法 cook1.print(); } }
4、private
通过该类对象不能访问该类具有private成员。
class Cook1{ private int i; int j; public Cook1(int i,int j){ this.i=i; this.j=j;} private void print(){ System.out.println("i:"+this.i+" j:"+this.j); } } public class Access { public static void main(String[] args) { Cook1 cook1=new Cook1(1, 2); cook1.print();//出错,不可访问私有成员方法 cook1.i=9;//出错,该类对象不可访问私有成员变量 cook1.j=10;