final修饰的成员变量只能被赋值一次,
静态变量,可以在声明变量时赋值或者在静态代码块里赋值。
非静态变量,可以在声明变量时赋值或者在代码块里赋值或者在构造函数中赋值。
final修饰的变量如果在初始化的时候就被赋值,而且=右边的值是常数或者常数的表达式,那就可以执行宏替换,也就是把代码里所有出现该final变量的地方都替换成常量。例如:
final String s1 = "45";
final String s2 = "6";
String s3 = s1 + s2;
final String s4 = "456";
System.out.println(s3 == s4);
将输出 true
要保证两个用equals()方法判断为相等的对象的hashCode()也相等。
System.gc();
Runtime.getRuntime.gc();
AA aa = new AA();
ReferenceQueue referenceQueue = new ReferenceQueue();
PhantomReference a = new PhantomReference(aa, referenceQueue);
aa = null;//必须要把强引用赋为空
System.out.println(referenceQueue.poll());//输出null
//通知系统进行gc
System.gc();
System.runFinalization();
//执行上面两行代码后,系统会把虚引用加到引用队列中。
System.out.println(referenceQueue.poll() == a);//输出true
System.out.println(referenceQueue.poll());//输出null,引用队列刚刚已经弹出,所以已经没有引用存在了
AA aa = new AA();
WeakReference weakReference = new WeakReference(aa);
System.out.println("弱引用: " + weakReference.get());//弱引用: AA@677327b6
ReferenceQueue referenceQueue = new ReferenceQueue();
PhantomReference a = new PhantomReference(aa, referenceQueue);
aa = null;//必须要把强引用赋为空
System.out.println(referenceQueue.poll());//null
//通知系统进行gc
System.gc();
System.runFinalization();
//执行上面两行代码后,系统会把虚引用加到引用队列中。
Reference poll = referenceQueue.poll();
System.out.println(poll == a);//true
System.out.println(referenceQueue.poll());//null
System.out.println("弱引用: " + weakReference.get());//弱引用: null
39.软引用:只要jvm开始工作,软引用指向的对象就会被回收。
40. 虚引用:只要jvm开始工作,虚引用指向的对象就会被回收。系统还会被虚引用放入引用队列 ReferenceQueue
41. 当某个方法需要访问系统硬件,可以用native修饰该方法,再把该方法交给C实现。一旦Java程序包含了native方法,这个程序将失去跨平台的功能。
42. Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定功能。Java提供了System类和Runtime类来与程序的运行平台进行交换。
43. System类代表当前Java程序的运行平台。程序不能创建System类的对象。
44. System类提供了System.identityHashCode()方法,该方法返回指定对象的精确hashCode()值,也就是根据对象在内存中的地址所生成的hashCode值。当某个类的hashCode()被重写后,该类实例的hashCode()方法就不能唯一标识该对象,但是可以通过System.identityHashCode()方法的返回值来判断。结论:如果两个对象的identityHashCode值相等,那么他俩一定是同一个对象。
45. Runtime类的介绍参照《疯狂Java讲义》
46. 用utf-8使用中文就会占用3个字节,英文的话只有一个字节 如果是unicode则都是2个字节, gbk,一个汉字字符也是2个字节
47. Math的构造器是private,所以无法创建Math类的对象,Math中的所有方法都是类方法。
48. 数组中可以保存基本数据类型或对象,集合中只能保存对象。
49. null可以被强制类型转换成任意类型的对象
50. 方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
51. 本题主要考察String对象的不可变性。
toUpperCase()会对当前对象进行检查 如果不需要转换直接返回当前对象,否则new一个新对象返回;
参见如下代码:
String x="wmn";
String s = x.toLowerCase();
System.out.println(s==x);//true
String y=x.replace('f','F');
System.out.println(x==y);//true
Integer n3 = Integer.valueOf(47)
Integer n4 = Integer.valueOf(47);
这里的n3==n4才是true。
如果直接使用new一个对象,从构造函数来看:
public Integer(int value) {
this.value = value;
}
就是完全不同的两个对象,没有使用所谓的缓存。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
i=i++
int temp = j;
j = j + 1;
j = temp;
int j = 0;
System.out.println(j++);
这个表达式的输出是0 !!!`interface A{
}
class B implements A{
}
class C extends B{
}`
`
public class Iinstanceof {
public static void main(String[] args) {
A ab=new B();
A ac=new C();
B bc=new C();
B bb=new B();
C cc=new C();
//对象实现一个接口,用这个对象和这个接口进行instanceof判断,都为true。
System.out.println(“ab instanceof A=”+(ab instanceof A));
System.out.println(“ac instanceof A=”+(ac instanceof A));
System.out.println(“bc instanceof A=”+(bc instanceof A));
System.out.println(“bb instanceof A=”+(bb instanceof A));
System.out.println(“cc instanceof A=”+(cc instanceof A));
//对象和父类进行instanceof判断,都为true
System.out.println(“ab instanceof B=”+(ab instanceof B));
System.out.println(“ac instanceof B=”+(ac instanceof B));
System.out.println(“bc instanceof B=”+(bc instanceof B));
System.out.println(“bb instanceof B=”+(bb instanceof B));
System.out.println(“cc instanceof B=”+(cc instanceof B));
//对象和他的子类进行instanceof判断为false
System.out.println(“ab instanceof C=”+(ab instanceof C));
System.out.println(“ac instanceof C=”+(ac instanceof C));
System.out.println(“bc instanceof C=”+(bc instanceof C));
System.out.println(“bb instanceof C=”+(bb instanceof C));
System.out.println(“cc instanceof C=”+(cc instanceof C));
}
}`
程序输出:
ab instanceof A=true
ac instanceof A=true
bc instanceof A=true
bb instanceof A=true
cc instanceof A=true
ab instanceof B=true
ac instanceof B=true
bc instanceof B=true
bb instanceof B=true
cc instanceof B=true
ab instanceof C=false
ac instanceof C=true
bc instanceof C=true
bb instanceof C=false
cc instanceof C=true
对于多态的情况,instanceof 看的是=右边的对象的继承关系,而不是左边。
public static int methodB() {
int aa=3;
try {
return aa++;
} catch (Exception e) {
} finally {
return aa;
}
}
输出结果是4
扩展知识:
1. Hashtable & HashMap
Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
83. 在java语言中虚函数指代的就是抽象方法,抽象方法中不能用private,static, synchronized,native等修饰词修饰。
84. 其实 普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。
85. 当实例化子类对象时,首先要加载父类的class文件进内存,静态代码块是随着类的创建而执行,所以父类静态代码块最先被执行,子类class文件再被加载,同理静态代码块被先执行;实例化子类对象要先调用父类的构造方法,而调用父类构造方法前会先执行父类的非静态代码块
86. 1.this 和 super 只能放在第一行
2.this()和super()不可以同时出现在一个构造函数中
3.在方法中定义使用的this关键字,它的值是 当前对象 的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.
87. JAVA没有指针的概念,被封装起来了,而C++有;JAVA不支持类的多继承,但支持接口多继承,C++支持类的多继承;C++支持操作符重载,JAVA不支持;JAVA的内存管理比C++方便,而且错误处理也比较好;C++的速度比JAVA快。
C++更适用于有运行效率要求的情况,JAVA适用于效率要求不高,但维护性要好的情况。
88. JAVA不使用指针,不支持头文件,不支持宏定义,JAVA可以动态分配内存
C++比较适合一些底层处理,JAVA比较适合开发应用,可以是WEB,也可以是手机端的Android。
89. finally块的语句在try或catch中的return语句 执行之后 返回之前 执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
90. 有关hashMap跟hashTable的区别 http://www.nowcoder.com/test/question/done?tid=3894394&qid=14454#summary
91. 综上所述,接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:
行为模型应该总是通过接口而不是抽象类定义。所以通常是:优先选用接口,尽量少用抽象类。
选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供共性的功能。
92. 面向对象的五大基本原则
s( Single-Resposibility Principle ): 单一职责原则
o( Open-Closed principle ): 开放封闭原则
l( Liskov-Substituion Principle ): 里氏原则
i( Interface-Segregation Principle ): 接口隔离原则
d( Dependecy-Inversion Principle ): 依赖倒置原则
一个单词:立方体(solid),很好记!!!
93. 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
除了这些之外,其他的都是非线程安全的类和接口。
94. class A {}
class B extends A {}
class C extends A {}
class D extends B {}
耐心看完,保证能懂这道题!
1. 只看尖括号里边的!!明确点和范围两个概念
2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List《A》,List《B》,List《Object》
3. 如果尖括号里面带有问号,那么代表一个范围,《? extends A>》代表小于等于A的范围,《? super A》代表大于等于A的范围,《?》代表全部范围
4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
5. 尖括号小范围赋值给大范围,对!大范围赋值给小范围,错!如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
6. List《?》和List 是相等的,都代表最大范围
public static void main(String[] args) {
List a;
List list;
list = a; //A对,因为List就是List,代表最大的范围,A只是其中的一个点,肯定被包含在内
List b;
a = b; //B错,点之间不能相互赋值
List> qm;
List
class Mytest02{
public static void main(String args []){
Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非静态内部类对象
Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//静态内部类对象
}
}`
100. C,java不完全算是编译型语言,他编译的字节码文件运行时是解释执行的,其次,java和C++的类也不都完全是静态绑定的,比如C+++的虚函数,java的父类引用子类对象等情况。
D,java也可以数组溢出,溢出是会抛出异常,也就是ArrayIndexOutOfBoundsException
101. “ 接口中可以包含静态方法 ”,jdk1.8中可以有,而jdk1.7编译错误