自从猫狗霸占我的床之后,无事可做,就被迫学习。。。。。
Java中定义的没有方法体的方法,称该方法为抽象方法,包含抽像方法的类称为抽象类。
当类中的方法不确定有什么内容时,可以先使用一个抽象类
//例如
abstrack class Animal{
//抽象方法没有大括号{},并且前有abstract关键字所修饰
public abstrack void eat();
}
abstrack class Cat extends Animal{
/*当继承的父类里出现抽象方法时,继承方式有两种:
1.子类应被abstract所修饰
2.父亲中所有抽象方法要重写
*/
void eat(){
}
}
public static void main(String[] args)
{
//Animal a=new Animal(); 会报错,抽象类无法实例化
}
抽象类的特点
- 抽象类中可以有构造方法
- 抽象类中可以定义不是抽象类的方法
- abstract 使用时不能与public static final等关键字同时使用
- 抽象类一定是个父类
接口
特殊的抽象类
格式
interface 接口名{}
接口中成员修饰符是固定的。
成员变量:public static final
成员函数:public abstract
接口中的默认方法,需要使用default修饰
//接口类似于继承但不同,类与接口之间是实现关系
//接口不能实例化对象
interface A{
public static final string name="zs";
public abstract void eat();
}
//实现接口A,A中有抽象函数,处理方法与继承相同,有两种
class B implements A{
public void eat(); //在这我选重写这一方式
}
interface C{
}
//子类在继承一个类的同时,还可以实现多个接口
//优点,避免了单继承的局限性
//要先继承一个类再实现接口
class D extends B implements A,C{
}
//类与类之间是单继承,接口与接口之间是多继承
interface E extends A,C{
}
接口的应用
举个栗子
这里我们可以从底层不断寻找共性向上层抽取。这种可以用继承关系来处理
当对象拥有多个技能时,这是用接口来实现
来写代码吧
class Person{
String name;
String sex;
void eat()
{
System.out.println("人要吃饭。");
}
void sleep()
{
System.out.println("人要睡觉。");
}
}
abstract class Student extends Person{ //我不会用英语写运动员so临时改成学生和老师
abstract void learn();
}
abstract class Teacher extends Person{
abstract void teach();
}
interface A{
//jdk1.8之后,jdk默认为public abstract方法
void LearnEglish();
}
class Bstudent extends Student implements A{
public void learn(){
System.out.println("学习篮球");
}
public void LearnEglish()
{
System.out.println("学英语");
}
}
class Bteacher extends Teacher{
public void teach(){
System.out.println("教篮球");
}
}
class Demo1{
public static void main(String[] args)
{
Bstudent s=new Bstudent();
s.learn();
s.LearnEglish();
}
}
总结抽象类和接口
相同:都是将相同的东西抽取出来
不同:
- 抽象类需要被继承,接口需要被实现
- 抽象类只能单继承,接口可以多实现
- 抽象类可以有抽象和非抽象的方法,接口只能是抽象方法
- 抽象类的继承,是该体系中基本共性的内容,接口是该体系中额外的功能