封装(三大特征)
面向对象的三大特征:封装 继承 多态
封装:就是把抽象的数据【属性】和对数据的操作【方法封装在一起】,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作
封装的理解和好处
- 隐藏实现细节
- 可以对数据进行验证,保证安全合理
封装的实现步骤(三步)
-
将属性进行私有化private 【不能直接修改属性】
-
提供一个公共(public)的set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx表示某个属性
//加入数据验证的业务逻辑(不能想改就改)
属性 = 参数名;
}
-
提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx(){//权限判断,Xxx某个属性(不能随意访问数据,可以进行用户验证)
return xx;
}
问题:
set方法和构造器,有构造器了还要set方法干嘛,直接构造方法破解!?
解决办法:
把set方法写在构造器中,这样就仍然可以验证
继承(三大特征)
解决代码复用性!
关键字:extends
基本语法:
class 子类 extends 父类{
}
子类会自动拥有父类定义的属性和方法
细节问题
-
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问
在父类提供一个public方法,返回私有属性 子类就可以访问这个私有属性了 。简而言之就是子类想调用父类的私有属性和私有方法,只能通过父类提供的public方法来间接访问
-
子类必须调用父类的构造器,完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
在子类的无参构造器中,有下面这句话
super(); //默认调用父类无参构造器 可写可不写 编译器会自动加上
-
如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)
-
super在使用时,必须放在构造器的第一行
-
super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器 有this就不能有super
-
java所有类都是Object类的子类
-
父类构造器的调用不限于直接父类!将一直往上追溯直到Object类
-
子类最多只能继承一个父类(直接继承),即java中是单继承机制
-
不能滥用继承,子类和父类之间必须满足is-a的逻辑关系
如 pig is a animal.