1.Java 回收内存是定期查询,无用单元收集(garbage collection);
2.类方法一般直接用类名加上句点引用来使用
3.引用是一个地址,指明了对象的变量和方法的存储位置,非对象
// String string="123";
// String tmp=string;
// string="321";
// System.out.println("string:"+string);
// System.out.println("tmp:"+tmp); 疑问~~ 输出结果是\
string:321
tmp:123
搞清楚了,这个问题困扰了我一下下,遛欢欢的时候,度娘了一下,详细了解了一下 pass by value的思想。
java中的基本类型和string类型都是值的传递都是引用的拷贝的传递,也是引用的传递,不过在stirng的赋值过程,是重新分配内存空间给变量a,而不是将a地址指向的空间里的值改变。所以a重新开辟了一个空间存储"321"并且指向它.b指向的地址还是不变。 a与b的赋值确实是赋值内存空间引用,但是b指向的内存值不会改变。 这样的解释我觉得蛮清楚的吧。而对于对象的传递,就是引用的传递,除非重新给这个对象的引用重定义,否则是不会改变内存地址的指向的。对象存储的是内存地址的指向的值,所以传递引用也是传递引用的内存地址的值,也叫值传递,所以是一个pass by value.
这是stackoverflow上的一个回答,很好理解:Java is alwayspass-by-value. Unfortunately, they decided to call the location of an object a "reference". When we pass the value of an object, we are passing thereferenceto it. This is confusing to beginners.
4.内部类的一些问题和描述:
a.非静态内部类,必须要有一个外部类的引用才能创建;
b.在外部类的非静态方法中,因为已经隐含了This外部类的引用,所以可以直接创建非静态内部类
c.在外部类的静态方法中,因为没有this,所以必须要先获得外部类的引用,才能创建非静态内部类。
d.静态内部类,不需要外部类引用就可以创建。
e.静态的内部类,不能直接方位外部类的非静态方法。
f.非静态类中的非静态方法可以访问外部的非静态方法,是因为创建非静态类的时候,有一个隐含的外部类引用this传入。
静态类的内存分配和实例方法的不同:
当程序开始运行时,静态方法已经在内存中被分配了空间,有了入口地址,所以可以通过”类名.方法名”直接调用
而实例是在对象创建后才会分配内存
5.强转
子类转父类
Parent parent=new program3_1().new Parent();
Child child=new program3_1().new Child();
child=(Child) parent; //(父类赋值给子类)父转子 需要强制
parent=child; //子转父(子类复制给父类)不需要
由上而下需要强转,由下而上不需要(安全)
除此之外,还可以把对象转换成接口,前提是对象的类或者超类实现了该接口
6.比较
对象的比较是比较内存引用地址的值,而不是对象的值
7.判断所属类用instanceof
出错问题:类方法适用于类的所有对象,而不是某个对象