2. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?
3. 现在有两个对象String a = new String("abc"); String b = new String("a"+"b"+"c");,问这两个对象里面的值是否相等。
4. 下面程序运行会发生什么结果?如果有错误,如何改正?
5. 重载方法,参数分别是int ,char,和double,然后将double x = 2,传递进去,会选择哪个方法?
6. XML文档定义有几种形式?它们之间有何本质区别?
7. XML文件的两种读取方式
8. 静态变量和实例变量的区别?
9. 局部变量和全局变量
10. GC是什么? 为什么要有GC?
1. &和&&的区别?
答:&是普通的逻辑运算符,而&&是短路与,其作用:当发现运算符左端为假时就不会判断运算符右边的真假了,这样就提高了运算效率,节省了时间。
2. 接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的main方法?
答:(1) 接口是可以继承接口的,抽象类可以实现接口,抽象类可以继承实体类,抽象类中可以有静态的main方法。
(2) 只要记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。
(3)抽象类是无实例的,抽象类可以有普通的方法,也可以有抽象(abstract)方法。有抽象方法的类一定是抽象类,但是抽象类中不一定全部是抽象方法,也可以有普通方法。
(4)普通类是可以创建实例的,但是没有抽象方法。
(5)接口是特殊的抽象类,接口里面的方法都是抽象方法,接口只有静态常量。抽象方法只能在它的子类中使用,而且一定要被它的子类重写,父类中的抽象方法是不能有方法体的。
(6)一个类接口可以实现多个,但是抽象类只能继承一个。(类与类之间的继承是单继承)
3. 现在有两个对象String a = new String("abc"); String b = new String("a"+"b"+"c");,问这两个对象里面的值是否相等。
答:是相等的,+在碰到字符串时就变成了字符串连接符,不再是简单的云运算了。因此,"abc"=="a"+"b"+"c"。
4. 下面程序运行会发生什么结果?如果有错误,如何改正?
答:
public class ChangeError {
public static void main(String[] args) {
new C().pX();
}
}
interface A {
int x = 0;
}
class B {
int x = 1;
}
class C extends B implements A {
public void pX() {
System.out.println(x); // 这个x不知道是继承B的还是A的,其来源模糊不清
//改成下面的方法则可以正常调用
//调用父类的成员可以用super,这里不能用this关键字,因为this.x不知道是从哪个类或接口继承来的,接口中的属性都是静态的常量,可以通过类名.属性名直接调用。
System.out.println(super.x);
System.out.println(A.x);
}
}
5. 重载方法,参数分别是int ,char,和double,然后将double x = 2,传递进去,会选择哪个方法?
答:选double那个方法,因为x是double,2默认是int类型,把2赋给x有个向上转型的过程。
6. XML文档定义有几种形式?它们之间有何本质区别?
答:a: 两种形式 dtd,schema
b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)
7. XML文件的两种读取方式
答: 1、DOM(Document Object Model)文档对象模型
2、SAX(Simple Api For Xml)
DOM和SAX的区别:
DOM
一次性把xml文件里的内容读取到一个对象中,以后要查看这个xml中的内容,直接从这个对象中读取即可,效率高,不适合读取大文件,当读取大文件时,其占用的内存很多,这主要由于DOM的结构是树形结构,这种结构比较消耗内存。
SAX
SAX是事件驱动型的XML解析方式,可以分段读取,需要什么样的内容就从xml里面读取哪一段,效率低,适合读取大文件。
8. 静态变量和实例变量的区别?
答:在语法定义上的区别:静态变量前面要加static关键字,而实例变量则不需要。
在程序运行时的区别:静态变量不属于任何对象,而是属于类,因此也属于类变量。而实例变量仅仅属于某个对象,必须创建了这个对象,才能给这个变量分配空间,然后通过这个对象来调用。而静态变量在类的字节码被加载后就分配了内存空间,这个时候就可以用静态变量了。
在内存中的位置区别:静态变量在static区,static区中的内容不允许重复,且static区在类的字节码被加载的时候就被执行,因此,所有类的静态变量都不会相同。实例变量位于栈区,栈区的内容是可以重复的。
生命周期的区别:静态变量的生命周期取决于类的生命周期,而实例变量的生命周期取决于对象的生命周期。
9. 局部变量和全局变量
答:局部变量是定义在方法体内的,而且局部变量一定要先初始化才能使用。成员变量是定义在类中方法外的,成员变量是不一定需要先初始化然后使用,因为在对象创建的时候会默认初始化成员变量,整数类型初始化值默认为0,浮点型默认为0.0,布尔值默认为false,char类型默认为空的字符。
当局部变量和成员变量重名时如何调用和区分:
当一个方法中有和成员变量重名的变量时,如果调用这个名字的变量,且不加任何前缀,则调用的一定是局部变量,这就是就近原则,如果想在方法中调用同名的成员变量,则可以通过this关键字来调用。
例:
class Te{
int a = 1;
public void put(){
int a = 2;
System.out.println(this.a); //通过this关键字调用同名的成员变量,也可以通过创建一个该类的实例来调用
System.out.println(a); //调用的是局部变变量
}
}
10. GC是什么? 为什么要有GC?
答:GC是java的垃圾收集机制(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。