原理是对的. 只是如果是引用类型指向改变的话. 不一定会变成垃圾, 如果有其它引用仍然指向此堆内存空间, 这个空间还是会一直存在 .
对.
static只是表示此变量是一个静态变量, 可以修改. final修饰的不是可以修改的.
实例变量只是表示非静态变量,即此变量必须在类被实例化之后才可以使用. 而是否引用数据类型是看变量的类型的. 比如变量是int类型 那它仍然是一个基本数据类型.
变量没有 类类型这么一说.. 只有基本数据类型和引用数据类型.
对象变量 就是实例变量
对 .
常量和变量是一个道理 . 只是常量一般是以final修饰的 ,表示其值不可变 所以叫常量.
1.前边说的基本正确,最后一句不严谨,“并指向新的内存空间”是对的,但未必是“新开辟了一个带有内容的内存空间”因为可以指向另外一个已存在的对象,后者仅在遇见new操作符(或者函数调用里使用了new)才正确。
2.可以被final修饰,也可以修饰此变量所指向对象的内容,但不可变更此变量所指向的对象(即不可以指向新的地址)。
3.属性也可以是基本数据类型。成员变量被static修饰,就是静态变量,意思是可以被这个类的所有对象所共享而已(如果不是private的还可以被其他类或对象访问),或者说,这个变量被绑定到类上而非对象上。因此,它完全可以被更改。
①:static修饰的属性可以被子类调用(只要是protected或public),不存在“覆写”的问题,因为他们各自绑定到不同的类。但是,如果子类类名调用自身未定义的变量或方法,会在父类中找(protected或public的),当然自己重定义就调用自己定义的,用父类类名调用的静态变量调用的是绑定在父类的静态变量(即父类定义的静态变量)。
②:final修饰的变量是常量,用类名直接调用由这个变量是否为static来决定,跟final无关。
4.无论是否静态变量,都可以是基本或引用类型的。
5.①必须是,因为你调用了new A()。另外,对于A a1,那么a1所指向的对象不是A类型的对象也是A的子类的对象。
②对象是变量的一种。变量的本质含义就是一个固定大小的储存空间。对象是变量的一种。同理,类是变量类型的一种。A a2:在不同的语境下,用词不一样。“a1”,本质是一个指向某对象的指针。但我们谈到“a1变量”时,既可以是指a1这个储存空间(出指向了什么对象),也可以指a1所指向的对象,这得根据上下文语境理解。而“a1对象”一般指后者。
6.“对象变量”一般指的是类的非静态成员变量(也就是非静态属性)。
7.常量等价于final所修饰的变量。变量可以是引用类型的,也可以是值类型的。
8.见7,常量跟static八竿子打不着。
另外,你可能提到了一个非常重要的概念区别(在JAVA通常不重要,并没有关键词严格区分):运行时常量与编译时常量。
"dsfsdf":像左边这种字符串是常量,又称字面量,是一种非常典型的编译时常量。
其实严格来说,编译时常量还分两种,但这已经涉及到CPU的运行机制,过于底层,就不再细讲。