面向对象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方法。

posted @ 2021-11-05 17:28  当个码农吧  阅读(55)  评论(0)    收藏  举报