-
该露的漏,该藏的藏
-
我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。(例如电视与遥控器)
-
-
封装(数据的隐藏)
-
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这成为信息隐藏
-
-
记住这句话就够了:属性私有,get/set
两个类一个为含有main方法的Application主类主要用于调用其它方法类以及完成main()方法
package com.oop; import com.oop.Demo04.Student; /* 封装的意义 1.提高程序的安全性,保护数据(由于private只能通过set/get方法来改变但set又可以增加安全性判断) 2.隐藏代码的实现细节(用户只需要调用方法不用知道如何实现) 3.统一接口(get/set)形成了规范 4.系统的可维护性增加了 */ public class Application { public static void main(String[] args) { Student s1 = new Student(); //s1.name;此时此属性已经私有无法被调用使用但可以通过get方法使用 String name =s1.getName(); s1.setName("秦疆"); //判断一个类的两个方法是否相同:只要方法名与参数列表一致两个方法即为同一个方法 System.out.println(s1.getName()); s1.setAge(-1);//此时数据是不合法的(人年龄不可能999) System.out.println(s1.getAge()); } }
另一个类是与另一包内定义的Student类。
package com.oop.Demo04; //学生类 private:私有 //封装就是通过private令外部不可以直接访问,通过内部方法set/get(为一般命名方式也可以不用此方法)访问调了一个接口 public class Student { //属性私有 private String name;//名字 private int id;//学号 private char sex;//性别 private int age;//年龄 //方法与封装基本无用! 学习()方法 睡觉() //可以提供一些可以操作这些属性的方法 //提供一些public的 get/set方法 //get 获得这个数据或属性 public String getName(){ return this.name; } //set 给这个数据设置值 public void setName(String name){ this.name=name; } //快捷键:Alt+insert自动生成get/set方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) {//封装作用:避免不合法数据破坏系统 if(age>120||age<0){//不合法的 this.age=3; }else{ this.age=age; } } //注意get方法实际上就是返回类中属性的值 //set方法则是通过从外边传参来改变对象的属性 //依次来理解get/set的命名格式 }
首先对于这两个类并不在同一个包内故而就算不加private修饰符也不能在new对象后直接调用也必须通过特定的方法(可以是set/get方法)来实现调用。
对于修饰符private:令外部命令不可以直接进行访问对于由private修饰的属性。
对于封装的实质:就是通过private令外部不可以直接访问相关属性,通过内部方法set/get(为一般命名方式也可以不用此方法)访问调了一个接口。来实现对于相关属性的调用。
对于get/set方法:定义规范(可以遵守也可以不遵守,但是Idea有相关快捷方式打出get或set就是显示)驼峰命名规则get/set加上首字母大写的相关属性名。对于其格式的理解:get为得到相关的属性值因此定义该方法为public 返回值类型 get属性名(){方法体;}方法体为return语句,一般为return this.属性名以此来得到相关的属性的返回属性值,而在主方法调用中一般用来打印与赋值。而对于set为:对于相关属性值的修改不需要返回值,因此一般为public void set首字母大写的属性名(变量类型 变量名){方法体;}因为set的目的是对属性值修改故而必须要有参数传值才可以所以set方法一般都有参数,而对于方法体一般为this.属性名=变量名;来实现将输入的变量值直接赋值给对象的属性值。其次set/get方法一般都是public格式以便于main()函数new后直接调用。
对于set方法由于存在对于属性值的改动故而也可以通过if语句来实现保证数据不会破坏系统结构的功能!(如上方年龄为999是一定是不合理的会破坏系统的结构)
set/get方法生成的快捷键:Alt+Insert后选择getter and setter键位并选择要生成的属性也可以多选(实现的是同时建立多个属性的set和get方法)。
封装的意义:
1.提高程序的安全性,保护数据(由于private只能通过set/get方法来改变但set又可以增加安全性判断)2.隐藏代码的实现细节(用户只需要调用方法不用知道如何实现)3.统一接口(get/set)形成了规范4.系统的可维护性增加了
判断一个类的两个方法是否相同:只要方法名与参数列表一致两个方法即为同一个方法,此时涉及到了方法的重载,例如使用Alt+左击查看println函数可以看出源程序代码中有多个名字为println的函数但是其参数列表不同(有的类型不同,有的个数不同)这就是方法的重载当实参数不一致时调用的重载方法也不一致。
本节关键:属性私有,get/set