抽象类
new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。
基本概念:含有抽象方法的类就是抽象类,抽象类必须使用abstract关键字声明。
抽象方法:即没有方法体的方法,同时使用abstract修饰。
继承抽象类的关键字是extends
//定义一个抽象类
abstract class A{
public void fun(){
System.out.print("hello world");
}
public abstract void print();//抽象方法,没有方法体,有关键字abstract修饰。
}
注意:
1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
2、抽象方法必须由子类来进行重写。
3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、abstract不能与final并列修饰同一个类。
7、abstract 不能与private、static、final或native并列修饰同一个方法。
8、抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,
那么子类也必须定义为抽象的。换句话说,在继承自抽象类的非抽象子类中,必须
实现所有的抽象方法。还要注意到,抽象方法是非静态的。
实例
abstract class Animal {//定义一个抽象类
public abstract void eat(); //抽象方法
}
class Cat extends Animal{
public void eat(){//子类重写抽象方法
System.out.println("我吃鱼");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("我吃骨头");
}
public void run(){
System.out.println("我会跑");
}
}
public class book {
public static void main(String[] args) {
Animal a1 = new Cat(); //向上转型
Animal a2 = new Dog();
a1.eat();
a2.eat();
}
}
//输出
//我吃鱼
//我吃骨头
接口
基本概念
接口是一种比抽象类更加抽象的“类”。但是它的目的是指明相关或者不相关类的对象的共同行为。例如,使用适当的接口,可以指明这些对象是可比较的、可食用的或者可克隆的。
就比如,动物可以吃东西,人类也可以吃东西,但两者时不同的类,有本质的区别,但吃东西是都会进行的行为,这是就可以把吃东西定义为一个接口,而人类和动物都是抽象类。生活中的USB就可以看作一个接口。
定义接口的关键字是interface,实现接口的关键字是 implements。
//定义一个接口
interface Demo {
void method1();
void method2();
}
注意:
1、接口中的所有方法都是public,抽象方法。一个类可以实现一个或者多个接口。
2、不能使用new操作符实例化一个接口, 而且在接口中所列的所有方法必须在别处被重写。
3、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。
4、在实现多接口的时候一定要避免方法名的重复。
实例:
interface Animal {//定义一个接口
void eat();
}
class Cat implements Animal{//引用接口
public void eat(){
System.out.println("我吃鱼");
}
}
class Dog implements Animal{//引用接口
public void eat(){
System.out.println("我吃骨头");
}
public void run(){
System.out.println("我会跑");
}
}
public class book {//实现
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
cat.eat();
dog.eat();
}
}
//我吃鱼
//我吃骨头
抽象类和接口的区别
接口和抽象类很像,它们都具有如下特征。
- 接口和抽象类都不能被实例化,主要用于被其他类实现和继承。
- 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
接口是对动作的抽象,抽象类是对本质的抽象。
抽象类 | 接口 | |
实现 | 子类使用 extends 关键字来继承抽象类,如果子类不是抽象类,则需要提供抽象类中所有声明的方法的实现。 | 子类使用 implements 关键字来实现接口,需要提供接口中所有声明的方法的实现。 |
访问修饰符 | 可以用 public、protected 和 default 修饰 | 默认修饰符是 public,不能使用其它修饰符 |
方法 | 无限制 | 可以包含public的抽象实例方法。静态方法以及默认方法 |
变量 | 无限制 | 所有变量必须是public static final |
构造方法 | 抽象类里的构造方法并不是用于创建对象,而是让其子类调用这些构造方法来完成属于抽象类的初始化操作 | 没有构造方法 |
Java只允许为类的继承做单一继承,但是允许使用接口做多重继承。
接口可以继承其他接口但不能继承类。一个类可以继承它的父类同时实现多个接口。
所有的类共享同一个根类object,但是接口没有共同的根。
使用方向
- 当你关注一个事物的本质的时候,用抽象类;
- 当你关注一个操作的时候,用接口。