java 为什么有抽象类和接口
1.抽象类
class Animal //创建一个动物类:父类
{
String name;
int age;
public void cry() //动物会叫
{
System.out.println("不知道怎么叫!"); //可是我们不知道它怎么叫
}
}
class Dog extends Animal //狗继承了动物类
{
@Override
public void cry() //狗类重写了方法
{
System.out.println("汪!汪!");
}
}
class Cat extends Animal //猫继承了动物类
{
@Override
public void cry() //猫类重写了方法
{
System.out.println("喵!喵!");
}
}
猫和狗类虽然继承并重写了父类方法,但是父类方法的方法体一点用都没有!!!
结果:这就是 父类方法的不确定性 。所以用抽象类来把父类的设计的抽象,以至于它都没有任何具体的事例
当父类的方法不能够确定时,可以用abstract关键字修饰该方法,被abstarct修饰的方法是抽象方法,被abstract修饰的类叫抽象类。
所以上面的程序可以改为:
abstract class Animal //抽象类 { String name; int age; abstract public void cry(); //抽象方法,不需要实现这个方法 } class Dog extends Animal { @Override public void cry() { System.out.println("汪!汪!"); } } class Cat extends Animal { @Override public void cry() { System.out.println("喵!喵!"); } }
抽象类需要注意的几点:
(1)抽象类不能被实例化(抽象类必须由子类覆盖定义了父类的所有抽象方法后,子类才能实例化,否则这个子类还是抽象类)。
(2)有抽象方法的类,一定是抽象类,但是抽象类可以没有抽象方法。
(3)当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法全部实现。
(4)抽象方法不能有方法体。
something: 1.抽象类中除了抽象方法,还可能有许多一般方法,你可以继承后直接拿去用,提高效率。 2.抽象类中,已经实现的方法是为了代码复用;待实现的方法是为了限制子类的功能。 3.简单来说就是设计模式中的模板模式(Template Pattern)。 4.如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
2.接口
public interface Test { void delete(String name); } public interface Test001 { void update(String name); } public class ITestImpl implements Test, Test001 { @Override public void delete(String name) { System.out.println("删除"); } @Override public void update(String name) { System.out.println("更新"); } }
接口的格式是被interface修饰的,不是用class修饰的,接口也是抽象的,使用方法和抽象类有点类似,那为什么要用接口呢?
接口解决了抽象类的痛点,因为java都是单继承,不能实现多继承,接口刚好可以弥补,实现了一个“伪多继承”,实际开发项目都是基于接口来设计的。
注意:接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
3.抽象类和接口的共同点和区别:
共同点 :
1.都不能被实例化。
2.都可以包含抽象方法。
3.都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)。
4.实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
区别 :
1.接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。
2.抽象类主要用于代码复用,强调的是所属关系。一个类只能继承一个类,但是可以实现多个接口。
3.接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
4.抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法。
5.抽象类可以有构造方法,而接口没有。
public interface UserService { String say(); default void Hello(){//默认方法 System.out.println("this is interface Hello()"); }; }
@Service public class UserServiceImpls implements UserService { //必须实现 @Override public String say() { return "null"; } //可选实现 @Override public void Hello() { System.out.println("this is implements Hello()"); } }
调用抽象类中非抽象方法:静态方法类名.方法(static)/ super.方法 (普通方法)
上表格:
参数 | 抽象类 | 接口 |
默认的方法实现 | 可以有默认的方法实现 |
Java 8 可以用 default 关键字在接口中定义默认方法
|
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有 | 接口不能有构造器 |
与正常Java类的区别 | 除了不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 |
接口方法默认修饰符是public,不可以使用其它修饰符 (接口中的变量会被指定为public static final,而方法会被指定为public abstract) |
main方法 | 抽象方法可以有main方法,可以运行它 | 接口没有main方法,不能运行它 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法 |
添加新方法 | 如果往抽象类中添加新的方法,可以给它提供默认的实现。因此不需要改变现在的代码。 | 如果往接口中添加方法,那么必须改变实现该接口的类。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY