Java 抽象类与接口

接口和内部类未我们提供了一种将接口与实现分离的更加结构化的方法

抽象类

描述

面向对象的领域一切都是对象,通过具体的类来描述,但不是所有类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这个类我们称其为抽象类。

抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。

注意事项
  • 抽象类不能实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
  • 抽象方法必须由子类进行重写。
  • 只要包含一个抽象方法的抽象类,该类必须定义成抽象类。
  • 抽象类中可以包含具体方法。
  • 子类中的抽象方法不能与父类的抽象方法同名。
  • abstract不能与final(修饰类时表示不能被继承)同时修饰一个类。
  • abstract不能与private、static、final或native并列修饰同一个方法。
public abstract class Animal {
    public abstract void shout();
}

public class Cat extends Animal {
    @Override
    public void shout() {
        System.out.println("cat : miaomiaomiao");
    }
}

public class Dog extends Animal {
    @Override
    public void shout() {
        System.out.println("dog : wangwangwang");
    }
}

public class Test {

    public static void main(String [] args){
        Animal a = new Cat();
        Cat cat = new Cat();
        Dog dog = new Dog();

        a.shout();
        cat.shout();
        dog.shout();

    }

}
输出结果:
cat : miaomiaomiao
cat : miaomiaomiao
dog : wangwangwang

接口

描述

接口可以描述为抽象类的抽象。接口本身并不是类。通过使用implements关键字实现某个接口,接口实现了多继承的功能。

注意事项
  • 接口中的方法的访问权限被自动声明为public。确切的说只能为public,当然你可以显示的声明为protected、private(编译不通过)
  • 接口中的成员变量会自动变为public static final。
  • 接口中不存在实现的方法。
  • 实现接口的非抽象类必须实现接口中的所有方法。
  • 不能使用new操作符实例化一个接口,可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用instanceof检查一个对象是否实现了某个特定的接口。
  • 在实现多接口的时候一定要注意方法名重复。
public interface Animal {

    int a = 10;
    public static final int b = 10;

    public void eat();

    void shout();

    public void test(Animal a);
}

public class Cat implements Animal {

    @Override
    public void eat() {
        System.out.println("cat : i like bone");
    }

    @Override
    public void shout() {
        System.out.println("cat : wangwangwang");
    }

    public void test(Animal a){
        String str = "";
        if(a instanceof Cat) {
            str = "cat";
        }
        System.out.println(str);
    }
}

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("dog : i like fish");
    }

    @Override
    public void shout() {
        System.out.println("dog : wangwangwang");
    }

    public void test(Animal a){
        String str = "";
        if(a instanceof Dog) {
            str = "dog";
        }
        System.out.println(str);
    }
}

public class Test {

    public static void main(String [] args){
        Animal a = new Cat();
        Cat cat = new Cat();
        Dog dog = new Dog();

        a.shout();
        cat.shout();
        dog.shout();

        a.eat();
        cat.eat();
        dog.eat();

        cat.test(a);
        cat.test(cat);
        cat.test(dog);

        dog.test(a);
        dog.test(cat);
        dog.test(dog);

    }

}
输出结果
cat : wangwangwang
cat : wangwangwang
dog : wangwangwang
cat : i like bone
cat : i like bone
dog : i like fish
cat
cat



dog

抽象类与接口的区别

  • 抽象层次不同:抽象类是对类抽象,而接口是对行为的抽象。
  • 跨域不同:抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间存在一种“is-a”关系。接口则不同,它跟实现类之间是"like-a"关系。
  • 设计层次不同:抽象类时自底向上抽象而来的,接口是自顶向下设计出来的。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他...
    洋芋掉到碗里去了阅读 2,701评论 0 0
  • 对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。接口...
    Q南南南Q阅读 2,895评论 0 3
  • 原来我只知道一个类可以实现多个接口,但只可以继承一个抽象类,但并不能清楚地认识到它们的区别及使用的场景。 在查阅不...
    n油炸小朋友阅读 1,445评论 1 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,467评论 18 399
  • 逛街时,看到今年流行的吊带碎花长裙,在我眼里,真心得不好看。怎么会流行起来?大街上,看到有些姑娘在穿,除了瘦长大高...
    JC贾阅读 2,523评论 2 0

友情链接更多精彩内容