zoukankan      html  css  js  c++  java
  • java成神之——接口,泛型,类

    接口

    接口定义

    java中的接口也是单独使用一个文件定义,接口的定义相当简单,权限固定为public,变量只能定义为常量,方法只能抽象
            
    接口成员只能是如下几种情况
        public interface MyInterface {
            public abstract void fn(); // 只能使用public修饰符
            abstract void fn1(); // 效果和上面写法一致
            public static final int a = 1; // 表示静态常量
            String b = "bb"; // 效果和上面写法一致
        }
    

    默认方法

    interface MyInterface {
        default void fn() {
            System.out.println( "default implementation" );
        }
    }
    public class Test implements MyInterface {
    
        @Override
        public void fn() {
            System.out.println( "overridden implementation" );
        }
    
        public static void main(String[] args) throws Exception{
            MyInterface.super.fn();
            fn();
        }
    }
    

    函数式接口

    @FunctionalInterface
    public interface MyInterface<T> {
    	T test(T t);
    }
    
    MyInterface<String> test = (t) -> t;
    test.test("啦啦啦");
    

    泛型

    泛型类

    class Test<T> {
        private T value;
        public T getValue() {
            return value;
        }
        public void setValue(T value) {
            this.value = value;
        }
    }
    Test<Integer> test = new Test<Integer>();
    

    泛型类继承

    第一种
    
    class Inheritor extends Test<String> {
    }
    
    Inheritor inherit = new Inheritor();
    inherit.setValue("只能是字符串");
    
    第二种
    
    class Inheritor<T> extends Test<T> {
    }
    
    Inheritor<Integer> inherit = new Inheritor<>();
    inherit.setValue(1);
    
    第三种
    
    class Inheritor extends Test {
    }
    
    Inheritor inherit = new Inheritor();
    inherit.setValue("这里可以传递任何类型的值");
    
    第四种
    
    class Inheritor<T, E> extends Test<E> {
    }
    
    Inheritor<String, Integer> inherit = new Inheritor<>();
    inherit.setValue(1);
    
    第五种
    
    抽象类
    abstract class Test<T> {
        private T value;
        public T getValue() {
            return value;
        }
        public void setValue(T value) {
            this.value = value;
        }
    }
    
    Test<String> test = new Test<String>(){};
    test.setValue("字符串");
    

    类型限定

    ? extends T         表示?必须继承自T
    ? super T           表示?必须是T的父级
    
    class Test<T extends Object>{}
    class Test<T extends Object & Iterable<T>>{}
    

    泛型方法

    public <T> List<T> Fn(T t1, T t2) {
        List<T> result = new ArrayList<T>();
        result.add(t1);
        result.add(t2);
        return result;
    }
    
    List<String> list = Fn("a", "b"); // 无需手动指定泛型类型,程序会自动推断类型
    
    如果需要你可以强制指定自己需要的类型
    List<Object> list = this.<Object>Fn(1, "a");
    

    泛型接口

    interface MyInterface<T> {
        public void Fn(T t);
    }
    

    构造函数

    单个构造函数
        public class demo2 {
            public int a;
            public demo2 (int i) {
                this.a = i;
            }
        }
            
    多个构造函数
        public class demo2 {
            public int a;
            public demo2() {
                this(111); // 只能写在第一行
            }
            public demo2 (int i) {
                this.a = i;
            }
        }
    

    类的继承

        public class Test2 {
            public String str = "aaa";
        }
    
        public class Test1 extends Test2 {
            public void fn() {
                System.out.println(str);
            }
        }
    
        java中子类重写父类的方法,直接写方法就可以了,
        子类中的重写的方法的权限必须大于或者等于父类方法的权限
    
        子类继承父类,需要父类有无参数的构造函数
        
        默认情况下,类不写构造函数会自动编译一个无参数构造函数,除非人为指定构造函数,如下
                
        public class demo2 {
            public demo2(int i) {
            }
        }
                
        public class demo1 extends demo2 {
            public int a;
            public demo1() {
                // super(); 默认情况下不写super,系统会自动编译成 super(),所以父类不包含无参数构造函数就会报错
                super(111); // super只能写在第一行
            }
        }
    

    抽象类

        抽象类,就是一个风马牛不相及的东西的共性提取,不能实例化
        abstract public class Test3 {
            public String str = "aaa";
            public abstract void fn(); // 抽象方法只能定义,具体实现必须在子类中完成
        }
        抽象方法不能和 private,final,static 一起使用
    

    instanceof运算符

        用来判断一个对象是否是一个类的实例
        demo2 test = new demo2();
    	boolean b = test instanceof demo2;
    

    内部类

        public class demo {
            int i = 1;
            public class demo1 {
                int i = 2;
                public void fn() {
                    int i = 3;
                    System.out.println(i); // 3
                    System.out.println(this.i); // 2
                    System.out.println(demo.this.i); // 1
                }
            }
        }
        使用此内部类
        demo.demo1 test1 = new demo().new demo1();
        test1.fn();
    

    equals

        引用类型比较的地址是否相同,值类型比较值是否相同
            demo test1 = new demo();
            demo test2 = new demo();
            boolean b = test1.equals(test2);
        可以重写equals方法,实现自定义比较
            public boolean equals (Object obj) {
                demo d = (demo)obj;
                return this.a = d.a;
            }
    

    结语

    本文章是java成神的系列文章之一
    
    如果你想知道,但是本文没有的,请下方留言
    
    我会第一时间总结出来并发布填充到本文
    
  • 相关阅读:
    ASP.NET(4):多语言的解决方案
    无题
    SIP 计时器的总结(转)
    一个Sip协议栈的实现方案
    通过拦截WCF消息进行身份栈传播
    从WPF控件拖放到Winform控件的注意事项
    一个用C#操作OpenLDAP的例子
    通过定制行为拦截WCF消息
    一个基于Prism的方案的介绍
    MVVM模式下附加属性的使用
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/9745927.html
Copyright © 2011-2022 走看看