抽象类和接口
抽 象 类
抽象方法
:用abstract关键字修饰的方法。
抽象方法的特点
:
- 不能有方法体。
- 抽象方法是用来被重写(Override)的。
抽象类
:存在抽象方法的类就叫抽象类。用abstract关键字修饰。
抽象类的成员
:
- 成员变量:可以是变量,也可以是常量。
- 成员方法:
- 抽象方法:限定子类中必须重写的一些方法;
- 非抽象方法:直接被子类继承,提高代码的复用性。
- 构造器:存在。便于子类访问父类的成员数据。
抽象类的特点
:
- 抽象类不能实例化。
- 抽象类是用来被继承(extends)的。
- 可以通过多态来访问成员变量。
抽象方法与抽象类的关系
:
- 包含抽象方法的类一定是抽象类;
- 抽象类中的方法不一定是抽象方法。
接 口
接口(interface)
:接口是一种特殊的抽象类,是一系列抽象方法的集合。与抽象类不同,不可以声明普通方法。
接口的特点
:
- 接口不能被实例化。
- 接口是用来被实现(implements)的。
- 要实现接口,就必须实现接口中的所有(抽象)方法。这就决定了实现类要么实现接口的所有方法,要么是是抽象类。
接口的成员
:
- 成员变量:默认是常量,由public static final修饰。
- 构造器:无。
- 成员方法:只能是抽象方法,由public static final修饰。
接口与类的关系
:
- 类和类的关系:继承extends。只能是单继承,可以多层继承(非多重继承)。
- 接口和接口的关系:继承extends。接口的而继承可以是单继承,可以是
多重继承
,还可以是多层继承。 - 类和接口的关系:实现implements。可以单实现,也可以多实现。在实现接口的同时,还可以继承一个父类。
接口与抽象类的区别
:
- 成员组成。
- 使用方式:
- 抽象类:子类继承。
- 接口:实现类实现。
- 关系:抽象类可以实现接口。接口不能继承抽象类,可以继承多个接口。
- 面向对象编程的设计思想层面:
- 抽象类更侧重于对相似的类进行抽象,形成抽象的父类以供子类继承使用;
- 而接口往往在程序设计的时候,定义模块与模块之间应满足的规约或者定义一种标准,使各模块之间能协调工作。
内 部 类
内部类是定义在类中的类。根据定义的类位置及修饰符的不同,分为了成员内部类,静态内部类,局部内部类、匿名内部类等四种类型。
成员内部类
-
成员内部类定义在外部类的内部,相当于外部类的一个成员变量,可以使用任意访问控制符的修饰。
-
成员内部类访问外部类:
- 可以不受访问控制符的影响,直接访问外部类中的属性和方法,包括私有成员。
- 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量和方法,如果要访问外部类的成员变量,可以使用
Outer.this.成员变量
来访问。
-
访问成员内部类:
- 外部类不能直接使用内部类的成员和方法。(可以先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法)
- 在外部类范围之外,成员内部类的使用,需要先生成外部类对象,然后再以
外部类对象.new 内部类()
的形式生成内部类对象。
-
Java 编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部 类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。
注意
:
将一个类 设计为内部类的目的 ,大多数都是不想外界访问,所以内部类的定义应该私有化,私有化之后 在提供一个可以让外界调用的方法,方法内部常见内部类对象并调用。
package day7.inner;
//外部类
public class Oter{
private int number1 = 10;//外部类成员变量
private int number2 = 11;
public Oter(){
}
public Oter(int number){
this.number1 = number;
}
//成员内部类
protected class Inner1{
private int number1 = 20;
private int number3 = 21;
//编译错误!非静态内部类中不能存在静态成员
//static int happy = 1000;
public Inner1(){
}//成员内部类的构造方法
public void inTest1(){
System.out.println("内部类默认访问自己的成员变量:"+number1); //20
System.out.println("调用外部类的同名成员变量(方法一):"+Oter.this.number1); //10
System