public class Z extends X { Y y = new Y(); Z() {
//super();
System.out.print(\); }
public static void main(String[] args) { new Z(); } }
结果: YXYZ
面试题:
package,import,class有没有顺序关系? 有。
package > import > class
Package:只能有一个 import:可以有多个
class:可以有多个,以后建议是一个
面试题:
局部内部类访问局部变量的注意事项?
A:局部内部类访问局部变量必须用final修饰 B:为什么呢?
局部变量是随着方法的调用而调用,随着调用完毕而消失。 而堆内存的内容并不会立即消失。所以,我们加final修饰。 加入final修饰后,这个变量就成了常量。既然是常量。你消失了。
我在内存中存储的是数据20,所以,我还是有数据在使用。
面试题:
要求请填空分别输出30,20,10。 注意:
1:内部类和外部类没有继承关系。 2:通过外部类名限定this对象 Outer.this
成员内部类的面试题(填空) 控制台输出:30,20,10 class Outer {
public int num = 10;
class Inner {
public int num = 20; public void show() { int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num); } } }
class InnerClassTest {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
//匿名内部类面试题: //按照要求,补齐代码
//要求在控制台输出”HelloWorld” /*
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) { Outer.method().show(); } } */
//答案:
interface Inter { void show(); //public abstract }
class Outer { //补齐代码
public static Inter method() { //子类对象 -- 子类匿名对象
return new Inter() { public void show() {
System.out.println(\ } }; } }
class OuterDemo {
public static void main(String[] args) { Outer.method().show();
//1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
//2:Outer.method().show()可以看出method()方法的返回值是一个对象。
// 又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。 } }
字符串的面试题(看程序写结果)
==和equals()的区别?
A:==
基本类型:比较的是值是否相同 引用类型:比较的是地址值是否相同 B:equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。 但是,我们可以根据自己的需要重写该方法。
A:==和equals()
String s1 = new String(\ String s2 = new String(\
System.out.println(s1 == s2);// false System.out.println(s1.equals(s2));// true
String s3 = new String(\ String s4 = \
System.out.println(s3 == s4);// false System.out.println(s3.equals(s4));// true
String s5 = \ String s6 = \
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true B:字符串的拼接 /*
* 字符串如果是变量相加,先开空间,再拼接。
* 字符串如果是常量相加,是先加,然后在常量池找,如果有就直 接返回,否则,就创建。 */
public class StringDemo {
public static void main(String[] args) { String s1 = \ String s2 = \
String s3 = \
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals((s1 + s2)));// true
System.out.println(s3 == \这个我们错了,应该是true
System.out.println(s3.equals(\+ \true
// 通过反编译看源码,我们知道这里已经做好了处理。 // System.out.println(s3 == \
// System.out.println(s3.equals(\ }
}
面试题:
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
1:String,StringBuffer,StringBuilder的区别?
A:String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。 B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
2:StringBuffer和数组的区别?
二者都可以看出是一个容器,装其他的数据。
但是呢,StringBuffer的数据最终是一个字符串数据。 而数组可以放置多种数据,但必须是同一种数据类型的。
3:形式参数问题
String作为参数传递
StringBuffer作为参数传递
形式参数:
基本类型:形式参数的改变不影响实际参数 引用类型:形式参数的改变直接影响实际参数
注意:
String作为参数传递,效果和基本类型作为参数传递是一样的。 面试题
-128到127之间的数据缓冲池问题
注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据
通过查看源码,我们就知道了,针对-128到127之间的数据,做了一个数据缓冲池,如果数据是该范围内的,每次并不创建新的空间
注意:
public class BigDecimalDemo {
public static void main(String[] args) { System.out.println(0.09 + 0.01); System.out.println(1.0 - 0.32); System.out.println(1.015 * 100); System.out.println(1.301 / 100);
System.out.println(1.0 - 0.12);
//0.09999999999999999 //0.6799999999999999 //101.49999999999999 //0.013009999999999999 //0.88 } }
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
List:(面试题List的子类特点) ArrayList:
底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 Vector:
底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 LinkedList:
底层数据结构是链表,查询慢,增删快。