六、面向对象进阶一

面向对象进阶一

构造器

  1. 构造器的作用?

    • 初始化类的对象,并返回对象的地址

  2. 构造器有几种,各自的作用是什么?

    • 无参构造器:初始化对象时,成员变量的数据均采用默认值

    • 有参构造器:在初始化对象时,同时可以为对象进行赋值

  3. 构造器有哪些注意事项?

    • 任何类定义出来,默认就自带了无参构造器,写不写都有

    • 一旦定义了有参构造器,无参构造器就没有了,此时就需要自己写无参构造器了

this关键字的作用?

  • 代表当前对象的地址,可以用于指定访问当前对象的成员变量、方法

 

成员变量的分类和访问分别是什么样的?

  • 静态成员变量(有static修饰,属于类、加载一次,可以被共享访问),访问格式1: 类名.静态成员变量(推荐) 访问格式2:对象.静态成员变量(不推荐)

  • 实例成员变量(无static修饰,属于对象),访问格式:对象.实例成员变量

两种成员变量各自在什么情况下定义?

  • 静态成员变量:表示在线人数等需要被共享的信息

  • 实例成员变量:属于每个对象,且每个对象信息不同时(name,age……等)

 

成员方法的分类和访问分别是什么样的?

  • 静态成员方法(有static修饰,属于类和对象共享)访问格式1:类名.静态成员方法 访问格式2:对象.静态成员方法(不推荐)

  • 实例成员方法(无static修饰,属于对象)的访问格式:对象.实例成员方法

每种成员方法的使用场景是怎么样的?

  • 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法

  • 如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法

 

工具类是什么,有什么好处?

  • 内部都是一些静态方法,每个方法完成一个功能

  • 一次编写,处处可用,提高代码的复用性。

工具类有什么要求?

  • 建议工具类的构造器私有化处理

  • 工具类不想要创建对象

 

static访问注意:

  • 静态方法只能访问静态的成员,不可以直接访问实例成员

  • 实例方法可以访问静态的成员,也可以访问实例成员

  • 静态方法中不可以出现this关键字

 

代码块

  1. 静态代码块

    • 静态代码块的作用是什么?

      • 如果要再启动系统时对数据进行初始化,建议使用静态代码块完成初始化操作,代码优雅

    • 格式:static{}

    • 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

    • 使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用

  2. 构造代码块(了解,用的少)

    • 格式:{}

    • 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行

    • 使用场景:初始化实例资源

 

 

什么是设计模式

  • 设计模式是一套被前人反复使用、多数人知晓、经过分类编目的代码设计经验的总结,后来者可以直接拿来解决问题

  • 设计模式是软件设计中的常见解决方案,好的设计模式可以进一步的提高代码的复用性

单例模式

  • 可以保证系统中,应用该模式的这个类永远只有一个实例,即这个类永远只能创建一个对象

  • 场景和作用

    • 例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间

 

什么是继承

  • 继承是类与类之间的一种关系

  • 多个类继承单独的某个类,多个类就可使用单独的这个类的属性和行为了

  • 多个类称为子类(派生类),单独的这个类称为父类(基类,或超类)

  • 使用继承的好处:提高代码复用,减少代码冗余,增强类的功能性扩展

  • 继承的格式:

    • 在Java中,继承的关键字用的是”extends“

    • 例:public class 子类名 extends 父类名{}

  • 继承后子类的特点

    • 子类继承父类,子类继承父类的属性和行为,但是不能继承父类的构造器

    • Java中子类更强大

    • Java是单继承模式:一个类只能继承一个直接父类

    • Java不支持多继承,但是支持多层继承

    • Java中所有的类都是Object类的子类

  • Object特点:

    • Java中所有类,要么直接继承了Object,要么默认继承了Object,要么间接继承了Object,Object是祖宗类

  • 继承设计规范:

    • 子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和行为应该定义在子类里面

    • 为什么?

      • 如果子类的独有属性、行为定义在父类中,会导致其他子类也会得到这个属性和行为,这不符合面向对象逻辑

  • 在子类方法中访问成员(成员变量、成员方法)满足:就近原则

    • 先子类局部范围找

    • 然后子类成员范围找

    • 然后父类成员范围找,如果父类范围还没有找到则报错

  • 如果字符类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

    • 可以通过super关键字,指定访问父类的成员

      • 格式:super.父类成员变量/父类成员方法

  • 方法重写

    • 在继承体系中,子类中出现了和父类中一摸一样的方法声明,我们就称子类这个方法是重写的方法。

  • 方法重写的应用场景

    • 当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。

    • 子类可以重写父类中的方法

  • @Override重写注解

    • @Override是放在重写后的方法上,作为重写是否正确的校验注解

    • 加上该注解后如果重写错误,编译阶段会出现错误提示

    • 建议重写方法都加@Override注解,代码安全,优雅

  • 方法重写注意事项和要求

    • 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致

    • 私有方法不能被重写。

    • 子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:public>protected>缺省

    • 子类不能重写父类的静态方法,如果重写会报错

  • 子类继承父类后构造器的特点:

    • 子类中所有的构造器默认都会先访问父类中的无参构造器,在执行自己

    • 为什么?

      • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法在使用父类的数据

      • 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化

  • 怎么调用父类构造器?

    • 子类构造器的第一行语句默认都是:super(),不写也存在

  • super调用父类有参数构造器的作用:

    • 初始化继承自父类的数据

  • 如果父类中没有无参构造器,只有有参构造器,会出现什么现象呢?

    • 会报错,因为子类默认是调用父类无参构造器的

    • 如何解决?

      • 子类构造器中可以通过书写super(……),手动调用父类的有参构造器

  • this和super详情

  • this:代表本类对象的引用; super:代表父类存储空间的标识

    • 关键字访问成员变量访问成员方法访问构造方法
      this this.成员变量 访问本类成员变量 this.成员方法(…) 访问本类成员方法 this(…) 访问本类构造器
      super super.成员变量 访问父类成员变量 super.成员方法(…) 访问父类成员方法 super(…) 访问父类构造器
    • this(……)和super(……)使用注意点:

      • 子类通过this(……)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类的构造器

      • 注意:this(……)super(……)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中

     

     

     

     

posted @ 2022-06-16 16:32  遨游JAVA的大叔  阅读(8)  评论(0)    收藏  举报