接口和内部类未我们提供了一种将接口与实现分离的更加结构化的方法
抽象类
描述
面向对象的领域一切都是对象,通过具体的类来描述,但不是所有类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这个类我们称其为抽象类。
抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。
注意事项
- 抽象类不能实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
- 抽象方法必须由子类进行重写。
- 只要包含一个抽象方法的抽象类,该类必须定义成抽象类。
- 抽象类中可以包含具体方法。
- 子类中的抽象方法不能与父类的抽象方法同名。
- abstract不能与final(修饰类时表示不能被继承)同时修饰一个类。
- abstract不能与private、static、final或native并列修饰同一个方法。
public abstract class Animal {
public abstract void shout();
}
public class Cat extends Animal {
@Override
public void shout() {
System.out.println("cat : miaomiaomiao");
}
}
public class Dog extends Animal {
@Override
public void shout() {
System.out.println("dog : wangwangwang");
}
}
public class Test {
public static void main(String [] args){
Animal a = new Cat();
Cat cat = new Cat();
Dog dog = new Dog();
a.shout();
cat.shout();
dog.shout();
}
}
输出结果:
cat : miaomiaomiao
cat : miaomiaomiao
dog : wangwangwang
接口
描述
接口可以描述为抽象类的抽象。接口本身并不是类。通过使用implements关键字实现某个接口,接口实现了多继承的功能。
注意事项
- 接口中的方法的访问权限被自动声明为public。确切的说只能为public,当然你可以显示的声明为protected、private(编译不通过)
- 接口中的成员变量会自动变为public static final。
- 接口中不存在实现的方法。
- 实现接口的非抽象类必须实现接口中的所有方法。
- 不能使用new操作符实例化一个接口,可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用instanceof检查一个对象是否实现了某个特定的接口。
- 在实现多接口的时候一定要注意方法名重复。
public interface Animal {
int a = 10;
public static final int b = 10;
public void eat();
void shout();
public void test(Animal a);
}
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("cat : i like bone");
}
@Override
public void shout() {
System.out.println("cat : wangwangwang");
}
public void test(Animal a){
String str = "";
if(a instanceof Cat) {
str = "cat";
}
System.out.println(str);
}
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("dog : i like fish");
}
@Override
public void shout() {
System.out.println("dog : wangwangwang");
}
public void test(Animal a){
String str = "";
if(a instanceof Dog) {
str = "dog";
}
System.out.println(str);
}
}
public class Test {
public static void main(String [] args){
Animal a = new Cat();
Cat cat = new Cat();
Dog dog = new Dog();
a.shout();
cat.shout();
dog.shout();
a.eat();
cat.eat();
dog.eat();
cat.test(a);
cat.test(cat);
cat.test(dog);
dog.test(a);
dog.test(cat);
dog.test(dog);
}
}
输出结果
cat : wangwangwang
cat : wangwangwang
dog : wangwangwang
cat : i like bone
cat : i like bone
dog : i like fish
cat
cat
dog
抽象类与接口的区别
- 抽象层次不同:抽象类是对类抽象,而接口是对行为的抽象。
- 跨域不同:抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间存在一种“is-a”关系。接口则不同,它跟实现类之间是"like-a"关系。
- 设计层次不同:抽象类时自底向上抽象而来的,接口是自顶向下设计出来的。