• 什么是类:

    :类是一个模板,它描述一类对象的行为和状态。

    编写一个Java类(添加属性):

    1.属性(成员变量)=访问修饰符+数据类型+变量名

    2.方法=访问修饰符+返回值类型+方法名+方法参数+方法体

  • 什么是对象:

    对象:对象是类的一个实例,有状态和行为。

  • 成员变量:
    • 定义:成员变量是定义在类中,但在方法之外的变量。它们属于类的实例(对象),每个对象都有自己的成员变量副本。
    • 作用域:成员变量的生命周期与对象的生命周期相同,它们在对象创建时初始化,并在对象被垃圾回收时释放。
    • 访问:成员变量可以通过对象的引用或通过直接实例化来访问。
    • 类型:可以是基本数据类型(如int, double等)或引用类型(如类、接口等)。
    • 默认值:Java为每种基本数据类型提供了默认值(如int的默认值是0,boolean的默认值是false),而引用类型则默认为null。
  • 成员方法:
    • 定义:成员方法是定义在类中,但不声明为static的方法。它们可以访问类的成员变量。

    • 作用域:成员方法的生命周期与对象的生命周期相同,但它们的执行依赖于对象的创建。

    • 访问:成员方法可以通过对象实例调用,也可以在类内部被其他成员方法调用。

    • 特点:

      • 可以有返回值,也可以没有(使用void类型表示无返回值)。
      • 可以访问类的私有成员变量和方法。
      • 可以被类的其他成员方法或对象调用。
  • 对象的实例化:(构造器:默认构造器,有参构造器,构造器重载):
  • 构造器(Constructors)

    定义:构造器是一种特殊的方法,用于在创建对象时初始化对象的状态。它的名字必须是类名,并且没有返回类型,甚至不使用void

  • 默认构造器(Default Constructor)

    定义:如果没有为类显式定义任何构造器,编译器会自动提供一个默认构造器。默认构造器没有参数,并且不执行任何操作或初始化。

    有显式和隐式之分。

&&:当一个类中没有构造器,就默认无参构造器。当有有参构造器,默认构造器就会失效。

  • 有参构造器(Parameterized Constructor)

    定义:有参构造器允许在创建对象时接受参数,这些参数用于初始化对象的状态。

  • 构造器重载(Constructor Overloading)

    定义:构造器重载是指在一个类中定义多个具有不同参数列表的构造器。这允许创建者通过不同的参数组合来初始化对象。

    代码示例:
    public class MyClass {
        // 成员变量
        private int value;
    
        // 默认构造器
        public MyClass() {
            System.out.println("Default constructor called");
        }
    
        // 有参构造器
        public MyClass(int initialValue) {
            this.value = initialValue;
            System.out.println("Parameterized constructor called with value: " + value);
        }
    
        // 另一个有参构造器,展示了构造器重载
        public MyClass(int initialValue, String name) {
            this.value = initialValue;
            System.out.println("Parameterized constructor called with value: " + value + " and name: " + name);
        }
    
        // 成员方法
        public void display() {
            System.out.println("Value: " + value);
        }
    }
    
    // 使用默认构造器实例化对象
    MyClass obj1 = new MyClass();
    
    // 使用有参构造器实例化对象
    MyClass obj2 = new MyClass(10);
    
    // 使用重载的构造器实例化对象
    MyClass obj3 = new MyClass(20, "lala");
    
    注意事项
    • 构造器不能被继承。
    • 构造器可以调用其他构造器,使用this()关键字。
    • 构造器可以是私有的,这样可以防止外部通过new直接创建对象。
  • 对象的使用:
  1. 对象创建(实例化Java对象的过程就是使用类去创建对象的过程)
  • 使用new关键字和类的构造器来创建对象。
  • 对象创建后,会分配内存,并初始化其状态。
  1. 对象引用
  • 创建对象后,通常通过引用变量来操作对象。
  • 引用变量是一个指针,指向对象在内存中的地址。
  1. 成员访问
  • 通过对象的引用调用其成员变量和成员方法。
  • 例如:objectReference.methodName()objectReference.memberVariable
  1. 封装
  • 对象通常将数据(成员变量)封装起来,只通过公共方法(成员方法)暴露操作这些数据的方式。
  1. 方法调用
  • 对象可以调用其定义的方法来执行特定的行为。
  • 方法可以是成员方法,也可以是静态方法。
  1. 数据封装
  • 对象的数据应该被保护,避免外部直接访问和修改。
  • 使用访问修饰符(如private)来限制对成员变量的直接访问。
  1. 构造器的使用
  • 使用构造器来初始化对象的状态。
  • 可以有默认构造器、有参构造器和构造器重载。
  1. 对象作为参数传递
  • 对象可以作为参数传递给方法。
  • 方法可以通过引用来修改对象的状态。
  1. 对象作为返回值
  • 方法可以返回对象的引用。
  1. 对象的比较
  • 使用==操作符比较对象引用是否相同。
  • 使用.equals()方法比较对象的相等性,这需要正确重写equals()方法。
  1. 对象的生命周期
  • 对象的生命周期从创建开始,直到没有任何引用指向它,且垃圾回收器回收其占用的内存。
  1. 垃圾回收
  • Java具有自动垃圾回收机制,用于回收不再使用的对象所占用的内存。
  1. 对象的克隆
  • 使用Cloneable接口和clone()方法创建对象的副本。

    代码示例:
    public class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void introduce() {
            System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
        }
    
        // Getters and setters
        // ...
    }
    
    public class Main {
        public static void main(String[] args) {
            // 对象创建
            Person person = new Person("Kimi", 30);
    
            // 成员访问
            person.introduce();
    
            // 对象作为参数传递
            displayPersonInfo(person);
        }
    
        public static void displayPersonInfo(Person p) {
            p.introduce(); // 调用对象的方法
        }
    }
    
  • 对象的销毁:(GC 不是万能的,可以回收new对象,但是系统资源不会被回收。)
  • 在Java中,对对象的销毁主要是由Java 的垃圾回收机制(Garbage Collector,简称GC)管理的,开发者一般无需显式地进行对象销毁。

  • 当一个对象在内存中不再被任何地方引用的时候,它就会被视为“垃圾”,这意味着它们已经不再需要,可以被销毁。一旦一个对象被判定为垃圾,Java的垃圾收集器就有可能在任何时间点将其销毁,以回收内存。

  • 在某些情况下,你可能需要在对象被销毁之前完成某些清理工作。这种情况下,你可以在类定义中加入一个finalize方法。finalize方法会在对象被垃圾收集器标记为要被销毁前调用。

  • 但需要注意的是,Java的垃圾回收机制并不是实时的,也就是说,即使一个对象不再被引用,也不确定垃圾回收器会在何时进行回收。除非系统内存资源紧张,垃圾回收器才会被触发运行。

  • 在Java中,对象的销毁是由Java的垃圾回收机制(Garbage Collector)自动处理的。当一个对象没有任何引用指向它时,那么这个对象就可能被垃圾收集器视为垃圾,进行回收。

  • 我们无法精确控制垃圾回收的具体时间,但是可以请求JVM运行垃圾收集器。然而,调用System.gc()也仅仅是建议JVM进行垃圾回收,具体是否执行还是由JVM决定。

    代码示例:
    public class TestGarbageCollection {
        public static void main(String[] args) {
            TestGarbageCollection t1 = new TestGarbageCollection();
            TestGarbageCollection t2 = new TestGarbageCollection();
     
            // 置空引用,使得对象成为垃圾
            t1 = null;
            t2 = null;
     
            // 建议JVM进行垃圾回收
            System.gc();
        }
        
        // 在类中定义finalize方法,在垃圾回收时会被调用
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            System.out.println("Object is garbage collected");
        }
    }
    
  • 匿名对象:
  • 匿名对象指的就是没有名字的对象,在使用中理解为实例化一个类对象,但是并不把它赋给一个对应的类变量,而是直接使用。

  • 匿名对象的使用:

    1.匿名对象本质上仍然是一个对象,所以它具备对象的所有功能

    2.每次创建一个匿名对象都是一起全新的对象,即每次创建的匿名对象都是不同的对象,它们在堆内存中具有不同的地址。而且一个匿名对象只能使用一次。