为了更好的理解这些基本概念,在这里把基本类型变量和引用类型变量作一个比较, 按惯例前者简称为引用,后者简称为变量;
我相信这里面的逻辑是一致的,因此假使站在引用的角度看待变量会是个什么感觉?
int a;
int a = 10;
声明一个整型变量a;
给a初始化为10;
这里实际上已经默认创建了一个类 叫做
public class Int{
};
这样 上面就可以陈述为 创建一个int类的对象a,把这个对象a初始化为10;因为它是Java自带的,因此不需要new,也就是新建的意思。
新建一个类,新建一个包,实质上都是在new一个尚未存在的事物;
话说回来,当我们新建一个非自带的类时,比如
public class Student{
};
这时,想创建一个Student类的对象,则需要new
Student a = new Student( );
此时默认调了一个无参构造
即
public class Student{
Student( ){
}
};
后面那个括号是参数列表容器吗(这个是我为了好理解自己捏造的概念)?说白了参数列表就是一个变量集合,也就是一个属性集,用来表征引用对象。
我们不可能创建一个不传参的引用对象,那没有实际意义,即不实例化的创建一个对象本身是不符合逻辑的。
因此抽象类才变的有了实用的逻辑意义。
反过来再来看int,假设它也有默认无参构造也需要new
public class Int{
int(){
}
};
int a;
int a = new int( );
一对比就知道这个是没有意义的,因为int已经是基本类型变量,你传参没有意义。
10 就是 10,这个整型对象10是一个基本元素。
一个Student类的对象a,不能说是a 就是10,你能说一个整数是10,但你不能说一个学生a是10;
你可以说a的年龄是10,由此我似乎明白了引用的深层意味;
引用对象a(注意相对于基本对象 10)的属性参数并没有存在栈中,栈中只是存了它,和它的地址;
它的地址就像一个路径指向堆中的变量
我们说a的年龄是10,名字张三,10、张三都保存在堆中。这个地址其实也是我们自己建立的:
public class Student{
Student( ){
}
};
Student a = new Student( );
此时仅仅是创建了一个对象a,并没有初始化(没有实例化)的状态;
我认为地址就是通过两段代码建立的对应的一个路径。
即Student这个关键字,它就是一个地址关键因素,因为假使
public class Student{
Student( ){
}
};
Teacher a = new Student( ); // 这个是要报编译错误,也就是典型的牛头对马嘴
Teacher a = new Teacher( ); /这个就跟Student无关,即建立关联路径(地址),就是风马牛不相及;
那接下来讲数组。
数组也是引用,我们知道int[ ] a = new int[ 4 ];
是声明(创建了)一个整型数组对象a,这时 a ( a 也是一个变量)的类型就会是一个整型数组,这个数组里面包含着一些整型变量;
重点来了,当我们给a里面的元素初始化时,我们是这么干的,以给a的第1个元素初始化来说!
a [ 0 ] = 10;
注意这里不需要new,为什么?因为前面已经说了,int是基本类型变量,因此不要要new;
但是!你给引用数组(int[ ]算是基本数组)初始化你就得new了而且传参,因为引用数组里面的成员是引用;
创建一个Student类的对象,则需要new
Student a = new Student( );
传参了就是初始化这个a
这两步合在一起即声明并初始化(实例化)1个引用对象a;
声明并初始化1个基本对象就不需要new了 比如 int a = 10;
注意区分辨析概念
创建引用数组对象 和为引用数组对象中的元素赋值 都需要new 前者new个引用数组对象,后者new个引用类型的引用数组的元素;