zoukankan      html  css  js  c++  java
  • java基础篇 之 接口

    组合接口时的名字冲突:

    看下面这段代码:

    interface I1 {
        int f();
    }
    
    interface I2 {
        void f();
    }
    
    interface I3 {
        int f(int a);
    }
    
    class C {
        public void f() {
            System.out.println(1);
        }
    }
    
    class C1 extends C implements I2 {
    
    }
    class C2 extends C implements I3 {
        @Override
        public int f(int a) {
            return 1;
        }
    }
    //这里报错了,是因为覆盖,实现跟重载被混在了一起
    //C3继承了C,这个时候就有了一个void f()的方法
    //C3实现了I1,就不得不实现它的int f()
    //这个时候,C3就会出现两个同名函数,这显然是错误的
    //class C3 extends C implements I1 {
    //
    //}
    
    接口中的域:

    因为放入接口中的任何域都是自动static和final的,所以接口就成了一种很便捷的用来创建常量的工具。

    public class Interface {
        // 成员变量省略了 public static  final
        // 接口不能初始化,如果要访问接口中的属性,只能通过类名直接调用,所以必须public+static
        // 接口中的字段会被所有接口的实现类共享,所以不能被某一个子类所改变,以避免对其他子类造成影响
        // 所以必须final
        String ONE = "1";
        String TWO = "2";
    }
    
    嵌套接口:
    class Test {
        private interface B {
            void f();
        }
    
        class BImpl implements B {
            @Override
            public void f() {
                System.out.println(1);
            }
        }
    
        public B getB() {
            return new BImpl();
        }
    }
    
    public class Interface {
        public static void main(String[] args) {
            Test t = new Test();
            t.getB();
        }
    }
    

    我们看这种情况,提出一个问题,t.getB();的返回值我们要怎么接收呢?返回的是一个类中的私有的接口类型的对象。我们直接t.B肯定是不行的。这个时候,我们只能将返回值交给有权使用它的对象,所以我们要多定义一个属性或者方法

    class Test {
        private interface B {
            void f();
        }
    
        class BImpl implements B {
            @Override
            public void f() {
                System.out.println(1);
            }
        }
    
        public B bRef;
    
        public B getB() {
            return new BImpl();
        }
    }
    
    public class Interface {
        public static void main(String[] args) {
            Test t = new Test();
            t.bRef = t.getB();
        }
    }
    
  • 相关阅读:
    为什么C/C++语言使用指针
    VS2010调试入门指南
    vs2010的11个调试技巧和方法
    排序算法一:快速排序
    Ubuntu下codeblocks汉化
    Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
    QQ通信原理及QQ是怎么穿透内网进行通信的?
    jackson中自定义处理序列化和反序列化
    Json解析工具Jackson(使用注解)
    jackSon注解– @JsonInclude 注解不返回null值字段
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854447.html
Copyright © 2011-2022 走看看