Java review part 2: object-oriented encapsulation

2020/10/10

Java 基础知识第二部分。

面向对象

类的定义

一个类不能直接使用,需要根据类创建一个对象,才能使用。

步骤:

  1. 导包:指出需要什么类,在什么位置。 import 包名称.类名称 对于和当前类属于同一个包的情况,可以省略导包语句。
  2. 创建 = 类名称 对象名 = new 类名称();
  3. 使用
    1. 使用成员变量 = 对象名.成员变量名
    2. 使用成员方法 = 对象名.成员方法名(参数)

一个对象的内存图

使用对象类型作为方法的参数:当一个对象作为方法的参数,传递到方法当中时,实际上传递进去的是对象的地址值

使用对象作为方法的返回值:返回值其实就是对象的地址值

成员变量与局部变量的区别:

  1. 定义位置不一样(重要)
    • 成员变量:在方法外部,直接写在类中
    • 局部变量:在方法内部
  2. 作用范围不一样(重要)
    • 成员变量:整个类可以通用
    • 局部变量:只有方法中可以使用,出了方法不能使用。
  3. 默认值不一样
    • 成员变量:若没有赋值,会有默认值,规则和数组一样
    • 局部变量:没有默认值,如果要想使用,必须手动进行赋值。
  4. 内存位置不一样(了解)
    • 成员变量:位于堆内存
    • 局部变量:位于栈内存
  5. 生命周期不一样
    • 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失。
    • 局部变量:随着方法进栈而诞生,随着方法出栈而消失。

方法的参数也是局部变量,在调用的时候必然会被赋值。

面向对象 - 封装性

  1. 封装在java中体现

    • 方法是一种封装
    • 关键字private也是一种封装 使用private将需要保护的成员变量进行修饰。在本类中可以随意访问,但是超出本类范围之外不能直接访问。 间接访问private成员变量:设置一对getter/setter方法
      • setter方法:有参数,无返回值。方法名称必须是set+首字母变大写(setXxx)
      • getter方法:无参数,有返回值。方法名称必须是get+首字母变大写(getXxx)。
      • 注意:对于基本数据类型中的boolean型,Getter方法一定要写成isXxx形式,setXxx规则不变。

    封装:将一些细节信息隐藏起来,对于外界不可见。

  2. this关键字

    作用:在重名下起到区分的效果。

    当方法的局部变量和类的成员变量重名时,根据“就近原则”,优先使用局部变量。

    如果需要访问本类中的成员变量,需要使用这种格式 = this.成员变量名

    通过谁调用的方法,谁就是this.

  3. 构造方法

    专门用来创建对象的方法。(使用构造方法创造对象可以更具体)

    格式 =

    public 类名称(参数) {
        方法体
    }
    

    注意事项:

    • 构造方法名称必须和所在类名称完全一样
    • 构造方法不需要写返回值类型,void也不需要
    • 构造方法不能产生返回值。
    • 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数且方法体什么都不做。public Student() {}
    • 一旦编写了至少一个构造方法,那么编译器将不再赠送。
    • 构造方法也是可以进行重载的。

    new对象就是在调用构造方法。

  4. 标准的类(Java Bean)

    • 所有成员变量都要使用private关键字修饰
    • 为每一个成员变量编写一对Getter/Setter方法
    • 编写一个无参数构造方法
    • 编写一个全参数构造方法

    在idea中可以自动生成下面3项!!!菜单Code -> Generate

API文档的查看

  1. 包路径
  2. 构造方法
  3. 方法摘要

Scanner类

匿名对象

正常的创建对象格式 = 类名称 对象名 = new 类名称();

匿名对象创建格式 = new 类名称()

注意 = 匿名对象只能使用唯一的一次,下次只能创建新的匿名对象。

建议:如果确定有一个对象只需要使用一次,就可以使用匿名对象。

Random类

生成随机数字。

对象数组

数组可以存储任何数据类型

ArrayList集合

其长度可以随意改变。

对于ArrayList来说,有一个尖括号<E>代表泛型。

泛型:装在集合中的所有元素,全都是统一的什么类型。

注意:泛型只能是引用类型,不能是基本类型。也就是说集合里面保存的都是地址,但是基本类型数据没有地址。

ArrayList<String> list = new ArrayList<>();

注意右侧的尖括号也是要写的。

注意:对于ArrayList集合,直接打印得到的不是地址值,而是内容。如果内容为空,则得到的是空的中括号[].

常用方法:

String

字符串的特点 =

  1. 字符串的内容永不可变。(重要)
  2. 因为字符串不可改变,所以字符串是可以共享使用的。
  3. 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。

创建字符串的常见3+1种方式 =

字符串常量池 = 程序当中直接写上的双引号字符串,就在字符串常量池中。new的不在池中。

注意:

常用String方法:

静态static关键字

一旦用了static关键字,那么这样的内容就不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享一份数据。

  1. static修饰成员变量

  2. static修饰方法

    一旦使用static修饰成员方法,这就成为了静态方法。静态方法不属于对象,而是属于类的。

    • 如果没有static,那么必须首先创建对象,然后通过对象才能使用它。
    • 对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用。类名称.静态方法
    • 如果有static关键字,可以不创建对象,直接通过类名称调用它
    • 对于本类当中的静态方法,可以省略类名称。

无论是成员变量还是成员方法,如果有static关键字修饰,都推荐用类名称进行调用

注意

  1. 静态不能访问非静态(重点)

    原因:因为在内存当中是先有的静态内容,后有的非静态内容。(先人不知道后人,但是后人知道先人)

  2. 静态方法中不能用this

    原因:this代表当前对象,但是静态方法是通过类调用的,和对象没有关系。

static内存图

注意:根据类名称访问静态成员变量时,全程和对象没有关系,只和类有关系。

静态代码块
  1. 格式:
    public class 类名称 {
     static {
         // 静态代码块内容
     }
    }
    
  2. 特点:当第一次用到本类时,静态代码块执行唯一的一次。
  3. 静态内容优先于非静态,所以静态代码块优先于构造方法执行。
  4. 典型用途:用来一次性地对静态成员变量进行赋值。

Arrays类

两个常用的方法

  1. public static String toString(数组): 将参数数组变成字符串
  2. public static void sort(数组): 按照默认升序对数组的元素进行排序。

Math类

常用方法

  1. public static double abs(double num): 获取绝对值
  2. public statiic double ceil(double num): 向上取整
  3. public static floor double floor(double num): 向下取整
  4. public static long round(double num): 四舍五入