美文网首页
抽象类和接口

抽象类和接口

作者: 零00_ | 来源:发表于2020-11-17 17:35 被阅读0次

    抽象类和接口的区别:

    抽象类:
    1.抽象类是一个类
    2.定义抽象类时,使用abstract关键字修饰,继承抽象类时,使用extends
    3.只能继承一个抽象类
    4.抽象类中可以有抽象方法,也可以没有抽象方法,抽象类中可以有具体的方法

    接口:
    1.接口不是一个类
    2.定义接口时使用interface,实现接口时使用implements
    3.可以实现多个接口
    4.jdk1.8之前接口中的方法都是抽象方法,jdk1.8之后接口中可以有非抽象方法、静态方法

    抽象类和接口的相同点:

    1.都不可以实例化,即不能使用new关键字来实例化对象
    2.子类/实现类需要实现抽象类父类/要实现的接口中的所有抽象方法,如果没有实现它们中的全部抽象方法,子类/实现类需要定义成抽象类
    3.可以引用抽象类/接口,指向子类/实现类---》形成多态

    抽象方法:只有方法体,没有具体实现。eg:

    public abstract void a();
    

    jdk1.8之前和jdk1.8之后,接口区别:

    jdk1.8之前接口中有:1.常量 2.抽象方法
    jdk1.8之后接口中有:1.常量 2.抽象方法 3.非抽象方法 4.静态方法

    常量:public static final
    抽象方法:public abstract
    非抽象方法:public default
    静态方法:public static

    注意:接口中的静态方法不能被继承。实现类实现接口时,重写接口中的的非抽象方法不可以带关键字default

    抽象类:

    abstract public class Person {
        int age;
        String name;
    
        public void eat(){
            System.out.println("能吃是福");
        }
    
        public abstract void sleep();
    }
    

    jdk1.8之前接口:

    public interface TestInterface01 {
        //常量
        public static final int NUM = 10;
        //抽象方法:
        public abstract void a();
        public abstract void b(int num);
        public abstract int c(String name);
    }
    
    interface TestInterface02{
        public abstract void e();
        public abstract void f();
    }
    

    继承父类、实现接口:

    class Student extends Person implements TestInterface01, TestInterface02{
        @Override
        public void a() {
            System.out.println("------aaa");
        }
    
        @Override
        public void b(int num) {
            System.out.println("------bbb");
        }
    
        @Override
        public int c(String name) {
            return 110;
        }
    
        @Override
        public void e() {
            System.out.println("--------eee");
        }
    
        @Override
        public void f() {
            System.out.println("-------fff");
        }
    
        @Override
        public void sleep() {
            System.out.println("我喜欢睡硬板床");
        }
    }
    
    class Test{
        //这是一个main方法,程序的入口
        public static void main(String[] args) {
            //10.接口不能创建对象:
            //TestInterface02 t = new TestInterface02();
            //抽象类不能创建对象
            //Person p = new Person();
            Person p = new Student();   //  父类指向子类---》多态
            TestInterface02 t = new Student();  //接口指向实现类---》多态
    
            //11.接口中常量如何访问:
            System.out.println(TestInterface01.NUM);
            System.out.println(Student.NUM);
            Student s = new Student();
            System.out.println(s.NUM);
            TestInterface01 t2 = new Student();
            System.out.println(t2.NUM);
        }
    }
    

    jdk1.8之后接口:

    package com.test12;
    
    /**
     * jdk1.8之后,除了常量,抽象方法,还新增了非抽象方法、静态方法
     * 常量:public static final
     * 抽象方法:public abstract
     * 非抽象方法:public default
     * 静态方法:public static
     */
    public interface TestInterface {
        //常量
        public static final int NUM = 10;
    
        //抽象方法
        public abstract void a();
    
        //非抽象方法
        public default void b(){
            System.out.println("-----TestInterface---b()---");
        }
    
        //静态方法
        public static void c(){
            System.out.println("这是TestInterface的静态方法c()");
        }
    }
    
    package com.test12;
    
    public class Demo implements TestInterface{
        @Override
        public void a() {
            System.out.println("Demo重写接口TestInterface的a()方法");
            b();
            //调用接口中的方法
            TestInterface.super.b();
        }
    
        @Override
        public void b() {
            System.out.println("Demo重写接口TestInterface中的b()方法");
        }
    
        public static void c(){
            System.out.println("Demo中的静态方法c()");
        }
    }
    
    class TestDemo{
        //这是一个main方法,程序的入口
        public static void main(String[] args) {
            Demo d = new Demo();
            d.a();
            Demo.c();
            TestInterface.c();
        }
    }
    

    打印结果:

    Demo重写接口TestInterface的a()方法
    Demo重写接口TestInterface中的b()方法
    -----TestInterface---b()---
    Demo中的静态方法c()
    这是TestInterface的静态方法c()
    

    相关文章

      网友评论

          本文标题:抽象类和接口

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