接口,抽象类与接口的区别,内部类

1.我们使用interface关键字定义接口

2.我们使用implments关键字建立接口实现类与接口的实现关系

接口是父级,接口实现类是子级

3.接口实现类如果实现部分/不实现接口中的抽象方法,那么实现类是一个抽象类接口实现类,如果实现了接口所有的抽象方法,那么这个实现类是一个普通类

4.抽象类与接口都不可以实例化/创建对象

5.接口没有构造函数,实现类使用的super()是父类的无参构造

如果没有明确指定父类,super()代表的才是Object的无参构造

6.接口中都是静态常量,没有成员变量,因为会默认拼接public  static final

故此:静态常量与抽象方法默认拼接的部分,可以省略不写

8.接口不是类

9.接口是用来指定规则的【有哪些功能?方法有参数吗?有返回值吗?】

方法具体的实现交给接口的实现类去完成

总结:

1.类与类的关系

继承关系,只支持单继承。

2.类与接口的关系:

实现关系,可以单实现,也可以多实现

class A implements inter1{}

class A implements inter1,inter2....{}

3.接口与接口的关系:

继承关系,可以单继承,也可以多继承

注意:如果创建接口实现类的话,inter3Impl只需要实现接口3与接口1的抽象方法

inter4impl不仅需要

实现接口4,还需要实现接口4继承自接口1与接口2的所有功能

package cn.tedu.inter2;
 /*本类用于测试接口与类之间的复杂关系*/
public class TestRelation {
    public static void main(String[] args) {

    }
}
interface Inter1{
    void save();
    void delete();
}
interface Inter2{
    void update();
    void find();
}
//接口可以继承接口,而且还可以多继承,一个子接口继承多个父接口,多个接口之间使用逗号分隔。
interface Inter3 extends Inter1,Inter2{

}
//implements inter3  实现类与接口是实现的关系,并且实现类可以实现多个接口,接口之间用逗号隔开。
// 对于Java中的类而言,遵循:单继承,多实现的规则。
// 对于Java中的接口而言,遵循:既可以单继承,也可以多继承的规则
class inter3Iml  implements  Inter1, Inter2{

    @Override
    public void save() {
        System.out.println("稍等...正在努力保存中");
    }

    @Override
    public void delete() {
        System.out.println("小二正在马不停蹄的删除中");
    }

    @Override
    public void update() {
        System.out.println("客官,马上就更新好啦");
    }

    @Override
    public void find() {
        System.out.println("正在为您查询,请稍后...");
    }
}

 抽象类与接口的关系:

1.抽象类使用class关键字定义,是类

接口使用interface关键字定义,是接口

2.抽象类里可以定义成员变量

接口里没有成员变量,有的是静态变量,默认会拼接public static final

3.抽象类类里的方法不做限制:全普,全抽,半普半抽

接口中的方法都是抽象方法,默认会拼接:public abstract

4.抽象类与接口均不可以实例化/创建对象

5.抽象类里有构造方法,不是为了自己使用,而是为了子类创建对象时调用,接口里没有构造方法,接口实现类调用的构造是父类的构造的方法,与接口无关

6.接口可以多继承,也就是说,一个接口可以继承一个接口/多个接口

抽象类只能单继承,也就是说,一个子类只能有一个父类

7.抽象是后天重构的结构,接口是先天设计的结果。

内部类特点:

1) 内部类可以直接访问外部类中的成员,包括私有成员

2) 外部类要访问内部类的成员,必须要建立内部类的对象

3) 在成员位置的内部类是成员内部类

4) 在局部位置的内部类是局部内部类

package cn.tedu.cn.tedu.innerclass;
/* 本类用于内部类的入门案例*/
public class TestInner1 {
    public static void main(String[] args) {
         /* 创建内部类对象
         * 外部类名.内部类名 对象名=外部类对象.内部类对象
         */
        Outer.Inner oi=new Outer().new Inner();
        oi.delete();
        System.out.println(oi.sum);
        new Outer().find();
    }
}
class Outer{
    //创建外部类的成员变量
    String name;
    private int age;
    //创建外部类的成员方法
    public void find(){
        System.out.println("Outer...find()");
        /**
         * 测试外部类能否使用内部类的资源?不可以
         */
//        System.out.println(sum); 报错
//        delete();
        /**
         * 外部类如果想要使用内部类的资源,必须先创建内部类的对象
         * 然后通过内部类对象来调用内部类的资源
         */
        Inner in=new Inner();
        System.out.println(in.sum);
//        in.delete();
    }

    /**
     * 根据内部类所在的位置的不同,分为:成员内部类(类里方法外)与局部内部类
     */
    class Inner{
        int sum=10;
        public  void  delete(){
            System.out.println("Inner...delete()");
            /**
             * 测试内部类能否使用外部类资源
             * 内部类可以直接使用外部类的资源,包括私有资源
             */
            System.out.println(name);
            System.out.println(age);
            find();
        }
    }
}

Inner...delete()
null
0
Outer...find()
10
10
Outer...find()
10

猜你喜欢

转载自blog.csdn.net/weixin_43762083/article/details/120825219