封装
面向对象共有三个特征:封装,继承,多态。
封装
封装表现:
1、方法就是一个最基本封装体。
2、类其实也是一个封装体。
从以上两点得出结论,封装的好处:
1、提高了代码的复用性。
2、隐藏了实现细节,还要对外提供可以访问的方式。
3. 便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
4、提高了安全性。
private 私有
private:是私有化;
被private修饰的方法和属性只能在本类中使用;其他方法(main)不能调用和访问;
因为被private修饰的属性和方法不能被别的类使用,则需要写方法进行:
赋值set和调用get;给私有属性赋值,
调用私有方法
代码例子
了解到封装在生活的体现之后,又要回到Java中,细说封装的在Java代码中的体现,先从描述Person说起。
描述人。Person
属性:年龄。
行为:说话:说出自己的年龄。
publicstaticvoid main(String[] args) { perso p = new perso(); /*Person p=new Person(); *p.speak()因为在Person类中写好了输入语句的方法speak(); * 所以这里直接调用就行了;如果没有写System输出语句*/ * 则需要写System.out.println(p.getName()+"..."+p.getAge()) (=p.speak); * 调取private修饰的属性需要:*/ // 变量名.getName(); // 传参 p.setName("速战"); // 传参 p.setAge(23); perso p1 = new perso(); // 传参 p1.setName("刚切"); // 传参 p1.setAge(24); /* * p.speak(); System.out.println(p.getName()+"..."+p.getAge()); */ }
有个严重的问题,就是Person中的属性的行为可以任意访问和使用。这明显不符合实际需求。
需要使用一个Java中的关键字也是一个修饰符 private(私有,权限修饰符)。只要将Person的属性和行为私有起来,这样就无法直接访问。
class Person { //成员变量 private int age; private String name; public void speak() { System.out.println("我叫" + name + ",今年" + age + "岁了。"); }
年龄已被私有,错误的值无法赋值,可是正确的值也赋值不了,加判断。
一般对成员属性的访问动作:
赋值(设置 set),
取值(获取 get),
因此对私有的变量访问的方式可以提供对应的 setXxx或者getXxx的方法。
变量名.set(值)的方法进行private修饰后的属性赋值;
class Person { // 私有成员变量 // 加私有 private String name; // 加私有 privateintage; // 对外提供设置成员变量的方法 publicvoid setName(Sring n){ name=n; /*name=n:等于this.name(this.name是成员变量的name就是private String name)=n
(n是实例化对象传递过来要赋的值);*/ }
//对外提供访问成员变量的方法 public String getName() { // 调用者调用方法,方法就返回给调用者 returnthis.name; } publicvoid setAge(int a) { // 由于是设置成员变量的值,这里可以加入数据的验证 if (a < 0 || a > 130) { System.out.println(a + "不符合年龄的数据范围"); return; } age = a; } // 对外提供访问成员变量的方法 public void getAge() { returnage;//// 调用者调用方法,方法就返回给调用者 } }
总结:
类中不需要对外提供的内容都私有化,包括属性和方法。
以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。
注意:私有仅仅是封装的体现形式而已。
publicclass demo01 { public static void main(String[] args) { perso p = new perso(); // 传参 p.setName("速战"); // 传参 p.setAge(23); perso p1 = new perso(); // 传参 p1.setName("刚切"); // 传参 p1.setAge(24); /* * p.speak(); System.out.println(p.getName()+"..."+p.getAge()); */ //传参 boolean flag = p.compare(p1); //返回值 打印 System.out.println(flag); } } public boolean compare(boolean p){ return this.age=p.age; }
1. 在main调用的方法是boolean flag=p.compare(p1);所以返回值是boolean型的所以这里compare()方法得用
boolean接;实际上就是:在main方法里p调用了Persong类中的compare()方法;
2. 方法中return this.age=p.age;是用来比较的返回值是boolean型;
publicclass perso { // 加私有 private String name; // 加私有 privateintage; // 出口 publicvoid setName(String name) { this.name = name; } // 返回有返回值 public String getName() { // 调用者调用方法,方法就返回给调用者 returnthis.name; } // age 赋值有返回值 publicvoid setAge(intage) { this.age = age; } // 取值有返回值 publicint getAge() { // 调用者调用方法,方法就返回给调用者 returnage;} // 判断是否是同龄人 publicboolean compare(perso p) returnthis.age == p.age;}
this.age是指p.age;p.age就是p2.age(在main方法中定义了Person对象p2);通过compare方法把p2对象传到了Person类compare方法中进行比较;然后将结果false返回给main里 的p.compare()对象调用的方法中;返回值也是boolean;
this.age就是调用对象的age也就是p.age;=p.age是被比较者的age;是通过compare(Person p)传过来的(整个p对象,包含age属性);=p.age的age被传过来的p对象的age赋值并比较
boolean flag=p.compare(p2);//这里是调的比较方法,返回值是boolean型的所以在Person类中compare()方法返回值用boolean接;