抽象类和接口都是用来规范一个类里面需要实现哪些方法
抽象类里面的抽象方法,只有方法名,没有方法体,继承抽象类的类必须重写这个抽象类的所有抽象方法
接口里面也只有抽象方法,实现这个接口的类需要重写这些抽象方法
由于java里面是单继承,所以1个类最多继承1个类,但是1个类可以实现多个接口,所以实现接口这种方式更常用
抽象类:
abstract class Person
{
public abstract void run();
public abstract String getName();
}
方法:
interface Person
{
void run();
String getName();
}
1.抽象方法
正常来说是这样的:
class Person
{
public void run()
{
}
}
类里面的方法必须有方法体,不加方法体(即直接public void run();如下图)是会报错的
将这个方法设为抽象方法就可以不需要方法体:
2.抽象类:
当一个类中含有一个抽象方法的时候,必须将这个类也声名为抽象类
如果你把一个类定义为了抽象类,就会强迫它的子类重写抽象类里面的抽象方法,因此抽象方法相当于定义了一种规范
抽象类中可以有非抽象方法
例如:Person类这个抽象类中
定义了抽象方法run()
,那么,在子类Student中
,就必须重写run()
方法
abstract class Person
{
public abstract void run();
}
class Student extends Person
{
@Override
public void run()
{
System.out.println("Student.run");
}
}
3.接口
接口就是用来规范一个类的,规定一个类中必须包含哪些函数(也就是哪些方法)
因为一个类实现某个接口的时候,需要重写这个接口中所有的方法
(1)抽象类可以修改为接口:
abstract class Person
{
public abstract void run();
public abstract String getName();
}
将这个抽象类修改为接口:
interface Person
{
void run();
String getName();
}
(2)接口是比抽象类还要抽象,因为抽象类中还可以有属性,但是接口中连属性都没有
(3)接口中所有的方法默认都是public abstract(),所以这两个修饰符不需要写出来(写不写效果都一样)
(4)一个类实现某个接口的时候,需要重写这个接口中所有的方法:
但是一个类继承某个抽象类的时候,只需要重写这个抽象类中的所有抽象方法,非抽象方法不需要重写
class Student implements Person
{
private String name;
public Student(String name)
{
this.name = name;
}
@Override
public void run()
{
System.out.println(this.name + " run");
}
@Override
public String getName()
{
return this.name;
}
}
(5)一个类只能继承一个类,不能多继承,继承多个类,但是一个类可以实现多个接口
(6)一个interface
可以继承自另一个interface
,相当于扩展了接口的方法:
interface Hello
{
void hello();
}
interface Person extends Hello
{
void run();
String getName();
}
Person
接口继承自Hello
接口,因此,Person
接口现在实际上有3个抽象方法