1)java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。
个人理解:1类的加载是将类的class文件读入内存为之创造class对象
2类的连接会把类的二进制数据合并到JRE中
3初始化虚拟机对类进行初始化,包括已下{
1父类 静态变量 静态初始化块
2子类 静态变量 静态初始化块
3父类变量 初始化块 父类构造器
4子类变量 初始化块 父类构造器
}
2)java的面向对象特性:
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
3)java的八个基本数据类型:
1个字节 | byte | 0 |
2个字节 | short | 0 |
4个字节 | int | 0 |
8个字节 | long | 0L |
4个字节 | float | 0.0f |
8个字节 | double | 0.0d |
2个字节 | char | ‘\u0000’ |
环境而定 | boolean | false |
4)1.作用域public,private,protected 修饰符关键字,以及不写时的区别?
public:公有的,自身所有包下面的类都可以访问
private:私有的,只有本类自身才能访问
protect:保护的,自身和子类,以及同一包下面的类可以访问
default:默认的,自身,同一包下面的类可以访问
5)break 和continue的异同点
break,有“打破(僵局),结束(困难,不利局面),断绝(联系)”等意思,
所以引申为“从break处跳出总循环,结束本次循环,不执行本次循环中break之后的语句,且结束该循环控制体”
而continue,意思是“(中断后)继续”,
所以引申为“从continue处结束本次循环,中止本次循环,不执行本次循环中continue之后的语句,但(中止后)没有跳出该循环控制体,继续执行本次循环之后的循环”
两者的共同点是:
都不会执行本次循环中break/continue之后的语句;
两者的不同点是:
continue是中止本次循环之后继续执行本次循环之后的循环,没有跳出该循环控制体;
而break拒绝执行本次循环之后的循环,并且跳出该层循环控制体。
6)String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
String:为不可变对象,一旦被创建,就不能修改它的值。
对于已经存在的String对象的修改都是重新创建一个对象,把新的值保存进去。
String是final类,不能被继承。
StringBuffer:线程安全的可变字符序列。如果要对一个字符串内容进行频繁修改,出于性能考虑,最好使用StringBuffer。如果想转换成String类型,可调用
StringBuffer的toString()方法。
StringBuffer最常用的方法是append()以及insert方法
StringBuilder:线程不安全的可变字符序列。
使用策略:
(1)基本原则:如果要操作少量的数据,用String;单线程操作大量数据用StringBuilder;多线程操作大量数据用StringBuffer。
(2)为了获得更好的性能,在构造String和StringBuffer时应尽可能的指定他们的容量,默认容量长度是16个字符。
(3)StringBuilder一般用在方法内部,StringBuffer可用在全局变量上。
7)java异常
error:跟程序猿写的代码无关, 表示代码运行时 JVM(Java 虚拟机)出现的问题。一般的异常有:上面的两种。
exception: 包括io异常还有就是runntimeException 指的是
8)数据连接池的工作机制
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
为什么要用连接池:
首先连接池可以减少对资源的消耗,允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,可以被重复使用
打开或关闭数据库连接开销很大,连接池技术允许我们在连接池中维护对象,这样克一提高哦数据库的执行效率和性能。多个客户请求可以重复是使用相同的对象。
当每次收到客户端请求是,就会搜索连接池中是否存在闲置的对象,如果没有则要求所有的客户端进行队列排队,要么就是新建一个连接对象(这需要取决于连接池的最大连接数)
一旦这个连接请求结束后,会被重新放入连接池中,分配给其他的请求,大大减少了等待创建数据库连接的时间。
企业级应用中很常见,应用服务器负责创建连接对象,添加他们到连接池中,分派给请求,回收已经完毕的连接对象,重新放回连接池中
9)system.out.print 相比于log4j日志管理,
会产生大量的IO操作,同时在生产环境中无法合理的控制是否需要输出,而log4j不同,可控制日志的级别比如info,error debug 等,还可以控制输出的路径和输出的格式如xml等
10)数据库优化的经验:建表索引和建分区,还有尽量少用not in。清空表数据尽量用truncate 少用delete 等
11)在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码, 不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以 直接使用类名来引用。例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticInt
变量,并且每创建一个实例对象,这个staticInt
就会加1;但是,每创建一个实例对象,就会分配一个random
,即可能分配多个random
,并且每个random
的值都只自加了1次。
12)String str = "abcde";
Char[] chars = new Char[str.length()];
chars = str.toCharArray();
13)
1.HashMap去掉了HashTable的contains方法,增加了containsKey和containsValue方法,新的
2.HashTable是同步的,线程安全。而HashMap是非同步的,线程不安全。旧的
3.HashMap允许空键值,而HashTable不允许。
14)堆heap和栈stack
1.java 程序为了提高运行的效率,就对数据进行了不同的空间的分配,具体划分为如下5个内存空间:
stack 栈:存放的是局部变量
heap 堆:存放的是new 出来的东西。
方法区
本地方法区:(和系统相关)
寄存器:(CPU使用)
堆内存的特点:
1.每一个new出来的东西都有地址值
2.每个变量都有默认值
byte,short,int ,long 默认0
float,double 默认0.0
char 默认 '\u0000'(null字符串)
boolean false
引用类型 null
3.使用完毕就变成了垃圾,但是并没有立即回收,会在垃圾回收器空闲的时候回收。
栈内存的特点:
栈内存的数据用完就释放。