在初期,很多人对于java中一些定义的认识比较模糊,今天我就来详细讲一讲我所认识的封装和继承。
1、封装
1.1)概念:将类的某些信息隐藏在内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
1.2)好处:只能通过规定的方法访问数据;隐藏类的实例细节,方便修改和实现。
1.3)封装的实现步骤
注意:对封装的属性不一定必须通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,这样比较标准。
1.4)访问修饰符
访问修饰符可以限制类中成员的被访问范围,可以有效的保护隐私数据。
1.5)java中的内部类
- 内部类(Inner Class)就是定义在另外一个类里面的内。与之对应,包含内部类的类被称为外部类。
- 内部类不常用,但却有其特殊的作用:
- a、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
- b、内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
- c、内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
- 内部类分为:成员内部类、静态内部类、方法内部类、匿名内部类
2、继承
2.1)概念:继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。如下图所示:
注:java中的集成是单继承,一个类只有一个父亲,但一个父亲可以有多个子类。
2.2)好处:子类拥有父类的所有属性和方法(除了private修饰的属性不行)从而实现了代码的复用。
2.3)语法规则:只要在子类后面加上extends关键字再加上想要继承的父类就可以了
2.4)方法的重写
子类如果对继承的父类中一些方法不满意,可以自己重写编写该方法,这种方式就叫做方法的重写,当调用方法时会优先调用子类的方法。
需要注意:方法名相同、参数列表相同,方法体不同
2.5)继承的初始化顺序
- 初始化父类再初始化子类
- 先执行初始化对象中属性,再执行构造方法中的初始化
- 基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:
- 父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化--->子类对象构造方法
2.6)final关键字
使用final关键字做标识有“最终”的含义。final修饰类,则该类不能被继承;final修饰方法,则该方法不能被重写;final修饰属性,则该类的该属性不会进行隐式的初始化,所以该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值),且初始化之后就不能改了,只能赋值一次。
2.7)super关键字
在对象的内部使用,可以代表父类对象。
访问父类的属性super.*;访问父类方法super.*()
super的应用:首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。(补充说明,虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。)
2.8)Object类
Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。Object里面主要有两个类:toString()、equals()