Java学习——面向对象【3】
1. 继承
- java的类是单继承(一个子类只能继承一个父类),不能多继承(多个父类):A继承自B,A也继承自C,可以多重继承,就是A继承自B,B继承自C(A->B->C),
- 所有的类都继承于java.lang.Object。
- 子类继承父类中非private的属性和方法。
- 子类不能继承父类的构造器(构造方法或者构造函数)。
- 如果父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的当属列表。如果父类有无参构造器,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类 的无参构造器。
2. 多态
多态是同一个行为具有多个不同表现形式或形态的能力。方法的重写和重载是java多态性的不同表现。
重写(override) | 重载(overload) | |
范围 | 子类重写父类 | 同一个类 |
定义 | 完全相同 |
1. 参数列表必须改变 2. 返回类型/访问修饰符可以修改 |
访问权限 | 不能比父类的低 | 可以修改 |
异常 |
1. 可以有任何非强制异常 2. 不能有新的强制性异常或比原来更广泛的 |
被重载的方法可以声明新的或更广的检查异常 |
final函数 | 不能被重写 | 可以 |
static函数 | 不能被重写 | 可以 |
构造函数 | 不能被重写 | 可以 |
其他 |
1. 子类和父类在同一个包中,那么子类可以重写所有方法,除了声明为private和final的方法 2. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法 3. 如果不能继承一个方法,则不能重写这个方法 |
3. 封装(Encapsulation)
将抽象性函式接口的实作细节部份包装、隐藏起来的方法。
4. 抽象类
-
不能被实例化
-
不一定包含抽象方法,但是有抽象方法的类必定是抽象类
-
抽象类中的抽象方法只是声明,不包含方法体
-
构造方法,类方法(用static修饰的方法)不能声明为抽象方法
-
抽象类的子类必须给出抽象类中所有的抽象方法的具体实现,除非该子类也是抽象类
5. 接口(Interface)
接口是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
类 | 接口 | 抽象类 | |
构造方法 | 有 | 无 | 有 |
实例化对象 | 可以 | 不可以 | 不可以 |
抽象方法 | 无 | 必须是抽象方法 | 可以有非抽象方法 |
方法修饰符 | 任意 | public abstract | 任意 |
成员变量类型 | 任意 | public static final | 任意 |
static | 可以有 | 不能有 | 可以有 |
继承 | 单继承 | 可以多继承 | 单继承 |
类继承(实现)方式 | extends 类名 | implements 接口名 | extends 类名 |
其他 |
1. 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常 2. 接口可以继承(extends)另一接口 3. 如果实现接口的类是抽象类,那么就没必要实现该接口的方法 |
标记接口: 没有任何方法和属性的接口。仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。标记接口主要用于以下两种目的:
-
建立一个公共的父接口:正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
-
向一个类添加数据类型:实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。
6. java包(package)
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用
-
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
-
避免名字冲突:如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。
-
包限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
例子
创建一个animals的包,并在 animals 包中加入一个接口(interface)。通常使用小写的字母来命名避免与类、接口名字的冲突。
package animals;
interface Animal {
public void eat();
public void travel();
}
类放在包中会有两种主要的结果:
- 包名成为类名的一部分
- 包名必须与相应的字节码所在的目录结构相吻合
7. import 关键字
"import" 语句导入包,则程序中就可以使用该包内的成员。
9. 其他
super:引用当前对象的父类,用于访问父类成员
this:指向当前对象