-
什么是类:
类:类是一个模板,它描述一类对象的行为和状态。
编写一个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
直接创建对象。
-
对象的使用:
- 对象创建(实例化Java对象的过程就是使用类去创建对象的过程)
- 使用
new
关键字和类的构造器来创建对象。 - 对象创建后,会分配内存,并初始化其状态。
- 对象引用
- 创建对象后,通常通过引用变量来操作对象。
- 引用变量是一个指针,指向对象在内存中的地址。
- 成员访问
- 通过对象的引用调用其成员变量和成员方法。
- 例如:
objectReference.methodName()
或objectReference.memberVariable
。
- 封装
- 对象通常将数据(成员变量)封装起来,只通过公共方法(成员方法)暴露操作这些数据的方式。
- 方法调用
- 对象可以调用其定义的方法来执行特定的行为。
- 方法可以是成员方法,也可以是静态方法。
- 数据封装
- 对象的数据应该被保护,避免外部直接访问和修改。
- 使用访问修饰符(如
private
)来限制对成员变量的直接访问。
- 构造器的使用
- 使用构造器来初始化对象的状态。
- 可以有默认构造器、有参构造器和构造器重载。
- 对象作为参数传递
- 对象可以作为参数传递给方法。
- 方法可以通过引用来修改对象的状态。
- 对象作为返回值
- 方法可以返回对象的引用。
- 对象的比较
- 使用
==
操作符比较对象引用是否相同。 - 使用
.equals()
方法比较对象的相等性,这需要正确重写equals()
方法。
- 对象的生命周期
- 对象的生命周期从创建开始,直到没有任何引用指向它,且垃圾回收器回收其占用的内存。
- 垃圾回收
- Java具有自动垃圾回收机制,用于回收不再使用的对象所占用的内存。
- 对象的克隆
-
使用
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.每次创建一个匿名对象都是一起全新的对象,即每次创建的匿名对象都是不同的对象,它们在堆内存中具有不同的地址。而且一个匿名对象只能使用一次。