- Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类。
- Object的equals方法,只有一句话,return this==object。
- equals比较的是指是否相同,而==表示是否指向同一个对象(地址是否一样)
Object中的方法
- static不能修饰局部变量
- 公共的
- 堆区:只存放类对象,线程共享;
- 方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
- 私有的
- 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
- 程序计数器:私有线程区域
- 本地方法栈:私有线程区域
- 静态代码块->普通方法块->构造函数
- 父静子静,父构子构
三元操作符如果遇到可以转换为数字的类型,会做自动。
- 老年代满
- 持久代满
- 新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。
- 老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
- 持久代:持久代如果满了,将触发Full GC。
1.Map的继承关系
2.线程安全的类(喂,SHE)
- 喂(Vector)
- S(Stack)
- H(hashtable)
- E(enumeration)
一般关系数据模型和对象数据模型之间有以下对应关系:表对应类,记录对应对象,表的字段对应类的属性
能访问目录下的所有类,不能访问子目录下的所有类
导入不能读取其子目录的类,因为如果里面有个a类,里面也有个a类,我们若是要调用a类的方法或属性时,应该使用哪个a类呢。
DBMS中事务有四个特性,,,,,持久性实现恢复管理子系统,一致性实现并发控制子系统,原子性实现完整性管理子系统,隔离性实现安全控制管理子系统
- java中只有byte, boolean是一个字节, char是两个字节
- 和序列化有关,这是一个空接口,起标记作用,具体的序列化由ObjectOutputStream和ObjectInputStream完成。transient修饰的变量不能被序列化,static变量不管加没加transient都不可以被序列化
Java中的四类八种基本数据类型
- 整数类型 byte short int long (int是整形,也属于整数类型)
- 浮点型 float double
- 逻辑型 boolean(它只有两个值可取true false)
- 字符型 char string
- jdbc方式:使用DriverManagerDataSource建立连接,没有用到连接池
- C3P0连接池:使用的是ComboPooledDataSource
- DBCP连接池:使用的是BasicDataSource
- JNDI方式:使用的是JndiObjectFactoryBean
- java中类的加载有5个过程,加载、验证、准备、解析、初始化;这便是类加载的5个过程,而类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称应用类加载器)
- 一个类,由不同的类加载器实例加载的话,会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同Class实例。
- 类加载器是肯定要保证线程安全的
- 装载一个不存在的类的时候,因为采用的双亲加载模式,所以强制加载会直接报错
- 双亲委派模式是在Java 1.2后引入的,其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都很懒,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完成,所以默认是父装载
- 自定义类加载器实现 继承ClassLoader后重写了findClass方法加载指定路径上的class
- java的基本编程单元是类,基本存储单元是变量。
对于是,但如果是则为,因为编译器不能优化未知的变量
- 在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为
- java成员变量有自己的默认初始值,但是方法中没有默认初始值
- java方法中的变量不赋初始值如果不使用的话不报错,但是如果被使用到的话,编译异常
- 在定义的时候加入final关键字,被声明为常量,会被JVM优化
1.虚拟机规范严格规定了有且只有五种情况必须立即对类进行“初始化”:
- 使用new关键字实例化对象的时候、读取或设置一个类的静态字段的时候,已经调用一个类的静态方法的时候。
- 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有初始化,则需要先触发其初始化。
- 当初始化一个类的时候,如果发现其父类没有被初始化就会先初始化它的父类。
- 当虚拟机启动的时候,用户需要指定一个要执行的主类(就是包含main()方法的那个类),虚拟机会先初始化这个类;
- 使用Jdk1.7动态语言支持的时候的一些情况。
2.不会引起初始化的情况
- 子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
- 通过数组定义来引用类,不会触发此类的初始化
- 常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
- 现在jdk1.8及以后的版本 ConcurrentHashmap是采用CAS+synchronized关键字来保证线程安全性,在jdk1.7及之前的版本是采用分段锁机制来保证线程安全性。
- 两个最基本的java回收算法:复制算法和标记清理算法
- 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
- 标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出
- 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
- 两个概念:新生代和年老代
- 新生代:初始对象,生命周期短的
- 永久代:长时间存在的对象
- 整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
- P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
- Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
- Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
- Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
- Parallel Old(并行)收集器,针对老年代,标记整理
- CMS收集器,基于标记清理
- G1收集器:整体上是基于标记 整理 ,局部采用复制
综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
super和this都只能位于构造器的第一行,而且不能同时使用,这是因为会造成初始化两次,this用于调用重载的构造器,super用于调用父类被子类重写的方法
1、super()表示调用父类构造函数、this()调用自己的构造函数,而自己的构造函数第一行要使用super()调用父类的构造函数,所以这俩不能在一个构造函数中会出现重复引用的情况
2、super()和this()必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中
3、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块(里面不能使用非static类型的)。
- java中true ,false , null在java中不是关键字,也不是保留字,它们只是显式常量值,但是你在程序中不能使用它们作为标识符。
- 其中const和goto是java的保留字。java中所有的关键字都是小写的,还有要注意true,false,null, friendly,sizeof不是java的关键字,但是你不能把它们作为java标识符用。
1.sleep()方法(不会释放资源锁)
2.wait()方法 (释放资源锁)
3.yield方法 (释放资源锁)
4.join方法 (释放资源锁,底层调用了wait方法)
注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
通常,Java的异常(包括Exception和Error)分为 可查的异常(checked exceptions)和不可查的异常(unchecked exceptions) 。
可查异常(编译器要求必须处置的异常): 正确的程序在运行中,很容易出现的、情理可容的异常状况 。 可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常 状况,就必须采取某种方式进行处理。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。
Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。
运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
- 若try代码块内含有return,同时存在finally代码块(代码块内无return值)时,先执行finally函数的值。
- 若try代码块内含有return,同时存在finally代码块且代码块内含有return值时,此时finally代码块内的return值将直接返回(或覆盖掉try代码块中的return值)。
- finally代码块在return中间执行。return的值会被放入临时空间,然后执行finally代码块,如果finally中有return,会刷新临时空间的值,方法结束返回临时空间值。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jjc/14969.html