第六天(下) 封装和this
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六天(下) 封装和this相关的知识,希望对你有一定的参考价值。
封装(有时候也叫数据隐藏).是与对象有关的一个重要概念,从形式上来看,封装是将数据和行为组合在一个包中,并对 对象的使用者隐藏了数据的实现方式.
封装的关键在于绝不能让类中的方法直接访问其他类的数据,程序仅通过对象的方法与对象数据 进行交互.封装给予了对象黑盒的特性.这是提高重用性和可靠性的关键.
封装的表现:方法就是一个最基本封装体,类也是一个封装体
封装的好处:
1提高的代码的复用性.
2隐藏了实现细节,还要对外提供可以访问的方式,便于调用者的使用,(封装的核心之一,或者也可以说是封装 概念)
3提高了安全性.
4 可以对成语变量进行更精准的控制(在set方法中加入if语句等)
封装的举例: (机箱)
一台电脑有cpu,主板,显卡等部件组成,将这些部件组合在一起就可以用电脑了,但是这些东西都散落在外面,很容易造成不安全的因素,于是,就用机箱把所有东西装在里面,在机箱上留下插口等.
机箱就隐藏了各种部件的细节,对外提供了插口和开关等访问内部细节的方式.
Java封装的实现步骤:
1修改属性的可见性来限制对属性的访问(一般限制为private) 将name和age的属性设置为私有,只有本类才可以访问,其他类都访问不了,从而实现了信息的隐藏.
2对每个值属性提供对外的公共方法访问,也就是创建一对赋值取值的方法,用于对私有属性的访问.
class Person { int age; String name; public void show() { System.out.println("age=" + age + ",name" + name); } } public class PersonDemo { public static void main(String[] args) { // 创建Person对象 Person p = new Person(); p.age = -20; // 给Person对象赋值 p.name = "人妖"; p.show(); // 调用Person的show方法 } }
我用代码描述了一个Person,但有个严重的问题Person里的属性可以被随意的访问和更改,这不符合实际标注
这时候就需要一个关键字也就是修饰符private(私有,权限修饰符) 只要将类的属性私有化,就无法直接访问.
class Person { private int age; private String name; public void show() { System.out.println("age=" + age + ",name" + name); } }
属性被私有了,错误的值不能赋了,可是正确的值也赋值不了,
根据之前学习的封装的原理,隐藏后,还需要提供访问方式.
一般对成员属性的访问方法赋值(set)取值(get),对私有的变量提供相应的访问方式setXxx getXxx 属性名的首字母大写
class Person { // 私有成员变量 private int age; private String name; // 对外提供设置成员变量的方法 public void setAge(int a) { age = a; } // 对外提供访问成员变量的方法 public void getAge() { return age; } }
我们现在把属性隐藏了,也通过对外的方法实现了赋值取值,但是我们还是不能阻止 他赋予错误的值.
我们可以在set方法中添加if语句来增加限制
class Person { // 私有成员变量 private int age; private String name; // 对外提供设置成员变量的方法 public void setAge(int a) { // 由于是设置成员变量的值,这里可以加入数据的验证 if (a < 0 || a > 130) { System.out.println(a + "不符合年龄的数据范围"); return; } age = a; } // 对外提供访问成员变量的方法 public void getAge() { return age; } }
总结:类中不需要对外提供的内容都私有化,包括属性和方法 以后再描述事物,属性都私有化,并提供set get方法
注意:私有只是封装的体现形式,并不是封装就是私有化
this关键字:
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用当前对象
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
1)this()调用其他构造方法的语句只能放在构造方法(在其他普通方法里是不行的)的首行;
2)在使用this调用其他构造方法的时候,至少有一个构造方法是不用this调用的。(必须要有结尾,不能无限期的调用下去,循环递归调用);
(4)对象的比较
this本类的对象引用 那个对象用this this就表示那一个对象
以上是关于第六天(下) 封装和this的主要内容,如果未能解决你的问题,请参考以下文章