JAVA小记2

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

出错问题:类方法适用于类的所有对象,而不是某个对象

你可能感兴趣的:(JAVA小记2)