17370845950

Java类与对象的基本概念与定义
Java中类是编译器识别的模板,对象是new创建的实例;类名须PascalCase且不能为关键字;构造方法名须与类名一致;static成员属类,实例成员属对象。

Java 中的类与对象不是抽象概念,而是编译器可识别、JVM 可执行的具体结构。类是模板,对象是实例;没类就 new 不出对象,没对象就调用不了非静态成员。

类的定义必须包含 class 关键字和合法标识符名

类定义以 class 开头,后接类名(遵循 PascalCase),不能是关键字(如 intclass 自身)、不能含空格或特殊符号。类体用 {} 包裹,即使为空也不能省略。

class Person {
    String name;
    int age;
}

常见错误包括:

  • class Person {} 写成 Class Person {}(大小写敏感)
  • 类名用下划线 person_info 或数字开头 2ndPerson,编译直接报错 error: class, interface, or enum expected
  • 在方法内部定义类(非静态嵌套类除外),会触发 error: illegal start of type

对象创建依赖 new + 构造方法调用

对象不是声明出来的,是运行时通过 new 运算符在堆上分配内存并初始化得到的。哪怕类没显式写构造方法,编译器也会插入一个无参默认构造方法;一旦写了任意构造方法,这个默认构造就消失。

Person p1 = new Person(); // 调用默认构造
Person p2 = new Person("Alice", 30); // 调用自定义构造

容易踩的坑:

  • Person p; 只是声明引用变量,此时 p == null,访问 p.nameNullPointerException
  • 构造方法名拼错(比如写成 persom()),它就变成普通方法,new Person() 找不到匹配构造,编译失败
  • 构造方法里调用 this(...) 必须是第一行,否则报 error: call to this must be first statement in constructor

实例成员 vs 静态成员:生命周期和访问方式完全不同

static 修饰的字段或方法属于类本身,在类加载时初始化,所有对象共享一份;不加 static 的才是实例成员,每个对象独立拥有。

class Counter {
    static int count = 0;  // 类变量,所有 Counter 对象共用
    int value = 0;         // 实例变量,每个对象一份
    static void incCount() { count++; } // 静态方法只能访问静态成员
    void incValue() { value++; }          // 实例方法可访问两者
}

典型误用:

  • 在静态方法(如 main)中直接访问 value,报 error: non-static variable value cannot be referenced from a static context
  • 把本该每个对象独立的状态(如用户 ID、连接句柄)声明为 static,导致多对象间互相覆盖
  • new Counter().count 访问静态字段——语法合法但语义误导,应统一用 Counter.count
类和对象的边界其实很硬:类决定“能有什么”,对象决定“此刻是什么”。很多运行时异常(比如 NPE、NoClassDefFoundError)都源于混淆了这两层——要么忘了 new,要么在类还没加载时就试图用它的静态成员。