作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
目录
1. 抽象类
1.1 认识抽象类
1.2 抽象类的特性总结
1.3 抽象类的一个重要作用
2. 接口
2.1 如何理解接口?
2.2 接口的使用
2.3 接口特性
2.4 实现多个接口
2.5 接口间的继承
3. 抽象类与接口
概念:一个类没有足够的信息去描述一个具体的对象时,这个类就是一个抽象类
语法:一个被abstract修饰的类称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
格式:
示例:
abstract class Shape{
abstract public void draw();
abstract void calcArea();
public double getArea(){
return area;
}
protected double area;
}
抽象方法没有方法体
抽象类也可以增加普通方法与属性、构造方法
1.抽象类不能实例化
2.抽象方法不能是 private 修饰
3.抽象方法需要被子类继承,因此不能被final和static修饰
报错:
Illegal combination of modifiers: 'abstract' and 'final'
Illegal combination of modifiers: 'final' and 'abstract'
4.抽象类必须被继承,且子类必须重写父类的抽象方法,否则子类也是抽象类
abstract class Shape{
abstract public void draw();
abstract void calcArea();
public double getArea(){
return area;
}
protected double area;
}
class Circle extends Shape{
private double r;
final private static double PI = 3.14;
public Circle(double r) {
this.r = r;
}
@Override
public void draw() {
System.out.println("圆形:r"+r);
}
@Override
void calcArea() {
area = PI*r*r;
}
@Override
public double getArea() {
return super.getArea();
}
}
5.抽象类中不一定包含抽象方法,有抽象方法的类一定是抽象类
6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
在继承一个类后,如果是继承普通类,没有重写方法不会报错,如果继承抽象类,没有重写父类方法是会报错的,利用编译器的校验, 在实际开发中是非常有意义
接口就是公共的行为规范标准,实现时,只要符合规范标准,就可以通用
电子产品的USB、电源插座等
Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
语法:
接口的定义与类基本相同,关键字:interface
1. 创建接口时, 接口的命名一般以大写字母I开头
2. 接口的命名一般使用 "形容词" 词性的单词
public interface Inter {
//抽像方法
void method();
}
接口是不能直接使用的,要定义具体类来实现接口中的所有抽象方法
关键字:implements
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系
格式:
public class 类名称 implements 接口名称 {
//...
}
1.接口类型不能直接实例化,就是new对象
2. 接口中的方法会被隐式的指定为public abstract,其他修饰符会报错
3.接口中的方法由实现接口的类来实现
4.重写接口中方法时,不能使用default访问权限修饰
报错: 'A'中的'openDevice()'与'USB'中的'openDevice()'冲突;试图分配较弱的访问权限('package-private');“公共”
5.接口中的变量会被隐式的指定为public static final变量
6. 接口不能有静态代码块和构造方法
7. 接口编译完成后字节码文件的后缀格式是.class
8. 类必须实现接口中的所有的抽象方法,否则类必须设置为抽象类
报错:类“A”必须被声明为抽象,或者在“USB”中实现抽象方法“USB()”
继承是单继承的,但是一个类可以实现多个接口
看一个例子:
public class Test {
public static void main(String[] args) {
dragon drag = new dragon("dragon");
drag.fly();
drag.swim();
}
}
//定义一个动物类
class Animal{
protected String name;
public Animal(String name){
this.name = name;
}
}
//定义接口
interface IFlying{
void fly();
}
interface ISwimming{
void swim();
}
//定义鸟类
class Bird extends Animal implements IFlying{
public Bird(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(name+"正在用翅膀飞");
}
}
//定义鱼类
class Fish extends Animal implements ISwimming {
public Fish(String name) {
super(name);
}
@Override
public void swim() {
System.out.println(name+"正在用尾巴游");
}
}
//定义龙类
class dragon extends Animal implements ISwimming,IFlying{
public dragon(String name) {
super(name);
}
@Override
public void fly() {
System.out.println(name+"正在腾云驾雾");
}
@Override
public void swim() {
System.out.println(name+"正在海里游");
}
}
注意:一个类实现多个接口,必须要实现所有的抽象方法,否则要设置为抽象类
类和类是单继承的,接口之间可以多继承
关键字:extends
interface IAmphibious extends IFlying,ISwimming{
@Override
void fly();
@Override
void swim();
}
class dragon1 extends Animal implements IAmphibious{
public dragon1(String name) {
super(name);
}
@Override
public void fly() {
//...
}
@Override
public void swim() {
//...
}
}
注意:接口间的继承相当于多个接口合并
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
抽象类的存在是为了让编译器更好的校验❌
语法上的区别:
1.抽象类的成员变量是无限制的,接口中的成员变量只能是public static final类型的
2.抽象类可以提供成员方法的实现细节,接口中只能存在public abstract 方法
3.抽象类可以有静态代码块和静态方法,接口中不能含有静态代码块以及静态方法
4.一个类只能继承一个抽象类,一个类却可以实现多个接口
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!