Java面试宝典
1-int i = a; i = i++; i还是a
2-System.out.println(0+'0'); 48 “0”+ 0 才为00
3-x=x+1最低,x=+1其次,x++最高
4-int k; k++; // java没有初始化,不能使用
5-0&&k++; k++没有执行
6-java不能在判断表达式中直接用int类型,如if(a)错误, int无法转为boolean
7-j++,本身不会改变,再次执行非赋值回j的,之后才会改变
j = 0; j = ++j + j++ + j++ + j++; ++j 变1,j++还是1, j++非赋值2, j++非赋值3 7
k - 0, k = k++ + k++ + k++ + ++ k; k++还是0, 1, 2, 4;
8-byte,char,short有运算操作时,结果会变为int类型,这时候需要强制类型转换才能赋给占位小的。
9-short s = 1; s=s+1 错
short s = 1; s += 1;对 s += 1 + s; 对 int i = 1; s =i + 1;//错误 s=s+1;//错误
10-非static类型的方法或者变量不能在main中使用,
11-断言:-ea启动 -da禁用 启用系统类的断言-esa 禁用-dsa
Windows -> Preferences ->Java ->Installed JREs ->点击正使用的JDK ->Edit ->Default VM Arguments文本框中输入:-ea
1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式 输出的是表达式的值,可以是字符串,因为最后都转为字符串输出>。
assert true:"错误信息";
12-public,protected,default(就是不写,没有这个关键字),private,可见范围从大到小。
13-main必须public , public static void main(String[] args) , 没有参数也会运行不了, 只能void, static
14-标签不能以下划线开头命名,而且只对循环命名,对其他语句不合法。break,continue,仅仅是为了可以跳出多循环,重新开始循环。不能像goto语句。
能跳到的标签,也仅仅是语句被包含的循环的标签。
15-error很难恢复的严重问题,exception程序运行正常不发生
16-JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射就有开发性,开发性不一定有反射。 程序可以访问、检测和修改它本身状态或行为的一种能力。
17-final
修饰成员变量:基本类型表示不能修改,引用对象:必须在定义处或者构造函数中初始化,然后不可改变
修饰方法参数:基本类型的没什么意义, 引用对象:可以防止被修改
修饰成员方法:原因:确认函数功能确定,无需扩展时,确定该方法不会被派生类重载。 好处:调用时变内联,所以建议小巧,不然会让主体代码变大
18-finalize
垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以写程序验证这个结论),一般的纯Java编写的Class不需要重新覆盖这个方法,因为Object已经实现了一个默认的,除非我们要实现特殊的功能(这里面涉及到很多东西,比如对象空间树等内容)。
不过用Java以外的代码编写的Class(比如JNI,C++的new方法分配的内存),垃圾回收器并不能对这些部分进行正确的回收,这时就需要我们覆盖默认的方法来实现对这部分内存的正确释放和回收(比如C++需要delete)。
19-声明为abstract 的类才能有abstract方法。
20-递归程序易懂,但执行效率低。
21-String,Interger等都是一个值,不是引用,对象才是。所以作为形参传入,改变后还是没有改变。数组为引用。改变也只能靠数组
22-protected,类只要在同包内,还是可以引用的,内部类也是。默认也可以
23-栈:共享,存基本类型,和对象的引用,对象的实体在堆中。string a = "abc"; string b = "abc"; a==b对, equal用比值,==用比指向。new一定出先指向。
24-System.gc(); 只是建议垃圾收集器收集垃圾,具体什么时候做不确定。一个对象没有任何值可以索引到就认为是可以清理的垃圾, img=null只是显示的提醒收集器,这是垃圾了。finaliza只能执行一次
Image [] img = new Image[10];
// 好的释放内存的方法
if (img != null)
{
for (int i = 0; i < img.length; i++)
{
img[i] = null;
}
img = null;
}
25-clone方法是Object中定义的,protected类型,只有实现CloneAble接口,才能实现在类的实例上调用clone方法。// 好的释放内存的方法
if (img != null)
{
for (int i = 0; i < img.length; i++)
{
img[i] = null;
}
img = null;
}
26-异常
27-集合
28-输入输出流
29-程序=算法+数据, 程序=对象+消息。 封装,多态性,继承。
30-对象是实体,实例是引用
31-C++用指针可以指向任何类型,而java用Object基类,实现对象的转换
32-建立空间的叫定义,不建立存储空间的叫声明
33-Object类
(1)clone,getClass,toString,finalize,equals,hashCode, 一般保证equals和hashCode满足相等。两个对象equals相等,hashCode也相等
(2)wait:进入睡眠,知道其他线程调用该对象notify,notifyall,interrupt,时间间隔到了
(3)notify,唤醒某个等待该对象的线程,唤醒所有等待该对象的线程
34-覆盖override:子类重新定义父类虚函数的做法,实现多态
35-重载overload:同一个类中,函数的同名,不同参数等,不是多态
36-构造函数不能覆盖,也不能为虚函数。
37-接口:
广义:凡是一个类提供给外部使用的部分都可以被称为抽象类接口。
侠义:虚函数集合,实现多态
38-解析语言,可以认为每次执行都编译一遍。源码变为机器码,并运行。Ruby, Python
39-Java编译成*.class字节码,必须用Java解析器执行。不是纯粹的编译也不是解析。
40-*.class不是面向哪个平台,而是面向JVM,不同平台实现JVM,就可实现跨平台了。