栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

接口和内部类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

接口和内部类

一.内部类 1.1.定义:

 内部类简单来说就是在类的内部进行其他定义的操作

举个例子:

public class Inner_class {
    public static void main(String[] args) {
        outer out = new outer();
        out.println2();
    }
}
class outer{
    public String str1 = "定义的外部类";
    class inner{
        public String str2 = "定义的内部类";
        public void println(){
            System.out.println(str1);
        }
    }
    public void println2(){
        inner in = new inner();
        in.println();
    }
}

运行的结果: 定义的外部类

1.2.内部类的作用

1.内部类与外部类可以方便的访问彼此的私有方法和属性

2.内部类相当于另外的一种封装,实现对外部其他类的隐藏

3.内部类可以实现Java单继承局限

但内部类的结构较为复杂

1.3.创建内部类 1.3.1 在外部类的外部创建非静态内部类

举个例子:

outer.inner inn = new outer().new inner();
语法:
外部类.内部类 内部类对象 = new 外部类().new 内部类();
1.3.2 在外部类的外部创建静态内部类

举个例子

outer2.inner2 inn2 = new outer2.inner2();
语法:
外部类.内部类 内部对象 = new 外部类.内部类
1.3.3 在外部类的内部创建内部类

举个例子:

inner in = new inner();

1.4.内部类的分类 1.4.1 成员内部类

 成员内部类内部不允许存在任何static变量或方法,成员内部类是依附外部类的,只有创建了外部类才可以创建内部类

1.4.2 静态内部类

 被static修饰的 内部类称之为静态内部类。静态内部类的创建不需要依赖外部类就可以直接创建;静态内部类不可以使用任何外部类的非static类,但可以存在自己的成员变量

1.4.3 方法内部类(局部内部类)

 定义在方法里的类;

方法内部类不允许使用访问权限修饰符

1.方法内部类对外完全隐藏,除创建这个类的方法可以访问之外,其他地方均不能访问

12.方法内部类如果想要使用方法形参,该新参必须使用final声明

1.4.4 匿名内部类

 就是一个没有名字的方法内部类。所以特点与方法一致,并且他还有自己的特点:匿名内部类必须继承一个抽象类或者实现一个接口;匿名内部类没有类名,因此没有构造方法

假如只需要创建这个类的一个对象不需要知道其实际类型(不需要使用到类名),那么就可以使用匿名内部类。

 举个例子

public class lambda1 {
    //静态内部类
    static class Like2 implements ILike {

        @Override
        public void lambda() {
            System.out.println("我爱学习Java2");
        }
    }
    public static void main(String[] args) {
        ILike like = new Like();  // 接口的实现类可以实例化,但必须将实现类的对象在内存中的地址指向接口,这个接口就可以使用了
        like.lambda();

        ILike like2 = new Like2();
        like2.lambda();
        //局部内部类
        class Like3 implements ILike {

            @Override
            public void lambda() {
                System.out.println("我爱学习Java3");
            }
        }
        like = new Like3();
        like.lambda();

        //匿名内部类
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println("我爱学习Java4");
            }
        };
        like.lambda();
    }

}
interface ILike{
    void lambda();
}
class Like implements ILike {

    @Override
    public void lambda() {
        System.out.println("我爱学习Java");
    }
}
二.接口 2.1.定义:

 接口是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

 继承只支持单继承,但接口可以实现多继承。类可以实现接口,通过关键词implements,但实现接口中的类,必须实现接口中的方法

2.2.接口的实现

步骤:

1.声明类为实现给定的接口

2.对接口中的所有方法提供定义

接口中所有的方法默认都是public方法,但在实现接口的时候,必须将方法声明为public,否则编译器将默认这个属性时包可见性(类的默认访问属性)

举个例子:

public interface TimeService {
    void timer();
}

public interface UserService {
    //接口中的所有定义都是抽象的 默认是public abstract

    //接口定义的都是常量:public static final
    int age = 99;

    void add(String name); 
    void delete(String name);
    void update(String name);
    void query(String name);

}

public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void timer() {

    }
}

接口的作用:

1.约束
2.定义一些方法,让不同的人实现
3.方法:public abstract 属性: public static final
4.接口不能实例化,接口中没有构造方法
5.implements可以实现多个接口
6,但必须重写接口中的方法

2.3.接口的属性

1.接口不是类,不能用new来实例化一个接口,但可以声明接口的变量

2.接口的变量必须引用实现这个接口的类对象

3.接口中不可以包含实例字段,但可以包含常量(默认是:public static final),任何实现接口的类都自动继承常量

三.Lambda表达式

函数式接口:只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化

使用Lambda表达式可以让代码看起来更加简洁,避免匿名内部类定义过多

举个例子:

public class lambda1 {
    public static void main(String[] args) {
        ILike like = new Like();
        //用Lambda简化
        like = () -> {
            System.out.println("我爱学习Java");
        };
        like.lambda();
    }

}
interface ILike{
    void lambda();
}
class Like implements ILike {

    @Override
    public void lambda() {
        System.out.println("我爱学习Java");
    }
}

但方法中传入参数时

public class lambda2 {

    public static void main(String[] args) {
        ILove love = null;
       //lambda表达式简化
        ILove love = (int a)-> {
                System.out.println("I love you-->" + a);
        };
    }
}
interface ILove{
    void love(int a);
}
//简化参数类型
love = (a) ->{
    System.out.println("I love you-->" + a);
};
//简化括号
love = a ->{
    System.out.println("I love you-->" + a);
};
love = a -> System.out.println("I love you-->" + a);
        love.love(2);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/288414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号