一、抽象类
(1)抽象类在类名前使用关键字abstract声明,如下:
public abstract class AbstractMammal{}
(2)抽象类中可以没有抽象方法,如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
* 抽象类中可以没有抽象方法
*/
public abstract class AbstractMammal {
void eat() {
System.out.println("吃");
}
}
(3)抽象类中变量和方法可以使用private/protected/public/final/static关键字修饰,也可以是默认,如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
* 抽象类中可以没有抽象方法
*/
public abstract class AbstractMammal {
//private修饰,同一个类中可见
private int a;
//默认,同一包内可见
int b;
//protected修饰,同一包内和所有子类可见
protected int c;
//public修饰,所有类可见
public int d;
//static,类变量
static int e;
//final,必须初始化,子类不可修改
final int f = 0;
//子类可继承/重写(重写后会覆盖),不可直接访问
private void a() {
System.out.println("a");
}
//子类可以继承/重写/访问
protected void b() {
System.out.println("b");
}
//子类可以继承/重写/访问
void c() {
System.out.println("c");
}
//子类可以继承/重写/访问
public void d() {
System.out.println("d");
}
//子类可以继承/重写/访问
static void e() {
System.out.println("e");
}
//子类可以继承,不可重写,可以访问
final void f() {
System.out.println("f");
}
}
(4)抽象类中可以有构造方法(默认或者自定义),如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
* 抽象类中可以没有抽象方法
*/
public abstract class AbstractMammal {
//无参构造方法,默认
AbstractMammal(){}
//含参构造方法
AbstractMammal(String name){
System.out.println(name);
}
}
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
*/
public class Test {
public static void main(String[] args) {
AbstractMammal abstractMammal=new AbstractMammal() {
};
AbstractMammal mammal=new AbstractMammal("张三") {
};
}
}
(5)抽象类中方法可以没有方法体(方法体指的是一对大括号),但必须使用abstract修饰(称为抽象方法),抽象方法不可以使用private修饰(子类无法实现),如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
* 抽象类中可以没有抽象方法
*/
public abstract class AbstractMammal {
abstract void eat();
}
(6)如果一个类继承于一个抽象类,则该类必须实现抽象类的抽象方法。如果没有实现抽象方法,则必须将该类也定义为abstract类。
二、接口
(1)接口在接口名称前使用interface关键字修饰,如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
*/
public interface Animal {
}
(2)接口中的方法均为public(关键字通常省略),接口中方法可以没有方法体(此时是public abstract),也可以有具体实现,具体实现的方法但必须使用default关键字修饰(JDK1.8引入),如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
*/
public interface Animal {
void walk(); //public
default void eat() {//JDK1.8开始接口可以实现方法,必须使用default关键字,自动是public
System.out.println("吃");
}
}
(3)接口中定义的变量是public static final的,必须初始化,实现类不可修改,如下:
package main.abstractclass;
/**
* Created by leboop on 2018/11/17.
*/
public interface Animal {
int a = 0; //final和static,必须初始化,子类中不可更改
}
(4)接口中不可以有构造方法
三、两者区别
以上已经展示了部分区别,它们还有以下几点不同:
(1)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
(2)子类使用extends继承一个抽象类,而一个类使用implements实现一个接口