Java面试知识点(二)
1.面向对象与面向过程有什么区别?
1)出发点不同。
2)层次逻辑关系不同。
3)数据处理方式与控制程序方式不同。
4)分析设计与编码转换方式不同
2.面向对象有哪些特征?
主要特征:抽象、封装、继承和多态。
1)抽象。忽略一个主题中与当前目标无关的那些方面。分为过程抽象和数据抽象。
2)继承。对象的一个新类从现有的类中派生。
3)封装。将客观事物抽象成类,每个类对自身的数据和方法实行保护。
4)多态。允许不同类的对象对同一消息作出响应。
3.面向对象的开发方式有什么优点?
1)较高的开发效率。
2)保证软件的鲁棒性。
3)保证软件的高可维护性。
4.什么是继承?
class 子类名 extends 父类名
继承特性:
1)Java中不支持多重继承,但可以通过多个接口来达到多重继承的目的。
2)子类只能继承父类的非私有(public与protected)成员变量与方法。
3)当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖父类的成员变量,而不会继承。
4)当子类中的方法与父类中的方法有相同的函数签名(相同的方法名,相同的参数个数与类型)时,子类将会覆盖父类的方法,而不会继承。
5.组合和继承有什么区别?
组合是在新类里面创建原有 类的对象,重复利用已有类的功能。
继承关系是“is-a”关系;组合关系是“has-a”关系。
继承:
class Verhicle{
}
class Car extends Verhicle{
}
组合:
class Tire{
}
class Car extends Verhicle{
private Tire t = new Tire();
}
使用中如何选择?
1)除非两个类之间是“is-a”关系,否则不要轻易使用继承。
2)不要仅仅为了实现多态而使用继承,如果类之间没有“is-a”关系,可以通过实现接口与组合的方式来达到相同的目的。
注:在Java中,能使用组合就尽量不要使用继承。
6.多态的实现机制是什么?
1)方法的重载。编译时多态。 一个类中方法的多态性。
2)方法的覆盖。运行时多态。
编译时多态是通过方法的重载实现的,运行时多态是通过方法的覆盖(子类覆盖父类方法)实现的。
7.重载和覆盖有什么区别?
重载是指在一个类中定义了多个同名的方法,它们的参数个数或参数类型不同。
覆盖是指派生类函数覆盖基类函数。
①派生类中覆盖方法必须和基类中被覆盖方法有相同的函数名和参数。
②派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。
③派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致。
④基类中被覆盖的方法不能为pirvate,否则其子类只是定义了一个方法,并没有对其覆盖。
两者的区别:
①覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
②覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。
③覆盖要求参数列表相同;重载要求参数列表不同。
④覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。
8.抽象类与接口有什么区别?
抽象类:
abstract class 抽象类名称{
属性;
访问权限 返回值类型 方法名称 (参数){
[return 返回值];
}
访问权限 abstract 返回值类型 方法名称(参数); //抽象方法
}
接口:
interface 接口名称{
全局变量;
抽象方法;
}
相同点:
①都不能被实例化。
②接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。
不同点:
①接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
②接口需要实现,但抽象类只能被继承。一个类可以实现多个接口,但一个类只能继承一个抽象类。
③接口强调特定功能的实现,设计理念“has-a”关系;而抽象类强调所属关系,其设计理念“is-a”关系。
④接口中定义的成员变量默认为public static final,所有成员方法都是public abstract的。抽象类可以有自己的成员变量,也可以有费抽象的成员方法,而且抽象类的成员变量默认为defalut,当然也可定义为其他。
当功能需要累积时,用抽象类;不需要累积时,用接口。
接口一种特殊的抽象类,使用接口完全可能实现与抽象类相同的操作,但一般而言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或多个对象之间的特定交互行为时,应该使用接口。
9.内部类有哪些?
主要有:静态内部类、成员内部类、局部内部类、匿名内部类
class outerClass{
static class innerClass{} //静态内部类
}
class outerClass{
class innerClass{} //成员内部类(普通内部类)
}
class outerClass{
public void function{
class innerClass{} //局部内部类
}
}
public class A extends B{
public a{
fun1(new fun2()){ //匿名内部类
public void printInfo{
system.out.println("Hello world");
}
}
}
}
静态内部类是被声明为static的内部类,它可以不依赖外部类实例而被实例化,通常的内部类需要在外部类实例化后才能实例化。它不能与外部类有相同的名称,不能访问外部类的成员普通成员变量,只能访问外部类中的静态成员和静态方法。
成员内部类:只有在外部类被实例化后,这个类才能被实例化且非静态内部类中不能有静态成员。
局部内部类就像局部变量一样,不能被public、protected、private以及static修饰,只能访问方法中定义为final类型的局部变量。
匿名内部类是一种没有类名的内部类,不使用关键字class、extends、implements,没有构造函数,它必须继承其他类或实现其他接口。
10.如何获取父类的类名?
Java中获取类名的方法:
getClass().getName()
getClass().gerSuperclass.getName() //利用反射机制在子类得到父类的名字
11.this和super有什么区别?
this可以代表访问当前类的属性(若本类无,再去找父类),方法(若本类无,再去找父类),构造方法(必须放在构造方法的首行),以及当前对象。
super可以访问父类中的属性,父类方法,父类构造方法(必须放在子类构造方法的首行)
无论子类如何操作,最终必须要首先调用父类中的构造方法。