美文网首页
Java 抽象类和接口

Java 抽象类和接口

作者: 小石头呢 | 来源:发表于2019-08-12 19:29 被阅读0次

在Java语言中,abstract classinterface是支持抽象类定义的两种机制

抽象类

1.概念

  • 我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

  • 我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式,这个抽象描述就是抽象类。

  • 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。

2.抽象方法

  • 如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。抽象方法只包含一个方法名,而没有方法体。

  • 声明抽象方法会造成以下两个结果:1.如果一个类包含抽象方法,那么该类必须是抽象类。2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

3.总结

  • 抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

  • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  • 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  • 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

  • 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

4.代码例子

//定义一个抽象类 管理学习Android
//抽象类-模板
//抽象类里面定义使用这个功能就必须实现的方法或者属性
abstract class BaseAndroidStudy{
    //准备工作
    {
        System.out.println("锻炼身体");
    }

    //定义一个静态的常量
    public final String cBook = "C Primier";

    //定义一个属性,用于保存数据
    public String javaBook;

    //定义一个变量保存内部类
    public Dream dream;

    //为了安全,通常定义一个无参的构造方法
    public BaseAndroidStudy(){

    }

    public BaseAndroidStudy(String javaBook,String dream){
        this.javaBook = javaBook;

        this.dream = new Dream();
        this.dream.name = dream;
    }

    //定义一个抽象方法 不需要实现 子类来实现
    public abstract void studyC();

    //定义了一个普通方法,已经确定了方法的具体实现
    public void studyJava(){
        System.out.println("参加培训班");
    }

    //定义一个内部类,用于管理每个人的梦想
    private class Dream{
        public String name;
        public void show(){
            System.out.println("梦想是:"+name);
        }
    }
}

//使用extends来继承一个抽象类
//如果继承一个抽象类,就必须实现抽象类里面的抽象方法
//如果不实现抽象方法,也可以把这个类定义为抽象类
class Student extends BaseAndroidStudy{

    public String name;

    @Override
    public void studyC() {
        System.out.println("看书 看视频");
    }

    public Student(String name,String bookName,String dream){
        super(bookName,dream);
        this.name = name;
    }
}
package swu.xl.day6;

public class MyClass {
    public static void main(String[] args){

        //1.显示的创建一个类来继承于抽象类 创建这个类的对象
        Student xw = new Student("小王","java编程思想","拿offer");

        //2.匿名类 只使用一次
        BaseAndroidStudy zs = new BaseAndroidStudy("java编程思想","拿offer") {
            @Override
            public void studyC() {
                System.out.println("培训");
            }
        };
    }
}

接口

1.概念

  • 在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

  • 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

2.特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),不需要写访问控制符。

  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误),不需要写访问控制符。

  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

  • 接口里面不能定义构造方法,不可以添加普通/对象/实例方法,但是可以在接口里面可以定义内部类。

  • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。(JDK 1.8 以后,接口里可以有静态方法和方法体了。)

interface testInterface{
    //public static final int COUNT = 100;
    int COUNT = 10;

    //public void test2();
    //public abstract void test3();
    void test1();

    /*public static class inner{
        int count;
        public void show(){
            System.out.println("你好啊");
        }
    }*/
    class inner{
        int count;
        public void show() {
            System.out.println("你好啊");
        }
    }
}

3.接口的实现

类使用implements关键字实现接口,可以用implements实现多个接口,接口与接口之间用,隔开。

class XLClass implements testInterface{

    @Override
    public void test1() {
        inner in = new inner();
        in.show();
    }
}

4.接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。不同的是可以继承多个接口。

public interface Interface extends Interface1, Interface2{
     //自己的抽象方法
}

5.标记接口

  • 标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

  • 两个目的:1.建立一个公共的父接口;2.向一个类添加数据类型

6.接口中方法的实现

  • 利用Default
  • 系统内部的例子
public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> var1) {
        Objects.requireNonNull(var1);
        Iterator var2 = this.iterator();

        while(var2.hasNext()) {
            Object var3 = var2.next();
            var1.accept(var3);
        }

    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(this.iterator(), 0);
    }
}

相关文章

  • Java基础-抽象类和接口

    抽象类和接口也是 Java 面试中常考的,下面就来总结一下抽象类和接口的相关知识。 抽象类是类,Java 中类是单...

  • java抽象类和接口小记

    Java抽象类和接口小记 Java抽象类和接口实现了java的多态.多态是面向对象程序语言的核心,在项目开发过程中...

  • java abstract

    参考java抽象类和抽象方法Android开发:抽象类(abstract class)和接口(Interface)...

  • 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类

  • Java 接口知识点

    接口的特性 函数式接口 抽象类和接口区别 Lambda表达式 java常用接口

  • java抽象类和接口

    参考:java抽象类和接口--树上月 总结:1.抽象类在java语言中体现的是继承关系,即"is-a"关系,而接口...

  • Java抽象类和接口类

    Java中接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程...

  • 接口类&抽象类

    java的接口类和抽象类的特点 java中抽象类的特点: 抽象类和抽象方法必须用关键字abstract修饰 2.如...

  • Java8以后,抽象类和接口该怎么选?

    本文将对jdk1.8以后的接口和抽象类进行讨论,假定读者已经了解java中接口(interface)和抽象类(ab...

  • 接口和抽象类有什么区别

    学习Java基础知识,打通面试关~十三接口与抽象类面试常客:谈谈你对抽象类和接口的理解 接口用interface修...

网友评论

      本文标题:Java 抽象类和接口

      本文链接:https://www.haomeiwen.com/subject/scdjjctx.html