Java基础

变量的存储位置

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。

  1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)
    或者常量池中(字符串常量对象存放在常量池中)。

  2. 堆:存放所有new出来的对象。

  3. 静态域:存放静态成员(static定义的)。

  4. 常量池:存放字符串常量和基本类型常量(public static final)。

  5. 非RAM存储:硬盘等永久存储空间。


堆栈:

  • 对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享;
  • 栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃
    圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性;

字符串:

  • 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在
    常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永
    远只有一份,在堆中有多份;
  • 对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如
    果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也
    就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有
    ”xyz”,就是两个。

进程与线程的区别

  • 一个程序至少有一个进程(通过为Activity设置android:process可以让其运行在单独的进程中),一个
    进程至少有一个线程;
  • 进程可以单独存在,而线程不能独立存在,必须依赖于一个进程;
  • 进程是系统资源分配的最小单位,线程是程序执行的最小单位;
  • 进程有自己独立的内存地址空间,进程之间无法直接通讯,只能通过IPC进行通讯;
  • 线程间共享进程的地址空间和内存资源,多个线程共享全局变量和静态变量,所以线程之间的通讯更加方便;
  • 进程之间是相互独立的,一个进程死掉,不会影响到其他进程,而在多线程的环境下,一个线程死掉,其所
    在的整个进程也会死掉;

内部类的优点

Java不支持多继承 ,只支持多实现。但是,很多时候,只是实现一些接口很难解决问题,此时,我们就可以
使用内部类来解决问题。内部类即可与外部类关联(非静态内部类),也可以独立于外部类(静态内部类),并且,
内部类的环境是不受到外部类的影响的,通过它们来继承我们需要的类的能力,能让我们更灵活的解决问题;

可以说,接口只是帮我们解决了部分问题,而内部类赋予类多重继承的能力,使解决问题的方案更加的完整;