Skip to content

编程进阶 ​

只有基础是无法写出来牛逼的属性的。

Java对象和类 ​

Java是一门面向对象的编程语言。什么是对象? 简单来说,对象(Object)是类(Class)的一个具体实例,它包含了数据(属性)和可以对这些数据执行的操作(方法)。

我们可以用一个更形象的比喻来理解:
想象一下“汽车”这个概念。

类 (Class) - 概念/蓝图 ​

  1. “汽车”是一个类。它定义了所有汽车共有的特征(属性)和行为(方法)。
  2. 例如,汽车类可能有这些属性:品牌、颜色、速度、油量。
  3. 汽车类可能有这些方法:启动、加速、刹车、加油。

对象 (Object) - 具体的实例 ​

  1. 你停在楼下的那辆红色的丰田卡罗拉,就是“汽车”这个类的一个具体对象。
  2. 另一个朋友开的那辆蓝色的本田雅阁,是“汽车”这个类的另一个对象。
  3. 每个对象都有自己具体的属性值(比如,你的车品牌是“丰田”,颜色是“红色”;朋友的车品牌是“本田”,颜色是“蓝色”),但它们都遵循“汽车”这个类定义的规则和行为。

每个对象在内存中都有一个唯一的标识(可以理解为内存地址),用于区分不同的对象,即使它们的属性值完全相同。

Java静态方法和非静态方法 ​

静态方法和非静态方法的核心区别,最根本的区别在于调用方式和所属对象:

  • 静态方法: 属于类本身。可以直接通过类名来调用,而不需要创建该类的对象。
  • 非静态方法: 属于类的实例(对象)。必须先创建该类的一个对象,然后通过这个对象的引用来调用。

静态方法 ​

  • 定义: 使用 static 关键字修饰的方法。
  • 调用方式: 类名.方法名(参数)
  • 特点:
    1. 需实例化: 可以在不创建类的任何对象的情况下直接调用。这使得它们非常适合存放那些与类相关但不依赖于具体对象状态的工具性或辅助性功能。
    2. 内存: 静态方法在类加载时就存在于内存中,并且只有一份拷贝,被该类的所有实例共享。
    3. 访问限制:
      可以直接访问 类的静态变量和其他静态方法。
      不能直接访问 类的非静态变量和非静态方法。因为非静态成员属于具体的对象,而静态方法调用时可能还没有创建任何对象。
      如果静态方法需要访问非静态成员,必须先创建该类的一个对象,然后通过这个对象来访问。
    4. 生命周期: 从类加载开始,到类卸载结束。

非静态方法 ​

  • 定义: 没有使用 static 关键字修饰的方法。
  • 调用方式: 对象引用.方法名(参数)
  • 特点:
    1. 需要实例化: 必须先使用 new 关键字创建类的一个对象,然后才能通过这个对象调用其非静态方法。
    2. 内存: 每当创建一个类的新对象时,该对象就拥有了自己的一套非静态方法(虽然方法代码是共享的,但方法操作的是该对象自己的数据)。每个对象的非静态成员变量是独立的。
    3. 访问权限:
      可以自由访问 该对象的所有成员,包括非静态变量、非静态方法、静态变量和静态方法。
    4. 生命周期: 与它所属的对象的生命周期一致。当对象被垃圾回收时,其非静态方法也随之失效。

在JavaScript中实例化 ​

在 非静态方法→特点→需要实例化 中说到,“必须先使用 new 关键字创建类的一个对象”。
假设我们想要 ArrayList 的实例,并且不想用之前说到的 Arrays.asList() 方法。

JavaScript
var list = new ArrayList() //无参构造
var list = new ArrayList(...) //有参构造

ArrayList() 就是使用 ArrayList 这个类的构造方法。
这里的 list 就是 ArrayList 这个类的实例(对象)

无参构造 ​

我们使用 new ArrayList() 即可,此时会生成一个空列表,他的初始容量为 10。

有参构造 ​

基于java8来说

我们使用 new ArrayList(20),这样会生成一个空列表,他的初始容量为 20。
我们还能使用 new ArraysList(其他list),这样会生成一个新的并且装有了 其他list 这个列表的列表。
这就是有参构造。

它的参数为什么是一个 20 或 其他list?而不是比如 true 或 "1" 这样的呢?

Java
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, Serializable
{
    public ArrayList(int initialCapacity) {
        ....
    }
    public ArrayList() {
        ...
    }
    public ArrayList(Collection<? extends E> c) {
        ...
    }
    ...
}

别被吓到,你无需关心 <E> <? extends E> extends ... implements ... 这些东西。
可以看到 ArrayList 这个类只设定了 3 个构造方法,其中包含 2 个有参构造方法,1 个无参构造方法。构造方法是一种特殊方法。它们与其他方法的显著不同就是:他们的方法名与类名相同,且没有返回值。

我们使用 new ArrayList(20) 就是使用了 public ArrayList(int initialCapacity) 这个构造方法。new ArraysList(其他list) 就是 public ArrayList(Collection<? extends E> c) 这个构造方法。无参构造就是 public ArrayList()。

构造方法的参数是由它的开发者决定(或者说由程序的需求决定的)的,我们无法修改,只能使用既有的构造方法。