我们定义一个抽象类person.class
表示类(人):
//使用关键字abstract
public abstract class person {
//吃东西的抽象方法,已经有所实现
public void eat(){
System.out.println("我是抽象方法吃东西");
}
//public 修饰的空实现的方法
public void run(){}
//无修饰,空实现
void walk(){}
//protected修饰的方法,空实现
protected void sleep(){}
//private修饰的空实现方法
private void read(){}
}
public void walk(){}
)也是实现的一种,而不能写 public void eat()
,后面必须带大括号。public
,protected
,private
,或者是没有,没有默认为只能在同一个包下面继承,如果是private
那么子类继承的时候就无法继承这个方法,也没有办法进行修改.Teacher.class
继承抽象类同一个包下继承:
不同的包下面继承:
同个包下正确的代码如下(不重写私有的方法):
public class teacher extends person {
@Override
public void run(){
System.out.println("我是实体类的方法跑步");
}
@Override
void walk(){
System.out.println("我是实体类的方法走路");
}
@Override
protected void sleep(){
System.out.println("我是实体类的方法睡觉");
}
}
eat()
方法的代码,重写是即使没有使用@Override
也是起作用的:public class teacher extends person {
public void eat(){
System.out.println("我是实体类的方法吃东西");
}
@Override
public void run(){
System.out.println("我是实体类的方法跑步");
}
@Override
void walk(){
System.out.println("我是实体类的方法走路");
}
@Override
protected void sleep(){
System.out.println("我是实体类的方法睡觉");
}
}
person.class
想要成为教师,可以实现教师的接口,可以理解为增加能力。public static final int i=5;
,以及public int number =0;
,但不允许public int num;
这样定义,所有private
的变量都不允许出现,下面是图片定义public int number =0;
默认是final修饰的,所以也不能改变它的值:
下面是正确的接口代码:Teacher.java
public interface Teacher {
public static final int i=5;
public int number =0;
public void teach();
void study();
}
public class TeacherClass implements Teacher{
@Override
public void teach() {
System.out.println("我是一名老师,我要教书");
System.out.println("接口的static int是:"+i);
}
@Override
public void study() {
System.out.println("我是一名老师,我也要学习");
System.out.println("接口的int number是:"+number);
}
}
public class Test {
public static void main(String[] args){
TeacherClass teacherClass = new TeacherClass();
teacherClass.study();
teacherClass.teach();
System.out.println("-----------------------------------------------------");
Teacher teacher =teacherClass;
teacher.study();
teacher.teach();
}
}
结果:
分析:接口里面所定义的成员变量都是final
的,不可变的,实现接口必须实现接口里面所有的方法,不能只实现一部分,没有使用static final
修饰的,默认也是final
,同时必须有初始化的值,接口不能直接创建对象,比如Teacher teacher = new Teacher() ,但是可以先创建一个接口的实现类,然后再赋值于接口对象。
抽象类 | 接口 |
---|---|
使用关键字abstract修饰 | 使用关键字interface |
使用关键字extends实现继承,可以只实现一部分方法,一部分不实现,或者不实现也可以 | implements来实现接口,实现接口必须实现里面都有的方法 |
抽象类里面的方法可以是空实现,可以默认实现,但是必须要带{} | 接口里面的方法都没有实现体,也就是{} |
抽象类中可以有具体的方法以及属性,也可以有静态代码块,静态成员变量 | 接口里面不能有普通成员变量,必须都是不可变的final成员变量,而且所有的成员变量都必须是public |
抽象类里面的方法可以是public,protect,private,但是private无法继承,所以很少人会这么写,如果没有修饰符,那么只能是同一个包下面的类才能继承 | 接口的方法只能是public或者无修饰符,所有的private修饰都是会报错的 |
如果有改动,添加新的方法,可以直接在抽象类中实现默认的即可,也可以在实现类中实现 | 接口增加新方法必须在接口中声明,然后在实现类中进行实现 |
抽象类不能直接创建对象 | 接口也不能直接创建对象 ,可以赋予实现类的对象 |
抽象类可以有main方法,而且我们可以直接运行,抽象类也可以有构造器 | 接口不能有main方法,接口不能有构造器 |
那么我们什么时候使用接口什么时候使用抽象类呢?
person.class
这个抽象类,提供相关的方法,属性,但是接口是只提供方法的,也就是像增加功能的,那么也就是对方法的抽象。本文章是初学时的记录,仅是初级的对比,深入学习还需各位保持Keep going~
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
技术之路不在一时,山高水长,纵使缓慢,驰而不息。Keep going~