赞
踩
接口中不可以创建对象
在Java中,抽象类可以包含非抽象方法。抽象类是一个没有具体实现其所有抽象方法的类,但是这并不意味着它不能包含非抽象方法。非抽象方法提供具体的实现,可以由子类继承或重写。
提示:这里可以添加本文要记录的大概内容:
Java接口是一种特殊的抽象类
接口是一种能力的描述
Java中的接口是一种抽象的类型,用于定义一组方法。接口只有方法的定义,没有方法的实现。
类可以实现一个或多个接口,实现接口的类必须实现接口中定义的所有方法。
提示:接口的定义使用关键字interface
下面详细讲解Java接口的特点和使用方法:
手机能接打电话
接口中只能定义静态常量属性和抽象的方法
抽象方法是具体描述这种能力的
可以使用interface
关键字定义接口,如下所示:
public interface Callable {
public abstract void call();
void answer();
}
在上面的代码中,Callable
接口定义了一个名为call
的抽象方法(没有方法体)。
再定义一个接口Audio
public interface Audio {
//播放声音
void playSound();
}
接口必须要有对应的实现类
必须实现这些接口中定义的抽象方法
实现之后具备了这种能力
可以使用implements
关键字来实现某些接口,如下所示:
public class Iphone12Pro implements Callable,Audio{ //添加未实现的方法 @Override public void call() { System.out.println("Iphone12Pro可以拨打电话"); } @Override public void answer() { System.out.println("Iphone12Pro可以接听电话"); } @Override public void playSound() { System.out.println("Iphone12Pro可以播放声音"); } }
在上面的代码中,Iphone12Pro
类实现了MyInterface
接口,并实现了Callable,Audio
方法。
注意,实现接口的类必须实现接口中定义的所有抽象方法。
如果某个类没有实现接口中的所有方法,那么该类必须声明为抽象类。
public static void main(String[] args) {
Iphone12Pro iphone12Pro = new Iphone12Pro();
iphone12Pro.call();
iphone12Pro.answer();
iphone12Pro.playSound();
}
如果某个类即需要继承又需要实现,要先继承再实现
接口可以多继承,类只能单继承
public class Iphone12Pro extends Thread implements Callable,Audio{
}
抽象类 不能创建对象
抽象类 需要子类继承才有意义
抽象类中能定义抽象方法也可以定义非抽象方法
抽象类实际应用中当做模板来使用
抽象类中要包含非抽象的方法,可以让子类继承后直接使用
抽象类要包含抽象方法,让子类继承后去重写
抽象方法,里面不写具体逻辑,只是abstract修饰方法 calclate()
一个类里如果有抽象方法就是一个抽象类,也用abstract修饰
【例】矩形面积计算
public abstract class Shape { //图形类的实现 private String color; public Shape() { super(); // TODO 自动生成的构造函数存根 } public Shape(String color) { super(); this.color = color; } public void showColor() { System.out.println("颜色是"+color); } //抽象方法 //定义时在返回值类型前使用abstract关键字 //没有方法体 public abstract double getArea() ; }
再写一个Shape的子类
非抽象的子类继承抽象类后,必须重写抽象类中定义的所有抽象方法
public class Rectangle extends Shape{ //他是矩形类,Shape的子类 private double length; private double width; @Override public double getArea() { return length*width; //添加未实现的方法 } public Rectangle() { super(); // TODO 自动生成的构造函数存根 } public Rectangle(String color, double length, double width) { super(color); this.length = length; this.width = width; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } }
再来个子类圆形
public class Circle extends Shape{ private double radius;//半径 public Circle(String color, double radius) { super(color); this.radius = radius; } public Circle() { super(); // TODO 自动生成的构造函数存根 } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } @Override public double getArea() { return 3.14*radius*radius; } }
需要注意的是上面的无参方法是自动生成的:
有参的调用有参的
测试类实现
public class 抽象类测试 {
public static void main(String[] args) {
//Shape x = new Shape();
Rectangle rectangle = new Rectangle("蓝",15,6);
rectangle.showColor(); //继承的图形的这个父类
System.out.println(rectangle.getArea()); //getArea()方法是继承后重写的
Circle circle = new Circle("黑",6);
circle.showColor();
System.out.println(circle.getArea());
}
}
接口是抽象方法和全局常量的集合
抽象类是包含一个抽象方法的类
接口由常量和抽象方法组成
抽象类由构造方法、普通方法、抽象方法、常量、变量组成
接口:interface
抽象类:abstract class
子类实现接口(implements
)
子类继承抽象类(extends
)
接口不允许继承抽象类,但允许继承多个接口
抽象类可以实现多个接口
接口:工厂设计模式、代理设计模式
抽象类:模板设计
接口作为一个标准、表示一种能力
抽象类作为一个模板
接口没有此局限性
抽象类有单继承的局限性
接口默认的访问修饰符是public
抽象方法的访问修饰符可以是public、protected、default
接口稍微慢,因为它要寻找在类中实现的方法
抽象类比接口速度快
不是同一个类型的东西
抽象类除了不能实例化对象外,和普通Java类没有区别
接口没有main方法。因此不能运行(jdk8以后接口可以有default和static方法,所以可以运行main方法)
抽象类中可以有main方法,并且可以运行。
接口没有构造方法
抽象类可以有构造方法,用于子类实例化使用
都要通过对象的多态性来实例化对象
如果抽象类和接口都可以使用的话,优先使用接口,因为可以避免单继承的局限性
一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。