要创建一个对象,我们用关键字new 并紧跟类名以及()来触发它的构造函数。
构造函数没有返回值,因为他总是返回它数据类型的对象的引用,每当用例调用了new(),系统都会:
- 为新的对象分配内存空间
- 调用构造函数初始化对象中的值
- 返回该对象的一个引用
我们可以用同一个类创建无数对象--每一个对象都有自己的标示(内存地址),且所储存的值和另一个相同类型的对象可以相同也可以不同
附:和原始数据类型不同的是,对象变量关联的是指向对象的引用而并非数据类型的值本身
那参数传递来说: 首先Java默认是把指针封装起来,以免乱用,
原始数据类型对象传递的是值,可以这么解释,
void function(int a){}
由于Java默认将指针封装以来了,参数形式(int a)实际上相当于(int a = new int()),int的type实际为integer类,如:
public static void main(String[] args){
Integer a = new Integer(5);
System.out.println(a);
}
输出为5<br>
(但Java对于简单类型变量,是无法直接获得变量类型的;
我们可以通过写一个方法来获取,如:
public class test1 {
public static void main(String[] args)
{
int i=1; //int类型变量
System.out.println(getType(i)); //打印变量类型为int
}
public static String getType(Object o){ //获取变量类型方法
return o.getClass().toString(); //使用int类型的getClass()方法
}
}
输出为:class java.lang.Integer
Process finished with exit code 0
对于包装类型变量,是可以直接获得的,变量名称.getClass().getName();)
这是由于Java的封装指针引起的,在声明原始数据类型变量int a,实际上系统为他分配了一个新的内存空间以及内存地址,
例如:
int a = 1;
int b = a;
//实际上相当于
int a = new int();
int b= new int(); b = a;
根据类创建对象的原则:系统都会:
- 为新的对象分配内存空间
- 调用构造函数初始化对象中的值
- 返回该对象的一个引用
综上所述:原始数据类型参数传递是值传递:新的引用(即内存地址)指向新的内存空间中存储的新的值。
再来说说,引用传递: 如:
public class Test {
public static void main(String[] args){
Car car = new Car();
Test test = new Test();
test.function(car);
}
void function(Car car){
}
}
class Car{
}
由于Test是一个类,由你自己定义的类,由你自己定义的抽象数据类型,其中包括一组值以及一组对这些值的操作集合
,他并没有经过Java内部的指针的封装(除非你自己将他封装), 所以参数(Car car)并没有通过new关键字创建一个实例对象, 只是声明了一个变量,在栈区给他分配了一个局部变量的内存空间,当test.function(car)时,你把实例(Car car = new Car()根据第三条规则:3.返回该对象的一个引用) car()的引用(内存地址)传给参数(Car car) 参数car指向对象实例car的内存地址 综上所述:引用数据类型参数传递即为引用传递
每当用例调用了new(),返回的是该对象的一个引用。
原始数据类型经Java本身将指针封装,以免乱用,所以即使未使用new关键字也会为原始数据类型每声明一个原始数据类型变量并赋值(只要不是类字段和数组,其它变量一律要赋值。)都将
- 为新的变量分配内存空间
- 为变量分配值
- 返回该对象的一个引用
也就是说原始数据类型相当于默认new了一个实例
而引用类型如Car car只是声明了一个变量而已,并未指向任何内存地址