new一个接口

摘要:
首先,我们来看一下接口的定义:接口是一种抽象类型,是Java编程语言中抽象方法的集合。接口通常声明为接口。实现接口的类必须实现接口中描述的所有方法,或者必须声明为抽象类。例如,Map。地图输入是一个内部界面,只能通过地图输入模式访问。匿名内部类有一些限制:匿名内部类既可以扩展类,也可以实现接口,但它们不能同时拥有,只能实现一个接口。

首先我们先看看接口的定义:

  接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

  接口是抽象类型,不能被实例化,也就是说不能通过new一个实例,但是确实有new的情况,例如:

import org.junit.Test;

public class Test2 {

    @Test
    public  void test() {
        Runnable run = new Runnable(){

            @Override
            public void run() {
                System.out.println("新线程开始");
                System.out.println(this.getClass().getName());
            }
        };
        new Thread(run).start();
    }
}

这是怎么回事呢?原来是编译器的优化,编译器创建了一个实现类,可以在bin目录下看到多了一个文件Test2$1.class:

new一个接口第1张

反编译一下:

import java.io.PrintStream;

class Test2$1
  implements Runnable
{
  Test2$1(Test2 paramTest2)
  {
  }

  public void run()
  {
    System.out.println("新线程开始");
    System.out.println(getClass().getName());
  }
}

我们看看输出:

new一个接口第2张

所以接口new的结果最终还是生成类的实例,只不过这个类我们看不到,是一个匿名内部类。

内部类总结

  Java编程思想第十章专门介绍了内部类,内部类确实神奇而且复杂。但是内部类在编程中被应用的场景很少,这主要是看设计者的设计思想,不过它的语法和特性却有很多。对于内部类来说要记住可以继承内部类但是不能覆盖

普通内部类:

    普通的内部类,就是在class里面普通的定义一个类:

package com.inspur.innerClass;

public class OuterClass {
    
    public class InnerClass{
        
    }
}

普通内部类,或者说平凡的内部类,有如下特性:(总结自《Java编程思想》)
   (1)这个类在外部类的外面不能被直接访问,需要通过OuterClassName.InnerClassName方式访问。比如Map的Map.Entry就是一个内部接口,只能通过Map.Entry方式来使用它。

   (2)内部类对象在创建后会秘密的链接到外部类对象上,隐含的有一个指向外部类对象的引用,所以没有外部类对象,是无法实例化内部类对象的。也就是我们无法独立于外部类创建一个内部类对象。(这里不包括声明为static的内部类,那不是平凡的内部类

    (3)因为内部类隐含的有一个指向外部类的指针,所以内部类可以访问外围类的成员,而且是外围类的所有成员,包括private的成员。

    (4)在内部类中使用OuterClassName.this可以访问外围类对象。

    (4)如果想要在外部类外面实例化内部类对象,那么可以同.new语法,也就是outerObject.new InnerClass()的方式:

import org.junit.Test;

public class OuterClass {
    
    public void outerShow(){
        System.out.println("外部类输出");
    }
    public class InnerClass{
        public void innerShow(){
            System.out.println("内部类输出");
        }
    }
    
    @Test
    public void test(){
        OuterClass out = new OuterClass();
        out.outerShow();
        OuterClass.InnerClass inner = out.new InnerClass();
        inner.innerShow();
    }
}

  (5)内部类最大的用途是:它可以实现接口或者继承某个类,这样使用内部类时,用基类引用内部类对象,可以屏蔽内部类的细节。这样的好处是,可以实现伪“多重继承”等。

  (6)普通的内部类不能有static字段和static数据,也不能包含嵌套类。

在方法和作用域内的内部类:

   如果内部类出现在了方法和作用域内,那么它就不是“平凡”的内部类了,而且这个内部类的作用域就是在这个方法的作用域内,方法外面是无法访问到的!但是它仍然具有“平凡”的内部类特性。

匿名内部类:

  匿名内部类,在内部类的基础上减少了对class的定义,直接用new 后面跟一个接口或者基类,然后类体里面实现方法即可,这样JVM会调用编译器生成的构造器来生成这个内部类对象,并且编译器帮忙生成这个内部类的类结构。匿名内部类好处是语法简单,但是不方便阅读,在Android编程中,对Button的监听经常会用匿名内部类。匿名内部类有一些限制:匿名内部既可以扩展类,也可以实现接口,但是不能两者兼备,而且只能实现一个接口。

嵌套类:

  嵌套类就是在内部类的基础上加上static声明,也就是静态的内部类。嵌套类跟普通的内部类特性有很大不同,特点:

   (1)在构造时,不需要外围类的对象,但是同样,它只能访问外围类中的static字段;

   (2)嵌套类可以有static数据和字段;

   (3)嵌套类可以作为接口的一部分,这样在接口中就可以用公用代码出现;

   (4)嵌套类是可以多重嵌套的,嵌套多少层不重要,它都可以访问它所有外围类成员。

内部类标识符:

  部类必须生成一个class文件以包含它的Class对象信息,这些类文件有严格的命名规则:外围类的名字,加上“$”,再加上内部类的名字。

 

免责声明:文章转载自《new一个接口》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇七大经典排序(Java版)VUE 日历签到下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Http自动跳转Https的接口测试实践

日前,需要做一个接口测试,对象是一个web系统,登录的时候需要用SSL连接,登录进入系统后自动转成普通的Http连接。 这种类型的web网站很常见,既保证了登录时的安全,也避免了整个系统使用SSL带来的系统性能下降的问题。 首先,我们把整个访问过程分解成3个过程: 访问http接口:http://***.com/?; 跳转到Https,登录用ssl连...

eNSP——利用三层交换机实现VLAN间路由

原理: VLAN将一个物理的LAN在逻辑上划分成多个广播域。VLAN内的主机间可以直接通信,而VLAN间不能直接互通。 在现实网络中,经常会遇到需要跨VLAN相互访问的情况,工程师通常会选择一些方法来实现不同VLAN间主机的相互访问,例如单臂路由。但是单臂路由技术中由于存在一些局限性,比如带宽、转发效率等,使得这项技术应用较少。 三层交换机在原有二层交换机...

asp.net 获取IP地理位置的几个主要接口

腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 结果: var remote_ip_info = {"ret":1,"start":"223.223.192.0","end":...

深入理解Apollo核心机制之配置读取——轮询

前两篇内容 《深入理解Apollo核心机制之配置读取——前言》 《深入理解Apollo核心机制之配置读取——ConfigService定时扫描》 概述 读取配置除了默认5分钟间隔去轮询接口拉取配置,还有客户端主动长轮询ConfigService,等待通知后主动拉取配置。本文就看看客户端是如何开始客户端轮询的,以及轮询中的具体细节。 RemoteConfig...

和小猪一起搞微信公众号开发—创建自定义菜单

前言 前段时间,微信开放了一个非常牛逼的接口,那就是服务号可以创建自定义菜单了。有了这个接口之后,使用微信与公众号交流倒更像是一个与微信内部的一个app交流,大大的强化了公众号的灵活性。 在编辑模式下,公众号管理者可以直接编辑自定义菜单并设定用户点击菜单之后的回复内容或者跳转的指定链接。本文主要介绍使用开发者模式来自定义菜单完成每个用户的个性化内容回复。...

C++异常

一、什么是异常处理         一句话:异常处理就是处理程序中的错误。 二、为什么需要异常处理,以及异常处理的基本思想         C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一...