目录
1.抽象类
在回答这个问题之前,我们先来回忆一下什么是类?
class Animal {
public void eat() {
System.out.println("这是一个普通类中的普通方法!");
}
}
接下来做一些小小的改变,注意看!!
abstract class Animal {
abstract public void eat();
}
发现了有什么变化吗?我们在类和方法的前面加上了abstract代表这个类或方法是一个抽象类/抽象方法,并且这个方法没有用大括号具体的实现,是因为抽象方法不能执行具体的代码。
概念:抽象类/抽象方法就是从多个事物中将共性抽取出来,所以他们存在的意义就是被继承。抽象类本身不能实例化,想要使用,只能创建抽象类的子类,然后让子类重写抽象类中的抽象方法。
注意事项:
1.抽象类不能实例化
Animal animal = new Animal();
/*编译出错:
java: Animal是抽象的; 无法实例化*/
2.抽象方法不能是private的
abstract public class Animal {
abstract private void eat();
}
/*编译出错:
java: 非法的修饰符组合: abstract和private*/
3.抽象类中可以包含其他的非抽象方法,也可以包含字段,这个非抽象类方法和其他普通方法规则一样,可以被重写,也可以被子类直接调用
abstract public class Animal {
abstract public void eat();
public void func() {
System.out.println("func()执行了");
}
}
public class Dog extends Animal{
public void eat() {
System.out.println("Dog is eating");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.func();
}
}
执行结果: func()执行了
抽象类的作用
2.接口
接口是抽象类的更进一步,抽象类中还可以包含非抽象类和字段,而接口中包含的方法都是抽象方法,字段只能包含静态常量。
1.使用interface定义一个接口
2.接口中的方法一定是抽象方法,因此可以省略abstract
3.接口中的方法一定是public,因此可以省略public
4.一个类使用implements继承接口,此时表达的含义是“实现”
5.接口不能单独被实例化
public interface IRunning {
void run();
}
public interface ISwimming {
void swim();
}
实现接口:
abstract public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
public class Dog extends Animal implements IRunning{
public Dog(String name) {
super(name);
}
public void run() {
System.out.println(name+" is running");
}
}
public class Fish extends Animal implements ISwimming{
public Fish(String name) {
super(name);
}
public void swim() {
System.out.println(name+" is swimming");
}
}
public class Duck extends Animal implements IRunning, ISwimming {
public Duck(String name) {
super(name);
}
public void run() {
System.out.println(name+" is running");
}
public void swim() {
System.out.println(name+" is swimming");
}
}
上面的代码展示了,一个类继承一个父类,同时实现一个或多个接口。
内容为狗属于动物,并且会跑;鱼属于动物,并且会游泳;鸭子属于动物,既会跑又会游泳。
总结
抽象类和接口都是Java中多态的使用方式,核心区别是抽象类可以包含普通方法和普通字段,这样的普通方法和普通字段可以被子类直接使用(不必重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法。