- 最简单的类 class A{ } 前面没有属性,大括号中没有行为,这可以看做是最简单的类
- 创建一个对象,也就是我们通常说得new一个对象 A obj = new A();
- 类是定义,是规范,是“死”的东西,就像菜谱一样
- 对象obj是实例,是类的一个实现,是一个具体的东西,比如一盘菜,对象是根据类制作出来的
不同的对象的内存地址是不一样的,但是他们的类型是一样的。就好比两个人,他们的性别是一样的,但是外貌是不一样的。
- A obj = new A();
- obj可以看作是内存中一个对象(包括若干个数据)的句柄
- 在C/C++中,obj称为指针,在java中称为Reference
- 对象赋值是Reference赋值,而基本类型是直接值拷贝
一、基本类型赋值和普通对象赋值的不同
public class ReferenceTest {
public static void main(String[] args){
int num1 = 5;
int num2 = num1;//这个赋值相当于值的拷贝过程 基本值拷贝
System.out.println("num1: "+ num1 + ", num2: " + num2);
num2 = 10;
System.out.println("num1: "+ num1 + ", num2: " + num2);
MyNumber obj1 = new MyNumber();
MyNumber obj2 = new MyNumber();
System.out.println(obj1.num);
System.out.println(obj2.num);
System.out.println("==========接下来输出新值=======");
obj2 = obj1;
obj2.num = 10;
System.out.println(obj1.num);
System.out.println(obj2.num);
}
}
public class MyNumber{
int num = 5;
}
创建对象我们可以这样理解,该语句包含了四个动作:
- 右边的new MyNumber,是以MyNumber类为模板,在堆空间里创建一个MyNumber类对象
- 末尾的()意味着在对象创建之后立即调用MyNumber类的构造函数,对刚生成的对象初始化。如果MyNumber中没有构造函数,java会自动补上一个默认的构造函数。
-比如
编译器自动生成构造函数 |
---|
- 左边的MyNumber obj1 创建了一个MyNumber类引用变量。所谓MyNumber类引用,就是以后可以用来指向MyNumber对象的对象引用
- 操作符“=” 使对象引用指向刚创建的那个MyNumber类对象
和以前学C语言一样,那么这句创建对象的语句也可以拆成两部分:
MyNumber obj1
obj1 = new MyNumber();
从上面可以看到有两个实体,一个是对象引用变量,一个是对象本身。
基本类型的变量值少,可以直接拷贝;对象包含多个值,不容易复制,所以赋值采用共享同一块内存区域
一个类可以创建出无数个对象,但是这些对象不可能都叫一个名字。但是如果对象没有名字,我们就无法访问他们。所以我们只能通过对象引用来间接访问对象。
运行结果
num1: 5, num2: 5
num1: 5, num2: 10
5
5
==========接下来输出新值=======
10
10
总结:
- 类是规范,对象是根据规范产生出的实例
- 基本型别赋值是拷贝赋值,对象赋值是reference赋值
- 类成员变量有初值,函数临时变量必须初始化
public class ArgumentPassingTest {
public static void main(String[] args){
int a = 1,b = 2;
swap(a, b);
System.out.println("a is "+ a + ", b is " + b);//a = 1, b = 2
MyNumber obj1 = new MyNumber();
MyNumber obj2 = new MyNumber();
obj2.num = 10;
swap(obj1, obj2);
System.out.println("obj1 is " + obj1.num + ", obj2 is "+ obj2.num);
}
public static void swap(int m, int n){
int s = m;
m = n;
n = s;
}
public static void swap(MyNumber obj3, MyNumber obj4){
int s = obj3.num;
obj3.num = obj4.num;
obj4.num = s;
}
}
运行结果
a is 1, b is 2
obj1 is 10, obj2 is 5
二、函数临时变量初始化
public class Initialization {
boolean v1;
byte v2;
char v3;
double v4;
float v5;
int v6;
long v7;
short v8;
public static void main(String[] args){
Initialization obj = new Initialization();
System.out.println("The initial value of boolean variable is " + obj.v1);
System.out.println("The initial value of byte variable is " + obj.v2);
System.out.println("The initial value of char variable is " + obj.v3);
System.out.println("The initial value of double variable is " + obj.v4);
System.out.println("The initial value of float variable is " + obj.v5);
System.out.println("The initial value of int variable is " + obj.v6);
System.out.println("The initial value of long variable is " + obj.v7);
System.out.println("The initial value of short variable is " + obj.v8);
int a;
//System.out.println(a); //error, a 没有初始化
}
}
运行结果
The initial value of boolean variable is false
The initial value of byte variable is 0
The initial value of char variable is
The initial value of double variable is 0.0
The initial value of float variable is 0.0
The initial value of int variable is 0
The initial value of long variable is 0
The initial value of short variable is 0