对于Java ,想必在刚接触到Java的时候,大家都已经听过:Java主要是用来面向对象的,而面向对象有三大特性:封装继承,多态,今日所讲述的主要就是:封装!!
对于封装,我们首先需要知道的是:什么是封装??封装有什么意义呢??弄懂了这俩,那么封装你就学习的差不多了!!
对于封装的简单来说就是:套 壳屏蔽细节!!
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互!!把类的实现细节进行了隐藏,对外只提供一些交互的接口就可以!!
下面就在Java中使用的四种访问修饰限定符来安排一波:
下面就private进行简单讲解一下:提示,下面是错误的用法讲解!!!
class Student { private String name ; public int age ; public void shou() { System.out.println("姓名: "+name); } } public class Main { public static void main(String[] args) { Student student = new Student(); student.name = "小灶" ; //错误用法!! } }
在类Student中定义的: private String name ; 只能在当前类中才能使用!!否则,将会报错!!
因此,对private 修饰的,只能在当前类使用!
public :可以理解为:一个人的外貌特征,谁都可以看得到!
default (默认权限):对于自己家族中(同一包中)不是什么秘密,对于其他人来说,就是隐私了!
private : 只有自己知道,其他都不知道!
注意:一般情况下:成员变量设置为:private
成员方法设置为:public
封装拓展之包!
在Java中引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可。
在IDEA中自定义包的用法!
1.右键点击src ——》new ——》Package
2.点击Package ,一般采用倒序命名方法!!(com.shandong.www)
通过下面图示操作,就可以对创建好的包的显示情况进行调整!!
笔者就不再进行演示!!
封装之:private 只能在当前类中使用!
下面就案列讲解一下(错误用法)!!
class Person { private String name ; private int age ; private void eat() { System.out.println("吃饭!"); } public void shou() { System.out.println("姓名: "+name); } } public class Main { public static void main(String[] args) { Person person = new Person() ; person.name = "changjiang ";//错误用法!! person.eat();//错误用法! } }
在上述的代码中,name , age ,eat 这些成员已经被封装起来了!!只能在当前类当中使用!
使用private 关键字进行了封装时,name 的权限就变小了,他只能在当前类才能访问!!
因此,我们可以通过构造方法来读上述代码中,封装好的name ,age ,eat 进行赋值!!
构造方法包含:不带参数的构造方法,带有参数的构造方法!而IDEA可以帮我们自动生成构造方法!!鼠标右键,——》Generate ——》 Constructor ——》 选择想要构造的方法(摁住CTRL键,可以多选) 点击OK,然后就能生成带参数的构造方法了!!
然后生成的构造方法为:
public Person(String name, int age) { this.name = name; this.age = age; }
因此,上述的总代码为:(正确代码)
class Person { private String name ; private int age ; private void eat() { System.out.println("吃饭!"); } public void show() { System.out.println("姓名: "+name +" 年龄 "+age+" 正在吃饭!"); } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person person = new Person("changjiang ",20) ; person.show(); } }
上述代码的运行结果为:
但是,疑问又来了:在上述的代码中,如果我想更改传过去以后的姓名,该如何操作??
需要getter 和setter 这两个方法!!
public String getName() { return name; } public void setName(String name) { this.name = name; }
因为private不能直接访问,则通过getName和setName 来对那些封装(private)的数据来进行交互!!
更改后的代码为:
class Person { private String name ; private int age ; private void eat() { System.out.println("吃饭!"); } public void show() { System.out.println("姓名: "+name +" 年龄 "+age+" 正在吃饭!"); } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Main { public static void main(String[] args) { Person person = new Person("changjiang ",20) ; person.show(); System.out.println("=========="); //相当于分隔符 person.setName("小金鑫"); person.show(); } }
上述代码的运行结果为:
但是,上面内容仅仅更改一个,当我们想更改多个数据的时候,IDEA就可以帮助我们进行写!!右键——》Generate ——》Getter and Setter …………然后就会帮我们自动生成!!
上面单独的Getter Setter会生成单独的对应方法!!(自行尝试!)
因此,总的来说:封装:对类的内部的细节进行了隐藏,但同时提供了相对应的公开的接口,供用户和数据进行交互!!