目录
抽象类
定义
有abstract修饰的类,我们称之为抽象类
如:abstract class Test{};
方法
抽象类可以有具体方法和抽象方法,通过把类或者类中的方法声明为abstract来表示一个类是抽象类
抽象方法如:abstract void play();
变量
和普通类一样
有抽象方法的类一定为抽象类,抽象类不一定有抽象方法。
抽象类是可以有私有方法或私有变量的。
和普通类的区别
- 不能创建对象
- 一般类继承了抽象类必须实现抽象方法
- 抽象方法修饰词只能是public或者protected
使用规则
- 子类不能通过super关键字调用父类的抽象方法
E.g:
abstract class AA
{
public abstract void B();
}
class CC extends AA
{
public void B()
{
System.out.println("you are right!");
}
}
public class yt2 {
public static void main(String[] args) {
AA a = new CC();
a.B();
}
}
//输出:you are right!
//被调用的是覆写后的方法
接口
定义
非常抽象的类型,类型为Interface修饰
如:(public) Interface Test(){};
方法
必须为抽象方法。修饰词必须为public abstract
变量
修饰词必须为 public static final
接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字Interface实现。
使用规则
1.对于接口的子类(不是抽象类)必须覆写接口中的全部抽象方法,之后可以利用子类的向上转型通过实例化子类来得到接口的实例化对象
E.g:
interface Person
{
public static final String aa="taotao!";
public abstract void print();
}
interface Studen
{
public abstract String getName();
}
class Teacher implements Person,Studen
{
public String getName()
{
return Person.aa;
}
public void print()
{
System.out.println(Person.aa);
}
}
public class yt3 {
public static void main(String[] args) {
Person bb = new Teacher();
bb.print();
Studen cc = (Studen)bb;
System.out.println(cc.getName());
}
}
//输出:taotao!
// taotao!
2.当一个子类既需要实现接口,又需要继承抽象类时,应先使用关键字extends继承一个抽象类,然后使用关键字 implements 实现多个接口
E.g:
interface Person
{
public void print();
}
abstract class Name
{
public abstract void getName();
}
class Teacher extends Name implements Person
{
public void print()
{
System.out.println("taotao!");
}
@Override
public void getName()
{
System.out.println("tao!");
}
}
public class yt3 {
public static void main(String[] args) {
Person bb = new Teacher();
bb.print();
Name cc = new Teacher();
cc.getName();
}
}
//输出:taotao!
// tao!
3.抽象类是可以通过implements关键字实现接口的,但是接口不可以通过extends关键字继承抽象类的
4.接口不能通过extends关键字继承抽象类,但是可以通过extends关键字来继承多个接口
interface Teacher extends Name,Person{}//Name和Person都是接口
抽象类和接口的相同点
- 都不能被实例化(不能new)
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化
- 未能实现抽象类或接口中的所有方法时,抽象类子类或接口实现类都必须是抽象类
抽象类和接口的区别
参数 | 抽象类 | 接口 |
关键字 | Abstract class | interface |
修饰符 | 可以是Public、protected、default | 只能是public |
方法 | 既可以含普通方法,也可以含抽象方法 | 只能含抽象方法,且必须是public的 |
构造器 | 可以有构造器 | 不能有构造器 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类使用关键字implements来实现接口,它需要提供接口中所有声明的方法的实现 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码 | 如果你往接口中添加方法,那么你必须改变实现该接口的类 |