@类
一、类
类是具有某种特征和行为的“事物”的抽象。 而“事物的特征”用变量来表示。
public class Dog {
String name;
double height;
double weight;
String color;
}
上述代码中,定义了类Dog,然后通过定义 String 类型的 name ,double 类型的 height ,double 类型的 weight 以及 String 类型的 color 来表示其特征,而在定义的变量之前加关键字 static 修饰的称为类变量 (class variable) 。
例如如下代码定义内一个 Rabbit类 ,其中 age 被设定为 类变量,拥有初始值。
public class Rabbit {
String name;
String color;
static int age = 2;
double weight;
}
在之后声明一个 Rabbit 类型的引用类型,并在堆内存中分配内存空间(根据 Rabbit类 确定空间大小)。
public class RabbitTest {
public static void main(String[] args) {
Rabbit r1 = new Rabbit();
System.out.println(r1.weight);
System.out.println(r1.color);
System.out.println(r1.name);
System.out.println(Rabbit.age);
r1.color = "白色";
r1.name = "小白兔";
r1.weight = 13.7;
System.out.println(Rabbit.age);
System.out.println(r1.color);
System.out.println(r1.name);
System.out.println(r1.weight);
}
}
在之后的通过 “对象名.实例变量名” 形式来访问 实例变量以及通过 “类名.类变量名” 形式来为 类变量赋值 或 获取类变量的值,可以发现,实例变量在没有赋值前都是默认值,String类型 为NULL,double类型 是0 .0 。
0.0
null
null
2
2
白色
小白兔
13.7
Process finished with exit code 0
类变量是通过 “类名.类变量名” 进行访问,在方法中赋过值,之后访问时不被再次赋值时,依旧为初始赋值。
所以即使没有对 实例变量 进行赋值,在Rabbit r1 = new Rabbit();
中就已经再声明一个 Rabbit类型 的引用类型,并在堆内存中分配内存空间(根据 Rabbit类型 确定空间大小)后,就为所有实例变量赋予默认值。
二、实例初始化过程
在创建类的时候如果同时使用了 实例初始化块 (instance initializer) 和类名同名且没有返回值的特殊构造方法时,会先优先执行 实例初始化块 (instance initializer) 。
public class Elephant {
String name;
String kind;
{
System.out.println("[实例初始化块 (instance initializer)]: 如果"+ name +"是非洲象,那么要重点保护");
}
Elephant(){
System.out.println("[构造方法]: 非洲象是濒危物种");
}
}
而这段代码运行结果为下:
[实例初始化块 (instance initializer)]: 如果null是非洲象,那么 要重点保护
[构造方法]: 非洲象是濒危物种
null
Process finished with exit code 0
由此可见实例初始化一共分为三大步:
1.在堆内存空间中分配内存空间(根据类确定内存空间)
2.为实例变量赋予默认值
3.执行实例初始化操作
(1)执行实例初始化块
(2)执行构造方法
4.将堆区中的Elephant实例的首地址赋值给等号之前的变量
三、创建实例并调用方法的过程
- 在堆内存中开辟空间,并为实例变量赋予默认值。
- 执行实例初始化操作
- 将堆内存中新创建的实例的首地址
在堆中有 “对象头”
,时表明该对象是 哪一个类 的对象。
四、类方法传参类型
类方法不需要传参;方法(实例方法)会自己传一个 this
的参数。类是创建实例的模板。
五、返回值return
return
的是操作数栈栈顶的数。运算的时候数据会随方法的出栈而出栈,之后(如果要返回)将要返回的值重新 “复制”(赋值) 给栈顶。
所以的方法在执行完之后都有 return
,表示方法已经结束。
抛出异常也会使方法终止,从而从虚拟机栈中弹出当前方法对于的栈帧。
其中它和之前的 break
和 continue
不同以及其他退出方法:
break
: 是结束循环,用于完全结束所在循环,跳出该循环。
continue
:是结束本次循环(不会执行 continue
之后的代码),接着进行下一次循环。
return
:是结束一个方法,即将该方法出栈。
System.exit(0)
:正常终止整个程序,终止当前运行的Java虚拟机。这个参数用作状态代码;按照约定,非零状态代码表示异常终止。