java面向对象三大特性

一、封装

  • 封装的步骤:

image

  • 类的属性的处理:

    • 1、一般使用private. (除非本属性确定会让子类继承)

      2、提供相应的get/set方法来访问相关属性. 这些方法通常是public,从而提供对属性的读取操作。 (注意:boolean变量的get方法是用:is开头!)

    • 一些只用于本类的辅助性方法可以用private, 希望其他类调用的方法用public;

  • 实例:

    class Dog {
     private String name = "旺财"; // 昵称 
     private int health = 100; // 健康值 
     private int love = 0; // 亲密度 
     private String strain = "拉布拉多犬"; // 品种 
     public int getHealth() {
     return health;
     }
     public void setHealth (int health) {
     if (health > 100 || health < 0) {
     this.health = 40;
     System.out.println("健康值应该在0和100之间,默认值是40");
     } else
     this.health = health;
     }
     // 其它getter/setter方法 }
    

二、继承

/*
* 继承:
*   表示父类跟子类之间的关系
*   当两个类或者多个类具备相同的属性和方法的时候,可以提取出来,变成父类,子类可以继承
*
*   子类跟父类是is-a的关系
*
*   使用:
*       1、使用继承的时候需要使用extend关键字
*       2、使用继承关系之后,父类中的属性和方法都可以在子类中进行使用(非私有属性和非私有方法)
*       3、java中是单继承关系(如果包含多个父类,同时父类中包含重名方法,无法决定改调用谁)
*
*
* super:是 直接父类 对象的引用
*   用途:
*       1、可以在子类中调用父类中被子类覆盖的方法  super.父类方法名称
*       2、当super在普通方法中使用的话,可以任意位置编写
*       3、当super在构造方法中使用的话,会调用父类的构造方法,一定要将super放在第一行
*       4、在构造方法中super关键字和this关键字不能同时出现
*       5、父类中私有的属性和方法都不能被调用,包括构造方法
*       6、子类的构造方法中都会默认使用super关键字调用父类的无参构造方法,因此在定义类的时候,无论自己是否自定义了其他构造方法,最好将无参构造方法写上
*       7、如果构造方法中显式的指定了super的构造方法,那么无参的构造方法就不会被调用
*
*   总结:
*       1、在创建子类对象的时候一定会优先创建父类对象
*       2、所有的java类都具备同一个老祖宗类,称之为Object,是所有类的根类
*       
*
* 重写:
*   必须要存在继承关系,当父类中的方法无法满足子类需求的时候可以选择使用重写的方式
*   注意:
*       1、重写表示的是子类覆盖父类的方法,当覆盖之后,调用同样的方法的时候会优先调用子类
*       2、重写的方法名称,返回值类型,参数列表必须跟父类一直
*       3、子类重写的方法不允许比父类的方法具备更小的访问权限
*           父类      public     子类  public
*           父类      protected     子类  public protected
*           父类      protected     子类  public protected  default
*   父类的静态方法子类可以进行调用,但是子类不可以重写
* */
  • 继承小结:

    • 通过继承可以简化类的定义,实现代码的重用
    • 子类继承父类的成员变量和成员方法,但丌继承父类的构造方法
    • java中叧有单继承 ,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。就像我们现实中,如果你有多个父母亲,那是一个多么混乱的世界啊。多继承,就是为了实现代码的复用性,却引入了复杂性,使得系统类乊间的关系混乱。
    • java中的多继承,可以通过接口来实现
    • 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
  • super小结:

    • super关键字来访问父类的成员

    • super只能出现在子类的方法和构造方法中

    • super调用构造方法时,只能是第一句

    • super和this不能同时出现在构造方法中

    • super不能访问父类的private成员

    • super和this都不能再static方法中

image

三、多态

/*
* 多态:
*       对应同一个指令(调用同一个名称的方法),不同的对象给予不同的反应(不同的方法实现)
*   规范(多态实现的提前):
*       1、必须要有继承关系
*       2、子类方法必须重写父类的方法
*       3、父类引用指向子类对象
*   多态的目的:
*       为了提高代码的扩展性和维护性
*       方便代码逻辑的编写
*   多态的两种表现形式:
*       1、父类作为方法的参数
*       2、父类作为方法的返回值类型
*
*   引用类型的转换跟基本数据类型的转换类似:
*       1、当父类需要转成子类的时候,要进行强制转换,但是在强制转换之前一定要先判断父类引用指向的子类对象到底是谁,
*           如果无法确定,在运行过程中可以出错
*       2、当子类需要向父类转换的时候,直接自动转换,不需要进行任何的判断。
*
* */

四、接口

/*
* java中的继承关系是单继承,如果拥有多个父类的时候,可以考虑使用接口进行实现
*       java中的接口具备广泛的使用:
*       用法:
*           使用interface来修饰
*           接口中可以包含多个方法,且方法跟抽象类中的抽象方法一致,可以不写实现,子类在实现的时候必须要实现代码逻辑
*           子类实现接口使用implements关键字
*       特征:
*           1、接口中的所有方法都是抽象方法,不能包含方法的实现
*           2、接口中的所有方法的访问修饰权限都是public,不写并不是默认访问权限,而是public
*           3、接口不能被实例化
*           4、接口的子类必须要实现接口中的所有方法,跟抽象类有所不同,抽象类中的抽象方法必须要被子类实现
*           5、子类可以拥有实现多个接口
*           6、接口中的变量都是静态常量,如果变量没有使用static关键字修饰,它也表示静态常量,不用final关键字修饰,也是常量
*           7、接口中的方法和常量无论是否添加public修饰,默认的权限有且仅有一个,就是public
*
*      接口的使用:
*           1、接口代表一种能力,接口中可以定义N多个方法,子类在进行实现的时候,必须要实现这些方法
*               将这些方法进行实现,就意味着具体了方法的能力
*               关心实现类有何能力,而不关心实现细节
*
*      抽象类和接口的区别:
*           1、抽象类中的方法可以有抽象方法,也可以有普通方法,但是接口中只能包含抽象方法
*           2、抽象类需要使用abstract关键字来修饰,而接受使用interface关键字来修饰
*           3、子类使用extends关键字来继承抽象类,使用implements来实现接口
*           4、子类继承抽象类的时候必须要实现所有的抽象方法,普通方法可以不重写,而接口中的所有方法必须实现
*           5、抽象类中可以定义成员变量,而接口中只能定义静态常量
*           6、抽象类在子类实现的时候是单继承,而接口时多继承
*           7、抽象类和接口都不能实例化,但是抽象类中可以有构造方法,而接口中不能有构造方法
*           8、抽象类中可以实现接口,并且不实现接口中方法,而接口只能继承接口,不能实现接口
*       注意:
*           在实际的项目开发过程中,如果可以使用接口,尽量使用接口,将单继承的父类留在最关键的地方
 * */
posted @ 2021-08-03 11:08  107w  阅读(66)  评论(0)    收藏  举报