面向对象的特征
抽象、封装、继承、多态
什么是继承
继承是面向对象中的一个非常重要的特征。通过继承,子类可以使用父类中的一些成员变量与方法,从而提高代码的复用性,提高开发效率。
继承主要有以下几个特性:
- Java语言不支持多重继承
- 子类只能继承父类的非私有(public和protected)成员变量与方法
- 当子类中定义的成员变量和父类中定义的成员变量同名时,子类中的成员变量会覆盖父类中的成员变量,而不会继承。
- 当子类中的方法与父类中的方法有相同的函数签名(相同的方法名,相同的参数个数与类型)时,子类会覆盖父类中的方法,而不会继承。
多态的实现机制是什么
在Java语言中,多态主要有以下两种表现方式:
- 方法的重载。重载是指同一个类中有许多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是编译时多态。
- 方法的覆盖。子类可以覆盖父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。由于只有在运行时才能确定调用哪个方法,因此通过方法覆盖实现的多态也可以称为运行时多态。
重载与覆盖有什么区别
重载(overload)与覆盖(override)是Java多态性的不同表现方式。
重载是一个类中多态性的表现,是指一个类中定义了多个同名的方法,他们或者有不同的参数个数或者不同的参数类型。在使用重载时,要注意以下几点:
- 重载时通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或者不同的参数顺序。
- 不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。
- 对于继承来说,如果基类方法的访问权限为private,那么不能在派生类对其重载;如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。
覆盖是指派生类(子类 )函数覆盖基类(父类)函数。覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时注意以下几点:
- 派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。
- 派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。
- 派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致。
- 基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对其覆盖。
重载和覆盖额的区别:
- 覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
- 覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。
- 覆盖要求参数列表相同;重载要求参数列表不同。
抽象类与接口有什么异同
如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract来表示一个类是抽象类。接口就是一个方法的集合,接口中的所有方法都没有方法体,通过关键字interface实现。前者是实体,后者是概念。
只要包含一个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。
接口中的成员变量都是static final类型。
抽象类和接口的相同点:
- 都不能被实例化。
- 接口的实现类或抽象类的子类都只有实现了接口或者抽象类中的方法后才会被实例化。
抽象类与接口的不同点:
- 接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
- 接口需要实现,但抽象类只能被继承。一个类可以实现多个接口,但一个类只能继承一个抽象类。
- 接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且,必须给其赋初值,其所有成员都是public、abstract的,而且只能被这两个关键字修饰。抽象类有自己的数据成员变量,也可以有非抽象的成员方法,** 不能有方法体**。而且,抽象类中的成员变量默认为default,也可以被定义为private、protected和public.
如何获取父类的类名
Java语言提供了获取类名的方法:getClass().getName()
public class Test{
public void test(){
System.out.println(this.getClass().getName());
}
public static void main(String[] args){
new Test().test();
}
}
this与super的区别
在Java语言中,this用来指向当前实例对象,它的一个非常重要的作用就是用来区分对象的成员变量和方法的形参。
super可以用来访问父类的方法和成员变量,当子类的方法或成员变量与父类有相同名字时也会覆盖父类的方法或者成员变量,要想访问父类的方法或成员变量只能通过super关键字。