Java错题本02

线程的生命周期

新建→就绪→运行→阻塞→死亡

New→Runnable→Running→Blocked→Dead

调用start进入就绪。

线程死亡:run或call方法执行完成

抛出未捕获的异常Exception或Error

调用线程的stop方法(不推荐,容易死锁)

isAlive()中间三种状态返回true

join方法让一个线程等待另一个线程完成

后台线程/守护线程/精灵线程 特征:前台线程全部死亡,后台就会自动死亡

如jvm的垃圾回收线程

O.setDaemon(true)设O对象为后台线程,


线程睡眠:sleep,让线程暂停,进入阻塞状态

线程让步:yield,让线程进入阻塞状态,有优先级的执行

setPriority()设置线程优先级


JVM终止:

程序正常结束

程序使用System.exit() Runtime.getRuntime().exit()

遇到为捕获的异常

程序所在平台强制结束Jvm进程


类加载或类初始化:加载→连接→初始化

类加载是指,将类的class读入内存,并为之创建一个java.lang.Class对象。当程序使用任何类都会创建这么一个对象。

类加载由类加载器完成,由JVM提供


类的连接:把类的二进制数据合并到JRE中

验证→准备→解析

验证内部结构是否正确,和其他类是否协调

准备:分配内存、设置初始值

解析:将类的二进制数据中的符号引用替换成直接引用


创建实例的方法:new、反射、反序列化

同一个类:全限定类名(包名、类名)JVM中靠全限定类名和加载器

JVM启动时,会形成由三个类加载器组成的初始类加载器的层次结构

Bootstrap ClassLoader:根类加载器

Extension ClassLoader:扩展类加载器:加载JRE扩展目录中JAR包的类

System ClassLoader:系统类加载器


JVM类加载机制

全盘负责:class所依赖的和引用的其他Class也由该类加载器负责载入

父类委托:先让父类加载器试图加载该Class

缓存机制:所有加载过的Class都会被缓存,若不在缓存区,系统会读取其二进制数据,并将其转换成Class对象。修改了Class必须重新启动JVM



通过反射创建对象两种方式

①使用Class对象的newInstance()方法来创建该Class对象对应类的实例

执行newInstance()方法实际是利用默认构造器来创建该类的实例

②先使用Class对象获取Constructor对象,再调用Constructor的newInstance方法来创建该Class对象对应的类的实例。

第一种方式比较常见

Public


进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程


IO


异常

检查异常需要手动抛出



集合


Static修饰的成员不能访问没有static修饰的成员,例如main方法要先创建对象,才能访问Sting、int之类的。通过实例可以访问类变量,因为类变量都在一块内存区里。

Static的真正作用:区分成员变量、方法、内部类、初始化块4

Java通过new调用构造器,构造器构造实例,构造器是类创建对象的根本途径。

构造器的返回值默认是隐式的。

方法名以英文动词开头,void用来声明方法没有返回值,否则有return

同一个对象里的一个成员可以直接调用另一个成员,即省略this

Java里的方法的参数传递方式只有一种:值传递

子类无法访问父类被覆盖的方法,但可通过super或父类类名来调用。子类和父类的private方法同名不是重写。

外部类访问权限只需要给同一个包和任何位置,所以public和 默认 。内部类可以使用四种访问权限。

JUC:

New Thread(new Runnable(){重写run方法}).start





两同:1)方法名2)形参列表两小:1)返回值类型比父类更小或相等2)异常比父类方法更小或相等一大:子类权限比父类大或相等

被覆盖的方法不能为private




命名合法:开头_、$ 、_1_

接口定义的成员变量默认public static final,所有成员方法为 public /abstract,只能被public和abstract修饰

构造方法无法被程序调用

初始化顺序:静态成员变量、成员变量、构造方法

按值传递不会改变实际参数的数值

按引用传递不会改变实际参数的参考地址,但能改变实际参数的内容

编译失败,方法体中的有static



线程和进程的区别


Java中可作为gc root 的对象有哪些?

1 、 虚拟机栈(栈帧中的本地变量表)中引用的对象。

2、 本地方法栈中JNI(即一般说的native方法)引用的对象。

3、 方法区中的静态变量和常量引用的对象。

-ha���W��k

你可能感兴趣的:(Java错题本02)