面向对象编程中最核心的内容就是类,类可以看作函数的容器,但类更多地表示的是「自定义数据类型」。
定义一个类:
public class Point {
public static final double PI = 3.14149;
public int x;
public int y;
public double distance() {
return Math.sqrt(x x + y y);
}
}
复制代码
变量和方法
实例变量
public class Point {
//实例变量
public int x;
public int y;
public double distance() {
return Math.sqrt(x x + y y);
}
}
复制代码
实例方法
public class Point {
//实例变量
public int x;
public int y;
//实例方法
public double distance() {
return Math.sqrt(x x + y y);
}
}
复制代码
静态变量
静态变量也称为类的变量
public class Point {
// 静态变量
public static final double PI = 3.14149;
}
复制代码
静态方法
静态方法也称为类的方法
public class Point {
//静态方法
public static double distance() {
return 2 * 2;
}
}
复制代码
变量默认值
实例变量初始化
声明变量并赋值
声明变量后在初始化代码块赋值
int x = 1;
int y;
//初始化代码块
{
y = 2;
}
复制代码
静态变量初始化
声明变量并赋值
声明变量后在静态初始化代码块赋值
static int STATICONE = 1;
static int STATICTWO;
//静态初始化代码块
{
STATIC_TWO = 2;
}
复制代码
类的构造方法
默认构造方法
每个类至少要有一个构造方法,在通过 new
关键字创建对象的过程中会被调用,构造方法可以省略,Java 编译器会自动生成一个默认构造方法。但是一旦我们自定义了一个构造方法,Java 就不会再自动生成默认的构造方法。
私有构造方法
构造方法可以是私有的,即修饰符可以为 private
,定义了私有构造方法的类有如下特点:
public class TestClass {
public static final String HOST = "12344";
private TestClass() {
}
}
TestClass testClass = new TestClass(); // error 不能创建实例
TestClass.HOST // Ok
复制代码
public class TestClass {
private static TestClass mInstance;
private TestClass() {
}
public static TestClass getInstance() {
if (null == mInstance) {
mInstance = new TestClass();
}
return mInstance;
}
}
复制代码
public class TestClass {
public TestClass(int x) {
this(x, 10);
}
private TestClass(int x, int y) {
}
}
复制代码
类和对象的生命周期
在程序运行的时候,当第一次通过 new 创建一个类的对象时,或者直接通过类名访问类变量和类方法时,Java 会将类加载进内存,为这个类分配一块空间,这个空间会包括类的定义、变量和方法信息,同时还有类的静态变量,并对静态变量赋值初始值。
类加载进内存后,一般不会释放,直到程序结束。一般情况下,类只会加载一次,所以静态变量在内存中只有一份。
当通过 new 创建一个对象的时候,在内存中,会存储这个对象的实例变量值,每做 new 操作一次,就会产生一个对象,就会有一份独立的实例变量。
对象的释放是被 Java 用垃圾回收机制管理的,大部分情况下,我们不用太操心,当对象不再被使用的时候会被自动释放。
对象和数组一样,有两块内存,保存地址的部分分配在栈中,而保存实际内容的部分分配在堆中。栈中的内存是自动管理的,函数调用入栈就会分配,而出栈就会释放。
评论