# 类的定义

  • 对象是类的实例,类是对象的抽象

  • 类可被认为是一种自定义的数据类型,可以使用类来定义变量

  • 类中的成员:字段(成员变量)、构造器、方法、初始化块、内部类(包括接口、枚举)

  • 外部类只能有两种访问控制级别:public 和 缺省

  • 定义类的语法格式

    [修饰符] class 类名 {
        0-N 成员变量(字段) // 描述类具有的特性,对象的状态
        0-N 构造器定义
        0-N 方法            // 描述类具有的功能,对象的行为
    }
    
    1
    2
    3
    4
    5

# 对象的创建和操作

  • 对象实例化过程:
    1. 根据类及其父类的字段在堆中为该对象的所有实例变量分配内存;
    2. 对这些实例变量执行初始化,其初始化顺序是:先执行初始化块或声明实例变量时指定的初始值(它们的执行顺序与它们在源代码中的排列顺序相同),再根据传入的实参列表执行对应构造器里指定的初始值
    3. 由 new 运算符返回对象的引用地址 给 该对象的引用变量(栈内存)。
  • 类或实例访问成员变量或方法的语法:类.类变量|方法 或者 实例.实例变量|方法
// 定义一个 Person 类
class Person {
    String name;
    void coding() {}
}
// 测试类
class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person(); // 创建一个对象 p
        p.name = "Admin";
        p.coding();
    }    
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# static 修饰符

  • static 修饰的成员(类成员:类变量、类方法、静态初始化块、静态内部类)
    1. 随着所在类的加载而加载,优先于该类对象存在(当字节码被加载进 JVM 时类成员就存在了,而对象是后来 new 出来的)
    2. 被该类所有对象所共享
    3. 可以直接用类名调用
  • static 修饰的成员(实例成员:实例变量、实例方法、普通初始化块、实例内部类)
  • static 修饰的成员(属于类)及构造器不能直接访问没有 static 修饰的成员(属于对象)
  • 局部变量不属于任何类或实例,不能使用 static 修饰;不能修饰构造器
  • static 修饰的方法中不能使用 this 或 super 引用(static 强调的是类,this 和 super 强调的是对象)

# this 关键字

当一个对象创建之后,JVM 会分配一个引用自身的引用:this

# 存在位置

  • 构造方法中,代表正在初始化的对象
  • 实例方法中,代表调用此方法的对象

# 使用 this

  1. 构造器重载时的互调 this([参数]); (必须作为构造方法中的第一条语句),一般地,是少参数的构造器调用多参数的构造器(将功能都写在多参数的构造器中)
  2. 解决实例方法中成员变量和参数(局部变量)之间的二义性,必须使用
  3. 同类中实例方法间互调(调用者是 this,不建议省略)
  4. 实例方法将 this 作为参数传递给另一个方法
  5. 将 this 作为方法的返回值(链式方法编程)

# 构造器

# 作用

  • 创建对象(必须和 new 一起使用,通过 new 关键字来调用某个类的构造器)
  • 完成对象字段(实例变量)的初始化(手动赋值)

# 特点

  • 构造器名与类名相同(首字母大写)
  • 不用定义返回值类型(缺省的返回值类型是当前类)
  • 构造器体中不需要 return 语句(缺省的返回值是当前创建对象的引用)

# 默认构造器

编译器在编译源文件的时候产生的缺省的构造器

  • 符合构造器体特点
  • 没有形参
  • 没有构造器体
  • 访问权限修饰符与所在类的访问权限修饰符相同
  • 显式定义了构造器之后,默认的构造器就没有了

# 构造器的重载

public class Person {
    private String name;
    private int age;
    
    /* 默认构造器(编译器产生的)
    public Person() {}
    */
    
    // 创建对象,初始化 name
    public Person(String name) {
        this(name, 0);
    }

    // 创建对象,初始化 name 和 age
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 此处省略 name 和 age 的 setter 和 getter 方法
}

class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person("Admin", 28); // 创建对象 p,并初始化
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 封装(Encapsulation)和隐藏

  • 把对象的状态和行为封装成一个整体,隐藏对象的内部信息和实现细节,不允许外部直接访问,对外暴露方法来实现对内部信息的操作和访问
  • 优点:安全性、重用性、低耦合性
  • 一般地,字段使用 private 修饰(私有化),拥有实现细节的方法使用 private 修饰,一般的方法使用 public 修饰
public class Person {
    private String  name; // 字段使用 private 私有
    private boolean man;

    // 提供 public 修饰的 getter、setter 方法访问本类中的私有字段
    public String getName() {
        return name;
     }
    public void setName(String name) {
        this.name = name;
    }
    
    public boolean isMan() {
        return man;
     }
    public void setMan(boolean man) {
        this.man = man;
    }    
}

class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person; // 通过无参数构造器创建对象 p
        p.setName("Sdky");
        p.setMan(true);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 设置和获取对象的数据

  • 创建对象并给对象设置初始值的两种方式:

    1. setter 注入(属性注入):先通过无参数构造器创建出一个对象,再通过对象调用相应的 setter 方法
    2. 构造注入:直接调用带参数的构造器,创建对象的同时完成对象字段的初始化
  • 获取对象的数据:getter 方法

# package、import 和 import static

# package 语句

  • 作用:把一个类放在指定的包结构下

  • 包命名规则:域名倒写.模块名.组件名

  • 语法格式

    // package 包名.子包名.子子包;
    // 必须把该语句作为 Java 文件中的第一条非注释性语句
    package com.example.hello;
    
    1
    2
    3
    1. 编译命令:javac -d . PackageDemo.java // 表示在当前路径下先生成与包名层次相应的文件结构,再在包下生成字节码文件(如果编译 Java 文件时不使用 -d 选项,编译器不会为 Java 源文件生成相应的文件结构)
    2. 运行命令:java com.example.hello.PackageDemo
  • Java 的常用包

    • java.lang:Java 语言的核心类,如 String、Math、System 和 Thread 类等
    • java. util:Java 的大量工具类/接口和集合框架类/接口,如 Arrays 和 List、Set 等
    • java. net:Java 网络编程相关的类/接口
    • java.io:Java 输入/输出编程相关的类/接口
    • java. text:Java 格式化相关的类
    • java.sql:Java 进行 JDBC 数据库编程的相关类/接口
    • java. awt:抽象窗口工具集的相关类/接口,用于构建图形用户界面(GUI)程序
    • java.swing:Swing 图形用户界面编程的相关类/接口,用于构建平台无关的 GUI 程序

# import 语句

  • 类的全限定名:包名.类名 java.util.Arrays
  • 在一个类中使用非同包的类和非 java.lang 包下的类,要使用类的全限定名
  • 使用 import 可以省略写包名;而使用 import static 则可以连类名都省略
  • import 语句应该出现在 package 语句(如果有的话)之后、类定义之前
  1. 导入指定包下某个类或全部类
import java.util.Arrays; // 导入 java.util 包下的 Arrays 类
import java.util.*; // 导入 java.util 包下所有被当前类使用到的类
1
2
  • 注意:Java 默认为所有源文件导入 java.lang 包下的所有类,但不包括其子包下的类
  1. 导入指定类中的 static 成员(语法糖),但无法导入与 java.lang.Object 类中的方法名相同的方法,如 toString,equals
// import static 类的全限定名.该类中的 static 成员名;
import static java.util.Arrays.sort;
import static java.util.Arrays.*;
1
2
3
Updated at: 2020-08-09 01:36:43