一、封装
概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
好处:只能通过规定的方法访问数据。 隐藏类的实例细节,方便修改和实现。
封装实现的步骤: 修改属性的可见性:private,创建getter和setter 方法用于属性的读写,在getter/setter方法中加入属性控制语句,对属性的合法性校验。
A.访问修饰符:
访问修饰符 本类 同包 子类 其他
private √
默认 √ √
protected √ √ √
public √ √ √ √
B.this关键字:
①this关键字代表当前对象: this.属性代表操作当前对象的属性;this.方法代表调用当前对象的方法。
②封装对象属性的时候,经常会遇到this关键字。
③当getter和setter函数参数名和成员函数名重复的时候,可以用this区分。
二、继承
概念:继承是类与类的一种关系,是一种“is a”的关系。比如“狗”继承“动物”,java中的继承是单继承,即一个类只有一个父类。
好处:子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用。
语法规则:只要在子类加上extends关键字继承相应的父类就可以了。
A.方法的重写:子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
重写要注意: 返回值类型 ,方法名,参数类型及个数。都要与父类继承的方法相同,才叫方法的重写。
重写和重载的区别:
①方法重载,在同一个类中处理不同数据的多个相同方法名的多态手段。同一个类中
②方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。在子类中
B.继承的初始化顺序:初始化父类再初始化子类,先执行初始化对象中属性,再执行构造方法中的初始化。
父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化--->子类对象构造方法。
C.final关键字:使用final关键字做标识有“最终的”含义。
① final 修饰类,则该类不允许被继承。
② final 修饰方法,则该方法不允许被覆盖(重写)。
③final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值。或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。
④ final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
D.supper关键字:在对象的内部使用,可以代表父类对象。
①访问父类的属性:super.age; ② 访问父类的方法:super.eat();
③supper的应用:首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字,这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。(补充说明,虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。)
三、多态
多态就是对象的多种形态。
java里的多态主要表现在两个方面:
1.引用多态:
父类的引用可以指向本类的对象;父类的引用可以指向子类的对象;这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:
Animal obj1=new Animal(); 父类的引用指向本类
Animal obj2=new Dog(); 父类的引用指向子类
为什么子类的引用不能用来指向父类的对象呢?我在这里通俗给大家讲解一下:就以上面的例子来说,我们能说“狗是一种动物”,但是不能说“动物是一种狗”,狗和动物是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!!
2.方法多态:
根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!