一、对象
对象实例化过程:
Dog d1 = new Dog();
1.在栈内存中建立指向新对象的引用变量d1
2.在堆内存中分配用于存储对象d1所需要的内存空间
3.将堆内存空间的参考地址赋值给d1
匿名对象:
只开辟了堆内存空间,而没有栈内存指向的对象
特点:
1.没有栈内存指向
2.只能使用一次,就会变成无法寻找的垃圾对象,会被GC回收
对象的比较
- ==:比较两个对象的内存地址值(引用地址)是否相同
- equals():比较两个对象的内容是否一致
堆内存和栈内存的区别
栈(stack) 是由编译器自动分配的和释放的一块内存区域
- 优:存取速度比较快,仅次于寄存器,栈中的数据可以共享
- 缺:存在栈中的数据大小与生存周期是固定的,缺乏灵活性
- stack overflow(堆栈溢出)
堆(heap) 是一个程序在运行动态分配的内存区域
- 优:动态地分配内存大小,可以“按需分配”,不需要提前告诉编译器,使用完毕后,GC会自动回收这些不再使用的内存块,
- 缺:需要运行时才能动态分配,存取速度相对于栈内存较慢
- 内存碎片(不可用的非连续的小块内存)
二、方法
方法的签名:名称+参数列表(参数类型和参数个数)
方法的重载
使用方法名相同但参数列表不同的方法签名机制
- 方法名称相同
- 参数列表不同(个数,顺序,类型,至少一样不同)
- 返回类型和修饰符不做要求
构造方法Constructor
用于构造对象时初始化成员变量,在创建对象时自动“隐式”执行。
特点:
- 构造方法名称必须和所属的类名保持一致
- 构造方法没有返回值,也不可以使用void
- 构造方法可以被重载
- 构造方法不能被static和final修饰
- 不能被继承,子类使用父类的构造方法需要使用super关键字
如果类中没有声明任何构造方法的话,编译器会自动为该类添加一个无参构造方法。程序中一旦显式声明了构造方法,那么默认的“隐式的”构造方法就不会被编译器生成,需要手动声明一个无参构造方法。
构造方法私有化
实例化对象只能在私有化构造方法所属类中产生。通过这种方式可以确保了一个类只能创建一个实例化对象,用于单例设计模式。
代码块
使用{}将多行代码封装在一起,形成一个独立的代码区域,这就构成了代码块。
代码块不能独立运行,须依赖其他配置。
- 普通代码块 ——方法名后或者方法体内使用{} 括起来的代码块,不能独立存在类中,需要跟在方法名后,通过方法调用。
- 构造代码块 ——直接在类中定义,和构造方法一起在对象生成的时候调用,调用时机早于构造方法,可以用来初始化不同构造方法共有的成员变量,提高代码复用性。
- 静态代码块 ——使用static修饰,用来初始化静态成员变量,类加载时就会执行,是最早执行的代码块,优于构造代码块,优于main方法,执行级别最高
- 同步代码块