封装(encapsulation):
封装的定义
封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
封装的好处
(1)隐藏实现细节(2)可以对数据进行验证,保证安全合理。
封装的实现步骤
a. 将属性进行私有化,使外界不能直接修改属性
b. 提供一个公共的set方法,用于对属性判断并赋值
c. 提供一个公共的get方法,用于获取属性的值
继承 (代码复用)
继承的定义
子类继承了父类所有的属性和方法,非私有的属性和方法可以在子类直接访问。但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问。比如定义一个类 public class Employee{} 它的子类 public class Teacher extends Employee{}
继承注意事项
1.子类必须调用父类的构造器,完成父类的初始化
2.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
3.如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表),什么都不写默认调用父类的无参构造器(不写默认有super)
4.super在使用时,必须放在构造器第一行 ,super只能在构造器中使用
5.super() 和this()都只能放在构造器第一行,因此这两个方法不能共存一个构造器
6.java所有类都是Object类的子类,Object是所有类的基类
7.父类构造器的调用不限于直接父类,将一直往上追溯到Object类
8.子类最多只能继承一个父类,即java中是单继承机制
9.子类和父类之间必须满足is -a逻辑关系 比如猫是动物
super关键字
一、语法
1.(super.属性名)访问父类的属性,但不能访问父类的 private属性
2.super.方法名(参数列表)访问父类的方法 ,但不能访问父类的private方法
访问父类的构造器,只能放在构造器的第一句
二、 super带来的便利,细节
1.调用父类的构造器的好处(父类属性由父类初始化,子类属性由子类初始化)
2.当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,
必须通过super。
3.super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员
多态(polymorphic)
多态的定义
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承的基础之上的
方法的多态
方法的重写和重载体现多态
对象的多态
1. 一个对象的编译类型和运行类型可以不一致
2.编译类型在定义对象时,就确定了,不能改变
3.运行类型是可以变化的
4.编译类型看定义时 = 左边,运行类型看 = 右边
多态的注意事项
1.多态的前提是:两个对象存在继承关系
2.多态的向上转型
1.本质:父类的引用指向了子类的对象
2.语法:父类类型 引用名 = new Cat();
3.可以调用父类中所有成员(需遵守访问权限)但不能调用子类特有的成员,因为在编译阶段,能调用哪 些成员,是由编译类型来决定的,最终效果看子类具体实现
3.多态的向下转型
语法: 子类类型 引用名 = (子类类型) 父类引用Cat cat = (Cat) animal;
1)只能强转父类的引用,不能强转父类的对象
2)要求父类的引用必须指向的是当前目标类型的对象
3)当向下转型后,可以调用子类类型中所有成员
4.instanceOf是比较操作符,用于判断对象的类型是否为XX类型或XX类型的子类型
5.属性重写问题:属性没有重写之说,属性的值看编译类型
6.java的动态绑定机制
1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定(方法有)
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用(属性没有)