一、封装
1. 封装:隐藏实现细节; 可以对数据进行验证,保证安全合理。
把抽象出来的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
2.封装实现步骤:
-
将属性私有化
-
提供一个公共的set方法,用于对属性判断并赋值
-
提供一个公共的get方法,用于获取属性的值
二、继承
1. 继承:代码的复用性提高了; 代码的扩展性和维护性提高了。
2.继承细节:
-
子类继承了所有的属性和方法,但是私有属性和方法不能在子类直接访问,要通过父类提供公共方法访问。
-
子类必须调用父类的构造器,完成父类的初始化。
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
-
java所有类都是Object的子类
-
父类构造器的调用不仅限于直接父类,将一直向上追溯到Object类(顶级父类)
-
子类最多只能继承一个父类(直接继承),即单继承。
-
不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。
3. 继承本质:
4.super: 代表父类的引用,用于访问父类的属性,方法,构造器。
-
访问父类的属性,但不能访问父类私有的属性。
-
访问父类的方法,但不能访问父类的私有方法。(super.方法名)
-
访问父类的构造器,只能放在构造器的第一句
5.super细节:
-
分工明确,父类属性由父类初始化,子类属性由子类初始化
-
当子类中有和父类中的成员重名时,为了访问父类的成员,必须通过super,如果没有重名,使用super,this,直接访问是一样的效果。
-
super的访问不限于直接父类,如果爷类和本类中有同名的成员,也可以用super去访问爷类的成员;如果上级类中都有同名的成员,使用super遵循就近原则,也要遵循访问权限的相关规则。
三、
1.方法重写(覆盖override):子类有一个方法,和父类的某个方法的名称,返回类型,参数一样。
2.方法重写细节:
-
子类方法的参数,方法名名称,要和父类方法的参数,方法名称完全一样。
-
子类方法的返回类型和父类的返回类型一样,或者是父类的返回类型的子类。
-
子类方法不能缩小父类方法的权限。
四、多态
1. 多态:方法或对象具有多种形态,是面向对象的基本三大特征,是建立在封装和继承的基础之上。
2.对象的多态:
-
一个对象的编译类型和运行类型可以不一致
-
编译类型在定义对象时,就确定了,不能改变
-
运行类型可以变化的
-
编译类型看定义时=号的左边,运行类型=号的右边
-
Animal animal=new Dog(); 编译类型是Animal ,运行类型是Dog().
3. 多态细节:
-
多态的前提是两个对象是继承关系。
-
多态的向上转型:
-
父类的引用指向了子类的对象:
-
可以调用父类的所有成员(遵守访问权限)
-
但是不能调用子类的特有的成员,因为在编译阶段,能调用哪些成员,是由编译类型决定的。
-
最终的运行效果还要看子类的具体实现,即调用方法时,按照从子类开始查找方法,然后调用。
4.多态的向下转型:
-
语法:子类类型 引用名=(子类类型) 父类引用
-
Cat cat=(Cat) animal;
-
只能强转父类的引用,不能强转父类的对象
-
要求父类的引用必须指向的是当前目标类型的对象
-
当向下转型后,可以调用子类类型中所有的成员
-
属性没有重写之说,属性的值看编译类型
-
instanceOf 比较操作符,用于判断对象的运行类型 是否为XX类型或XX类型的子类型
5. java动态绑定机制(重点)
-
当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
-
当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
6.多态数组: 数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。
7.多态参数: 方法定义的形参类型为父类类型,实参类型允许为子类类型。
五、
1.Object类详解:
(1)==和equals的对比:
-
== 既可以判断基本类型,又可以判断引用类型
-
== 是一个比较运算符
-
== 如果判断基本类型,判断的是值是否相等
-
== 如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
(2)equals方法:
-
是Object类中的方法,只能判断引用类型
-
默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等
(3)hashCode方法:
(4) toString方法:
-
默认返回,全类名 + @ +哈希值的十六进制,子类往往重写toString方法,用于返回对象的属性信息
-
重写toString方法,打印对象或者拼接对象时,都会自动调用该对象的toString形式
-
当直接输出一个对象时,toString方法会被默认的调用
(5)finalize方法:
2. 断点调试: