java学习笔记49--接口

    1)接口和抽象类区别
        抽象类也是类,除了可以写抽象方法以及不能直接new对象之外,其他的和普通类没有什么不一样的。

        接口已经另一种类型了,和类是有本质的区别的,所有不能用类的标准去衡量接口。

        声明类的关键字是class,声明接口的关键字是interface。

        抽象类是用来被继承的,java中的类是单继承。
            类A继承了抽象类B,那么类A的对象就属于B类型了,可以使用多态
            一个父类的引用,可以指向这个父类的任意子类对象
            注:继承的关键字是extends

        接口是用来被类实现的,java中的接口可以被多实现。
            类A实现接口B、C、D、E..,那么类A的对象就属于B、C、D、E等类型了,可以使用多态
            一个接口的引用,可以指向这个接口的任意实现类对象
            注:实现的关键字是implements

    2)接口中的方法都是抽象方法
        接口中可以不写任何方法,但如果写方法了,该方法必须是抽象方法
        例如:
        public interface Action{
            public abstract void run();

            //默认就是public abstract修饰的
            void test();

            public void go();
        }
    3)接口中的变量都是静态常量(public static final修饰)
        接口中可以不写任何属性,但如果写属性了,该属性必须是public static final修饰的静态常量。
        注:可以直接使用接口名访问其属性。因为是public static修饰的
        例如:
        public interface Action{
            public static final String NAME = "tom";
            //默认就是public static final修饰的
            int AGE = 20;
        }
        main:
            System.out.println(Action.NAME);
            System.out.println(Action.AGE);
    4)一个类可以实现多个接口
        例如:
        public class Student implements A,B,C,D{
            //Student需要实现接口A B C D中所有的抽象方法
            //否则Student类就要声明为抽象类,因为有抽象方法没实现
        }
        main:
            A s1 = new Student();
            B s2 = new Student();
            C s3 = new Student();
            D s4 = new Student();

            注:
            s1只能调用接口A中声明的方法以及Object中的方法
            s2只能调用接口B中声明的方法以及Object中的方法
            s3只能调用接口C中声明的方法以及Object中的方法
            s4只能调用接口D中声明的方法以及Object中的方法

            注:必要时可以类型强制转换
            
            例如:
            接口A 中有test()
            接口B 中有run()

            A s1 = new Student();
            s1.test();

            B s2 = new Student();
            s2.run();
            
            if(s1 instanceof B){
                ((B)s1).run();
            }

    6)一个接口可以继承多个父接口
        public interface A{
            public void testA();
        }

        public interface B{
            public void testB();
        }
        
        //接口C把接口A B中的方法都继承过来了
        public interface C extends A,B{
            public void testC();
        }
        
        //Student相当于实现了A B C三个接口,需要实现所有的抽象方法
        //Student的对象也就同时属于A类型 B类型 C类型
        public class Student implements C{
            public viod testA(){}
            public viod testB(){}
            public viod testC(){}
        }

        main:
        C o = new Student();
        System.out.println(o instanceof A);//true
        System.out.println(o instanceof B);//true
        System.out.println(o instanceof C);//true
        System.out.println(o instanceof Student);//true
        System.out.println(o instanceof Object);//true
        System.out.println(o instanceof Teacher);//false

        //编译报错
        System.out.println(o instanceof String);
        
        注:
        System.out.println(o instanceof X);
        如果o是一个接口类型声明的变量,那么只要X不是一个final修饰的类,该代码就能通过编译,至于其结果是不是true,就要看变量o指向的对象的实际类型,是不是X的子类或者实现类了。

        注:一个引用所指向的对象,是有可能实现任何一个接口的。(java中的多实现)

猜你喜欢

转载自blog.csdn.net/onepiece_loves/article/details/88632885