Java抽象类和接口
父类定义了子类中的共同行为,接口定义不同类的共同行为。
抽象类
抽象类不可 new 一个实例,可以包含抽象方法,没有实现,这些方法在子类中实现。
使用 abstract 修饰符表示,用在方法或者类前。
包含抽象方法的类必须声明为抽象类。
抽象类的构造方法定义为 protected,因为只能被子类调用
注意:子类可以覆盖父类的方法并定义为 abstract,为了使父类的方法变得无效;
父类是具体的,子类也可以定义为抽象类。
接口
接口和类很相似,但是只包含常量和抽象方法。
目的是为了指明各种对象的共同行为。表示 “is-kind-of” 关系
使用关键字 interface 定义一个接口,语法:
修饰符 interface 接口名{
/\*\* 常量声明 \*/
/\*\* 方法签名 \*/
}
某个类实现该接口时,使用关键字 implement ,这种关系称为接口继承,和类继承本质相同,都简称 继承。
接口和抽象类的比较
抽象类:变量和方法无限制;子类通过构造方法链调用构造方法,不能用new实例化。
接口:变量必须是 public static final;方法必须是 public abstract 实例方法;没有构造方法;不能用new实例化。
一般 类名是名词,接口名是形容词或者名词。
举栗子
package test;
interface A {
public static final String MSG = "hello"; // 全局常量
public abstract void print(); // 抽象方法
}
interface B {
public abstract void get();
}
class X implements A, B {
@Override
public void print() {
System.out.println("AAAAA");
}
@Override
public void get() {
System.out.println("BBBBB");
}
}
public class test {
public static void main(String[] args) {
// 第一个测试
X x = new X(); // 实例化子类对象
A a = x; // 向上转型
B b = x; // 向上转型
a.print();
b.get();
System.out.println(A.MSG);
// 第二个测试
A aa = new X();
B bb = (B) aa;
bb.get();
// 第三个测试
A aaa = new X();
B bbb = (B) aaa;
bbb.get();// aaa本质上是X对象的实例
System.out.println(aaa instanceof A);
System.out.println(aaa instanceof B);
}
}
// 程序运行结果:
// AAAAA
// BBBBB
// hello
//BBBBB
//BBBBB
//true
//true
还没有评论,来说两句吧...