java关于实例化对象的问题

今天遇到一个很神奇的问题代码如下

Student s;

就是这样一行代码,这行代码到底表面了什么?s到底是引用还是什么?
到底也没有生成对象。

在java中,一切皆是对象。
Student s;
这句话的意思是申明了一个Student变量。因为Student是类类型,所以是引用类型的一种,所以是s是引用类型,存储在栈中,还没有申请内存空间,具体s的值是个错误的值,是个
任意的值,没有意义,直到new Student时,s的值才是申请的堆内存空间的地址,这个时候s的值才是有意义的

没有开辟内存空间,只是有一个空的句柄

楼上说得对,s只是个指针。

只有new的时候才开辟看见,把真实值在堆里面的地址赋值给s

定义变量 s 的类型为 Student,此时变量 s 并没有开辟内存空间,只是定义了指针,其值目前为 null

实例化有两种方法,其一是 将类型同为 Student 的值赋给 变量s;其二是new,即

s = (Student)object;
或者
s = new Student();

内存空间在new的时候会被开辟出来

这么写相当于
Student s = null;


Student s = new Student();
相当于
Student s;
s = new Student();

s是一个引用,它可以指向任何已经创建好的Student(或者它的派生类)的实例。
不用 = ,那么初始是null。好比int初始是0一样。
new Student();返回一个新的Student的对象实例(在没有变量接收以前它是匿名的),这个对象存储在堆上。
你甚至可以写
new Student().xxx();
调用xxx方法,也就是没有用任何变量接收它,单独成行,这个变量没有对应的饮用,而只是创建后被调用。

该语句声明了一个Student类型的引用变量,其价值未知,直到有一个对象被真正创建和分配给他,只简单声明了一个引用变量而没有创建对象,与Student s = null效果一样

在栈内存中增加一个s变量,没有指向

如果早先就声明Student是一个类的话,那么这个Student就是一个引用类型,Student s; s就代表它是属于Student这种引用类型的,好比定义一个Int i;
i就属于Int类型的变量。这里s就是一个Student的引用变量,不是它的实例化对象,s在栈中产生,主要目的应该是要指向new Student()实例化对象的
地址。 求求给个分急用

在java中,一切皆是对象。
Student s;
这句话的意思是申明了一个Student变量。因为Student是类类型,所以是引用类型的一种,所以是s是引用类型,存储在栈中,还没有申请内存空间,具体s的值是个错误的值,是个
任意的值,没有意义,直到new Student时,s的值才是申请的堆内存空间的地址,这个时候s的值才是有意义的

对于Java而言,首先要分清楚基本数据类型和引用类型

对于基本数据类型(char byte short int long double )是直接分配所占用内存空间,变量值与内存值一致

对于引用类型,引用就是C++的指针,它所表现的是对象所在的内存空间位置,集引用的内存值为它所代表的对象的首地址;对于引用而言,表示
内存地址是需要内存空间的,一般有机器的数据宽度决定,x86一般为32位,x64地址为64位表示。

对于Student s;这代码而言,仅仅声明了引用 s ,占用的 地址 表示的 Student 对象的位置,由于对象未初始化,引用的值为空。

这只是声明了一个对象,并没有生成对象。你可以理解成每次生成对象的时候都需要一个构造器,所以在新建一个类的时候默认都会有一个无参构造器,当你需要生成对象的时候就可以通过new + 构造器来表示生成了一个对象,此时开始占用内存空间

生成Student的实例s,目前没有初始化,只是一个空的对象,你可以这样理解至于是指针之类的Java 里面基本可以不考虑

局部变量中Student s;并不等于Student s=null;(如果是全局变量的话他俩是等价的),Student s;的意思是我申明了一个s,这个s是Student类型的,这时如果直接调用s,是编译不通过的,因为s这个东西本来就不存在,所以根本不能调用。
而Student s=null;而null表示的是空指针,这里虽然他是空的,但他也是一个指针,,,所以他是有值的,值为null,就是空地址的意思,,,如果是null的话,编译器是不会报错的,,只有你试图调用nulll的方法才会抛出空指针异常