对象的行为

109 阅读7分钟

对象的行为

  • 在方法定义的时候,方法的生命部分(方法签名),不要写static;static是一种特殊的方法,后面再讨论;

  • 方法调用仍然满足我们之前所学的“方法调用栈”的特性,先进后出。这里的栈指的是方法调用和结束的顺序是满足数据结构中“栈”的概念---先进后出

  • 方法结束的方式

    • 正常结束------ 不管带不带返回值,只要是这个方法正常执行,直到遇到方法的结束"}" 或 “return” 语句,都是正常结束的。

    • 异常结束 ------ 方法在执行过程中发生了问题,执行不下去了,被强制结束。

      但不管是正常结束还是异常结束,方法的流程都是返回到方法调用处。

  • 方法的签名

    访问修饰符 可选修饰符 返回类型 方法名(参数列表)

    • 访问修饰 --- 肯定要有,不写也有默认,默认不是public,是一种独立情况
    • 可选修饰符 --- 目前只见过static,暂时不要写
    • 返回类型 --- 可以返回任意数据类型: 基本数据类型、String、自定义类型、数组类型 均可。 返回也是返回“值”,只不过基本数据类型的值就是数据值本身,而引用数据类型的值就是它的引用。如果没有返回,那么也要写一个void。
    • 方法名
    • 参数列表 -- 指的是形参列表,语法就是变量声明的语法
  • 重载方法

    一个类可以拥有多个同名的方法,要求是参数列表不同,包括:参数个数、参数的类型、参数的顺序,跟参数名无关。

构造器 -- 构造方法 -- Constructor

基本知识点

构造器是我们在类定义当中除属性和行为之外的第三种内容。

引入:当我们产生对象的时候,书写了如下代码 new 类名();

  • 其中new是一个关键字,而后面的"类名()"的形式 非常像再调用一个方法。 只是特殊之处在哪里呢?

    • 这个方法的名字就是类名;
    • 我们没有给这个方法传参。但是我们发现之前的Scanner在new的时候是可以传参的。 因此我们更加坚信了 new 后面接的就是一个方法的调用指令。 这个方法就是 “构造方法”
  • 构造方法的作用:

    • 产生对象;
    • 通过接受外部参数,对对象的属性进行初始化。
  • 构造方法的语法特殊性:

    • 程序员可以在类当中不定义构造方法, 那么Java会给我们自动生成一个“公共的无参的”构造方法,保证我们的基本使用;

    • 如果我们要自定义构造方法,那么需要注意

      • 构造方法的名字必须和类名保持一致;
      • 构造方法没有返回类型,连void都没有;
      • 构造方法的访问修饰符和参数列表可以根据具体问题域具体设计。
    • 一旦自定义了构造方法,那么Java将不再给我们生成那个默认的“公共无参”构造;

  • 构造方法的执行步骤: 一旦new了一个构造方法,它的执行步骤如下:

    • 首先、在内存的堆当中划分了对象存放的空间,这个空间多大呢?依赖于我们给这个类定义了多少内容?
    • 然后,在该空间划分属性,并对属性进行初始化;
    • 最后,执行程序员在构造方法当中所书写的代码。

其中,头两件事情是构造方法自己做的,我们无需用代码表达,我们只需要书写第三个步骤的内容即可。

相关知识点 -- this()

  • this() -- 用来让一个构造方法可以共享另一个构造方法的代码

  • 语法特殊性:

    • this()只能写在构造方法里面;
    • this()只能写在构造方法的第一句;这也导致一个构造只能共享一次其他构造的代码;
    • 如果一个类里面有多个构造方法,this()是依赖于它的参数去匹配到底调用的是哪个构造方法;
    • 构造方法不允许递归调用,不能用this()访问自己。

    与面试相关的this()问题

  • 如何在外部new 一次对象,然后调用到某个类的所有构造方法?

  • 构造方法的作用是用来产生对象的,调用一次构造就产生一个对象,那么如果构造方法里面又写了this(),那是否意味着new 一次 多次调用了构造方法,从而产生了多个对象呢?

  • this有几种用法?

  • 分辨this和super关键字。--- 放到后面来讲

属性的访问器和修改器 -- getter/setter

到目前为止,我们设计的类当中的内容全部使用的是 public 访问修饰符。所谓的public,指的是公共,那么就意味着在外部的使用者是可以在任意位置对类的内容做任意操作的。

在实际问题域当中,对象身上的属性其实很少有public修饰的,因为用public修饰不仅仅意味着外部的其他对象可以访问这个属性,同时也意味着外部的其他对象可以任意修改属性。

通常只有常量属性,我们愿意设计为public,为什么?反正外部也修改不了,只能获取值。

修改器(setter方法)和访问器(getter方法)

  • 其作用就是为了能够让外部使用我们在类当中被设计为private的这些属性。

  • 语法:

  • 访问器

     public 被访问的属性的类型  get被访问的属性名(){
             return 被访问的属性;
      }
    
  • 修改器

  public void set被访问的属性名(属性类型 属性名){
        this.属性名 = 属性名;
  }

问题: 如果一个属性允许在外部访问或修改,那么是不是直接写成public,比写成private,然后再提供get/set方法简便呢?

还是需要定义该属性为private,然后提供get/set方法。代码书写的多少不重要,而是采用get/set方法比直接把属性设置为public,更安全更灵活。

  • 主要体现在以下三点:

    • 我们能够通过为某个private属性 单独提供get方法 或 set方法,让这个属性对外部而言是“只读”的,或“只写”的;这是把属性设计为public做不到的。
    • 如果我们直接把属性设置为public,外部可以对这个属性赋任意数据值(只要满足类型匹配,但不能考虑有效性匹配),除非外部每一次赋值的时候都去做判断;
    • 而如果设计为private属性,然后提供set方法,那么外部只能通过set方法给该属性赋值,而我们可以在set内部通过代码进行有效性验证。这样把验证有效数据的控制权掌握在一个地方,而不是散在每一次赋值的地方。
    • 不直接暴露我们类内部对数据的存放形式,比如 学生类身上的生日属性,在类内部其实设计为年月日三个int,但由于是私有的,外部看不到,只能看到我统一提供的一个叫做getBirthday的方法,获取最终结果。

Java标准类

Java标准类,又名“Java Bean”,也被叫做“Bean类”。 JavaBean类 是 SUN公司在95年的“技术白皮书”当中提出,只有满足这些规范的类才能称之为“JavaBean”。Java是一门工程学的编程语言,它最大的特点就是建立庞大的项目,所以标准是很重要的。到了后期,你们学习Java方向的同学会发现,所有的框架/工具,几乎都要求书写Java标准类,不满足要求的根本不能在这些框架和工具当中运行起来。

  • Java标准类的规范如下:

    • 必须提供公共无参构造;
    • 必须为私有属性提供符合命名规范的get/set方法;
    • 应该实现Serializable接口

    一定要习惯get/set方法的使用

\