面向对象OOP
1,封装(encapsulate):抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
*封装的步骤(三步:
1,将属性私有化private【不能直接修改属性】
2,提供一个公共的(public)set方法,用于对属性判断并赋值。
public void setXxx(属性的类型,参数名){
//加入数据验证的业务逻辑;
属性=参数名;
}
3,提供一个公共的(public)get方法,用于获取属性的值。
public 数据类型 getXxx(){
return xx;
}
2,继承:
好处:
1,代码的复用性提高了
2,代码的扩展性和维护性提高了
使用细节:
1,子类必须调用父类的构造器,完成父类的初始化
2,当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会调用父类的无参构造器,
如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定父类的哪一个构造器完成父类的初始化工作,否则编译不通过。
3,如果希望指定去调用父类的某一个构造器,则显式的调用一下
4,super在使用时,需要放在构造器第一行
5,super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
6,java所有类都是Object类的子类
7,父类的构造器的调用不能限于直接父类,将一直往上追溯直到Object类(顶级父类)
8,子类最多只能继承一个父类(指直接继承),在java中是单继承机制。
9,不能滥用继承,子类和父类之间需要瞒足is-a额逻辑关系

3,super关键字:super代表父类的引用,用于访问父类的属性,方法,构造器
基本语法:
1,访问父类的属性,但不能访问父类的private属性:super.属性
2,访问父类的方法时,不能访问父类的private方法:super.方法名(参数列表)
3,访问父类的构造器:super(参数列表)(只能放在构造器的第一句,只能出现一句)
细节:
1,调用父类构造器的好处:分工明确,父类属性由父类初始化,子类属性由子类初始化
2,当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super,如果没有重名,使用super,this,直接访问是一样的效果
3,super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super访问爷爷类的成员,如果多个基类中都有同名的成员,使用super遵循就近原则
调用属性和方法的顺序:
1,先找本类,如果有,则调用
2,如果么有,则找父类(如果有,可以调用,则调用)
3,如果没有,则继续找父类的父类直到Object类

4,方法重写(override):
满足要求:1,子类的方法的形参列表,方法名称,要和父类的形参列表,方法名称完全一样
2,子类的返回类型和父类的返回类型一样,或者是父类返回类型的子类 如:父类中返回类型是Object类型,子类返回类型可以为String
3,子类方法不能缩小父类的访问权限。

5,多态:
重要的规则:
1,一个对象的编译类型和运行类型可以不一致
2,编译类型在定义对象时,就确定了,不能改变
3,运行类型是可以变化的
4,编译类型看定义时=号的左边,运行类型看=号的右边
多态的向上转型:
1,本质:父类的引用指向了子类的对象
2,语法:父类类型 引用名=new 子类类型();
3,特点:编译类型看左边,运行类型看右边,可以调用父类中所有的成员(需要遵守访问权限),不能调用子类中特有的成员,最终运行效果看子类的具体实现。
多态的向下转型:
1,语法:子类类型 引用名=(子类类型)父类引用
2,只能强转父类的引用,不能强转父类的对象。
3,要求父类的引用必须指向的是当前目标类型的对象
4,可以调用子类类型中所有的成员
多态中属性的类型:
1,instanceof比较符:用于判断对象的运行时类型是否为xx类型或xx类型的子类类型
2,属性没有重写之说,属性的值看编译类型
动态绑定(重点):
1,当调用对象方法的时候,该方法会和该对象的 内存地址/运行类型 绑定。
2,当调用对象属性时,没有动态绑定机制,哪里有声明,哪里使用。
Object类:equals与==对比
==:既可以判断基本类型,也可以判断引用类型。如果判断的是基本类型,则判断的是值是否相等。如果判断的是引用类型,判断的是地址是否相等。
equals:是Object类中的方法,只能判断引用类型。默认判断的是地址是否相等,子类需要重写该方法,用于判断内容是否相等。
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof Person){
Person person=(Person)obj;//向下转型:可以让obj使用Person的属性进行比较
return this.name.equals(person.name) && this.age==person.age && this.gender==person.gender;
}else{
return false;
}
}
tostring方法:
默认:全类名+@+哈希值的十六进制
重写:打印或拼接对象时,都会自动调用该对象的toString形式
当直接输出一个对象时,会默认调用toString方法。

浙公网安备 33010602011771号