接口与内部类

—---接口

 

一、概念

 

1. 接口:是一种标准,接口的实现者和使用者都必须遵循的约定。

2. 接口语法:【jdk7.0】

- (1)接口关键字: interface 

 interface 接口名{} 

- (2)接口不能创建对象,但是可以声明引用

 接口名 引用名; 

- (3)接口中所有的属性都默认为公开、静态、常量(被  public static final  修饰)

- (4)接口中所有的方法都默认为公开、抽象方法(被  public abstract  修饰)

- (5)接口中没有构造方法

 

二、实现类

 

1. 实现的语法

 class 类名 implements 接口名{} 

2. 实现类的要求

如果实现类不想成为抽象类,则需要覆盖接口中所有的抽象方法,而且覆盖接口中方法时,访问权限必须是 public (接口中所有的方法默认权限为  public )

3. 应用

- (1) 接口名 引用名 = new 实现类类名(); 

父类型 子类型

- (2)利用接口类型的引用(父类型),存储了实现类类型的对象(子类型),体现多态的应用

 

三、接口之间的继承性

 

1. 接口与接口之间为多继承关系

- (1)一个接口可以同时继承多个接口,接口与接口之间为多继承的关系

- (2)语法:

 interface 接口名 extends 父接口1,父接口2{} 

- (3)如果一个类实现接口,需要实现所有方法,包括父接口的

2. 类和接口之间为多实现的关系

- (1)一个类同时可以实现多个接口,即:类和接口之间为多实现的关系

- (2)语法:

 class 类名 implements 接口1,接口2{} 

- (3)如果类实现多个接口时,需要把实现所有接口中所有的抽象方法全部覆盖(否则实现类为抽象类)

3. 一个类实现多个接口的同时,继承一个父类

- (1)语法:

 class 类名 extends 父类 implements 接口,接口2{} 

- (2)注意: 必须是 继承在前,实现在后(先继承后实现)

 

四、接口的影响

 

由于接口与接口之间为多继承,类与接口之间为多实现的关系,所以利用父类型(父类 + 父接口)存储子类型的对象体现多态,而且让多态更加的灵活和多元化

 

注意: 以哪一个接口类型的引用调用方法,只能调用该接口中定义的方法

 

五、接口的新特性[jdk8.0+]

 

1. jdk8.0中的特性:

- (1)默认方法:

a.  default 返回值类型 方法名(形参列表){} 

b. 接口中  default  代表 此方法可以带有方法实现部分

c. 默认方法的访问权限 为  public 

- (2)静态方法:

a.  static 返回值类型 方法名(形参列表){} 

b. 接口中  static  代表方法可以带有实现部分

c. 静态方法的默认访问权限 为  public 

d. 使用:  接口名.静态方法名(实参); 

2. jdk9.0中的特性:

- (1)私有方法: 可以带有方法的实现部分

- (2)语法:

 private 返回值类型 方法名(形参列表){} 

- (3)通常用于定义接口中内部组件(降低代码冗余 )

 

六、接口的分类

 

1. 普通接口: 接口中有多个抽象方法,或许还有属性

开发中最常见

2. 常量接口: 接口中没有抽象方法,只有属性【了解】

interface IA{

    int m = 8;

}

 

3. 标记接口: 也称为 空接口,接口中没有定义任何属性和抽象方法【开发会用】

interface IC{} 

 

 

例如: 对象序列化

4. 函数式接口: 接口中有且仅有一个抽象方法【重点】

interface IB{

    void m1();

}

 

 

函数式接口:用于JDK8.0中Lambda表达式开发

接口与内部类_第1张图片

 

——---内部类

 

一、内部类的理解

 

1. 内部类:定义在一个类内部的类被称为内部类

class Outer{

    class Inner{} // 内部类

}

 

2. 内部类编译之后生成独立的.class文件,命名为:

 外部类的类名$内部类的类名.class 

3. 内部类可以直接使用外部类的属性和方法

4. 内部类的分类:成员内部类、静态内部类、局部内部类、匿名的内部类

- (1)成员内部类:

class Outer{

    class Inner{} // 成员内部类

}

 

- (2)静态的内部类:

class Outer{

    // 静态内部类

    static class Inner{} 

}

 

- (3)局部内部类:定义在方法中

class Outer{

    public void test(){

        // 局部内部类

        class Inner{} 

    }

}

 

- (4)匿名内部类:【重点】

 

二、匿名内部类

 

1. 匿名内部类的特点

- (1)类本身没有自己的类名,是一个特殊局部内部类

- (2)匿名内部类必须继承一个父类或是实现一个接口

- (3)匿名内部类只能创建一个对象,而且对象的创建和类的定义一起完成

2. 语法:

public class Test2{

    public static void main(String[] args){

        // 利用匿名内部类完成IA接口的实现

        IA ia=new IA(){

            public void m1(){

                System.out.println("实现..");

            }

        };

        ia.m1();

    }

}

interface IA{

    void m1();

}

 

 

三、Lambda表达式

 

1. Lambda表达式:对匿名内部类的进一步简化,大大的减少了代码的冗余

2. Lambda表达式应用场景:对函数式接口的实现(接口中有且只有一个抽象方法称为函数式接口)

3. 语法:

接口名 引用 = (数据类型 参数名,数据类型 参数名)->{

    // 方法的实现部分

};

 

 

- (1)没有参数、没有返回值

接口名 引用 = ()->{

    // 方法的实现部分

};

 

 

注意:如果 {} 中仅有1条语句时, {} 可以省略

- (2)有参数,没有返回值

接口名 引用 = (数据类型 参数名,数据类型 参数名)->{

    // 方法的实现部分

};

 

 

注意: () 中的数据类型可以省略的

IB ib2 = (x,y) -> System.out.println(x+y);

ib2.m1(2.3,9.5);

 

 

示例代码:

public class Test5{

    public static void main(String[] args){

        IB ib1 = (double d1,double d2)->{

            System.out.println(d1+"-"+d2);

        };

        ib1.m1(3.8,9.8);

    }

}

interface IB{

    void m1(double d1,double d2);

}

 

- (3)有返回值,有参数

接口名 引用 = (数据类型 参数名,数据类型 参数名)->{

    // 方法的实现部分

    return 值;

};

 

 

注意: {} 中只有一条  return  语句时, {} 和 return 可以一起省略

IC ic2 = (m,n)-> m+n;

 

 

示例代码:

interface IC{

    int m2(int a,int b);

}

 

 

补充代码示例(对应Lambda表达式)

 

public class Test4{

    public static void main(String[] args){

        IA ia = ()->{

            System.out.println("实现..");

        };

        ia.m1();

 

        IA ia2 = ()-> System.out.println("哈哈哈...");

        ia2.m1();

    }

}

interface IA{

    void m1();

}

接口与内部类_第2张图片

 

idea的部分快捷键

 

psvm -> enter即可

 

sout -> enter System.out.println();

 

你可能感兴趣的:(接口与内部类)