精华内容
下载资源
问答
  • 类的复用方式分为以下几种: 一.组合 在新的类中产生现有类的对象,由于新类是由现有类的对象组成,所以称为组合。组合只是复用了现有类程序代码的功能,而 并没有复用它的形式,所以这种方法十分直观。 组合...

    java中对类的复用是java引人注目的功能之一。复用类的诀窍就是使用类而不破坏现有程序代码。

    类的复用方式分为以下几种:

    一.组合

     在新的类中产生现有类的对象,由于新类是由现有类的对象组成,所以称为组合。组合只是复用了现有类程序代码的功能,而并没有复用它的形式,所以这种方法十分直观。

    组合语法:将现有类对象的引用定义于新类中,使用时将现有类初始化即可。

    在定义了现有类引用后,在使用这个引用前必须先对其进行初始化,否则在使用现有类的任何功能时都会抛出异常,因为现有类引用在初始化之前只是一个null引用。

    对现有类引用的初始化可以出现在:

    1.定义引用时初始化,这意味着它将总是在新类的构造器被调用之前被初始化;

    2.在新类的构造器中初始化;

    3.就在要使用这个对象的某些功能之前对其初始化,这种方式称为惰性初始化,它的好处是只有当我们需要使用它的某些功能时才对它进行初始化,这样可以减少jvm的负担。

    4.显式实例中初始化,即在{......}中对其进行初始化,这种初始化也是在新类的构造器被调用之前就已经进行了。

    下面的例子展示了组合的使用以及各种初始化方式:

    输出结果为:

    可以看到,显式实例初始化和定义时初始化都发生在构造器调用之前,他们两的初始化顺序取决于位于代码中的顺序。而惰性初始化则发生在构造器调用之后。

     

    二.继承

    继承是按照现有类的类型来创建新类,无需改变现有类的形式并采用现有类的形式在新类中添加代码。新类表现出继承现有类的形式,其中的大部分工作都由编译器来完成,我们只需要完成部分功能代码的编写即可。继承是面向对象编程的基石之一,也是所有OOP和java语言中不可缺少的一部分。当我们创建一个类时,总是在继承,因为除非已经明确指出要从其他类继承外,都是在隐式的继承java的标准根类Object类。

    继承语法:通过关键字extends来申明新类继承现有类,extends关键字位于新类主体的左边的花括号之前,关键字后面紧跟基类名称。当我们这样写完之后,新类会自动得到基类中所有的域和方法。包括那些基类中由于访问控制符修饰的对现有类而言不可见的成员(例如private修饰的域与成员,但是无法显式的直接调用)。此时现有类称为基类的导出类(子类)。

    看下面的例子:

    子类ReuseClassTest01继承BaseClassTest01后,子类对象即获取了基类的成员与方法,并可以调用。

    使用继承时需要注意的点:

    1.基类为包访问权限时,无法在基类所处包外定义类来继承它。

    2.子类继承基类后,会获得基类的所有域与方法。

    3.在子类中不一定非得使用基类的方法,也可以自行添加新的方法。添加方式与在类中添加任意方法一致。

    4.在子类中可以使用或修改基类中的方法

    5.如果想在子类中调用基类原本的方法或域,可以使用super关键字,如super.a,super.f()等等。

     

    基类的初始化:当创建了一个子类对象时,该对象会包含一个基类的子对象,这个子对象与用基类直接创建的对象是一样的,两者的区别在于后者来自外部,而前者中基类的子对象被包装在子类对象内部。对基类子对象的初始化是至关重要的,而且也只有一种方式来保证这一点:在子类构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需要的的所有知识与能力。java会自动在子类的构造器中插入对基类构造器的调用。这种构建过程是由基类向外扩散的,所以基类在子类构造器可以访问它之前,就已经完成了初始化。所以,子类的所有构造器(包括默认和重载构造器)中都默认并且隐式的调用了基类的默认构造器,如果基类没有定义默认构造器或定义了重载的构造器来取代了 默认构造器,编译器则会报错,此时我们需要在基类中添加上默认的构造器或在子类的构造器中显式的声明出调用基类的哪个重载构造器。并且这个声明必须位于子类构造器的首行。

    探索发现:

    我们知道在类中,如果有多个构造器定义,那么构造器之间可以相互调用,使用关键字this(param)可以在一个构造器中调用另外一个构造器,并且只能调用一次,而且必须出现在当前构造器的首行,那么当这个类继承了某个其他类时,在构造器中如果有出现相互调用的情况时创建基类子对象的过程是怎样进行的呢?问题可以简化一点:this(param)能否和super(param)同时显式的存在于同一个构造器中?

    来测试一下:

    (1)子类构造器相互调用时,基类子对象的创建过程

    看例子:

     

    子类ReuseClassTest01继承基类BaseClassTest01,子类创建对象时,调用的有参重载构造器,

    在有参重载构造器中,通过this()显式调用了它的默认构造器,这种情况下基类子对象是在何时被创建的呢?看下输出结果:

    按理来说,2个构造器的首行应该都默认有一个super(),从而进入基类的默认构造器中去创建基类子对象。然而,从结果来看,基类的默认构造器只进去了一次,所以说基类子对象只创建了一次,那么是在子类的哪一个构造器中进入的呢?从结果上来看看不出来。因此,我打断点debug了一下发现:

     

    重载构造器进入后并没有跳到基类的默认构造器中,

    而是进入了子类的默认构造,然后从子类的默认构造中进入了基类中的默认构造

    从而知道了是在子类的默认构造器中进入基类中去的。那么我们换一个顺序,先用默认构造器去创建子对象,然后在子类的默认构造器中去调用重载构造器,看看结果如何

    更改一下代码,然后先看看输出:

    输出结果同没更改之前有了不同,子类的默认构造器和重载构造器输出的顺序相反,同时debug发现这次是从重载构造器中进入到基类的默认构造器中去的。debug图片就不发了,有疑问的自己可以去debug试试。通过以上实践,是不是可以总结出基类构造器的初始化是在子类调用的它的最后一次构造器中进入的呢?

    看下面一个例子:

    (2)子类构造器中相互调用,并有显式的声明调用基类的构造器

    我们再次更改一下上面的例子:

    这次先调用重载构造器,在重载构造器里面调用默认构造器,输出结果为:

    看结果与第一次测试时的结果相同,其实这里的显式写入super()与不写的唯一区别在于显式写的可以指定调用基类的哪一个构造器,这个结果也验证了上面的结论:基类构造器的初始化是在子类调用的它的最后一次构造器中进入的这个结论也可以理解成基类子对象的创建是在子类调用它的没有this()关键字使用的构造器中进入并创建的,上面的测试也印证了子类中this(param)不能和super(param)同时存在于同一个构造器中,当有显式的this(param)出现时,子类的当前构造器中隐式的super(param)被编译器忽略,并在this(param)指定的下一个构造器中重新验证,直到找到一个没有this(param)使用的构造器。在构造器中,this(param)和super(param)都必须位于首行,所以相互冲突,不能共存。

    三.代理

    java中并没有对代理提供直接支持,它是继承与组合之间的中庸之道。因为我们将一个成员对象置于索要构造的类中(就像组合),但与此同时,我们在新类中暴露了该成员对象的所有方法(就像继承)。

    例如太空飞船SpaceShip需要一个控制模块SpaceShipControls,但是SpaceShip并非SpaceShipControls的一个类型,即便你可以告诉SpaceShip向前运动,准确的来说,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法都在SpaceShip中暴露了出来,这时,代理可以解决这个难题:

    使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。

     

     

    展开全文
  • 下面我们来一起看一下自定义cell的第二种复用方式,通过注册复用,获取数据参考上一篇微博: http://blog.csdn.net/lee727n/article/details/72584599 注册复用自定义cell viewdidload中注册- (void)viewDidLoad ...

    下面我们来一起看一下自定义cell的第二种复用方式,通过注册复用,获取数据参考上一篇微博:
    http://blog.csdn.net/lee727n/article/details/72584599
    注册复用自定义cell
    viewdidload中注册

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        //向 tableView 注册 cell 的样式  如果是 纯代码的自定Cell 使用该方法
    //    [self.tableView registerClass:[ListCell class] forCellReuseIdentifier:@"listcell"];
    
    
        //向 tableView 注册 cell 的样式  这里需要tableView 根据 xib 帮我创建cell 对象
        UINib *listnib = [UINib nibWithNibName:@"ListCell" bundle:nil];
        [self.tableView registerNib:listnib forCellReuseIdentifier:@"listcell"];
    
        //通过属性 设置行高
        self.tableView.rowHeight = 80;
    
    
    }

    实现三问一答

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.allLists.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        //复用方式二
        ListCell *listCell = [tableView dequeueReusableCellWithIdentifier:@"listcell" forIndexPath:indexPath];
    
        NewsList *newsList = self.allLists[indexPath.row];
        listCell.newsTitleLabel.text = newsList.title;
        listCell.newsCommentCountLabel.text = [NSString stringWithFormat:@"%ld", newsList.commentCount];
        listCell.newsImageView.image = [UIImage imageNamed:newsList.newsImage];
    
        return listCell;
    }
    
    展开全文
  • 通信中几种复用方式的介绍  复用是通信技术中的基本概念。在计算机网络中的信道广泛地使用各种复用技术。信道复用技术分为频分复用,时分复用,波分复用,码分复用,空分复用,统计复用,极化波复用。这里主要对频...

    通信中几种复用方式的介绍

      复用是通信技术中的基本概念。在计算机网络中的信道广泛地使用各种复用技术。信道复用技术分为频分复用,时分复用,波分复用,码分复用,空分复用,统计复用,极化波复用。这里主要对频分复用、时分复用和码分复用做介绍。复用的示意图如下图所示:

    频分复用 (FDM)Frequency Division Multiplex

    用户在分配到一定频带后,在通信过程中自始至终都占有这个频带。频分复用的所有用户在同样的时间内占有不同的带宽资源(这里说的带宽是频率带宽,而不是数据的发送速率)。

     

    时分复用(TDM)Time Division Multiplex 

    时分复用是将时间划分为一段段等长的时分复用帧(TDM帧)。每一个时分复用的用户在每一个TDM帧中占用固定序号的时隙。每一个用户所占用的时隙是周期性地出现(其周期就是TDM帧的长度)。时分复用的所有用户是在不同的时间内占用同样的频带宽度。

    时分复用可能会造成线路资源的浪费

    使用时分复用系统传送计算机数据时,由于计算机数据的突发性质,用户对分配到子信道的利用率一般不高。

    码分复用 (CDM)Code Division Multiplex 

    更常用的是码分多址(CMDA)Code Division Multiple Access

    每一个用户可以在同样的时间使用同样的频带进行通信,由于各用户使用经过特殊挑选的不同码型,因此各用户之间不会造成干扰。

    码分复用最初用于军事通信,因为这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易被敌人发现,后来才广泛的使用在民用的移动通信中,它的优越性在于可以提高通信的话音质量和数据传输的可靠性,减少干扰对通信的影响,增大通信系统的容量,降低手机的平均发射功率等。

    其工作原理如下:

     

    转载于:https://www.cnblogs.com/lxt1105/p/6904105.html

    展开全文
  • 0x01 缘由  最近,想起3年前做的一个客户端设备,发现我对客户端使用select,现在回想起来,虽然也能够工作,但是强扭的瓜不甜,实际不用select也可以满足...0x02 IO复用方式  2.1 select 头文件:#include

    0x01 缘由

         最近,想起3年前做的一个客户端设备,发现我对客户端使用select,现在回想起来,虽然也能够工作,但是强扭的瓜不甜,实际不用select也可以满足实际需求。当时可能是兴奋,想实践select的技术。下面主要复习和介绍select\poll\epoll的相关,并进行对比。

    0x02 IO复用方式

        2.1 select

        头文件:#include <sys/select.h>
        API:      int select( int nfds, fd_set FAR* readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
        参数:     
              nfds:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。
              readfds:(可选)指针,指向一组等待可读性检查的套接口。
              writefds:(可选)指针,指向一组等待可写性检查的套接口。
              exceptfds:(可选)指针,指向一组等待错误检查的套接口。
              timeout:select()最多等待时间,对阻塞操作则为NUL

      2.2 poll

      头文件:#include <poll.h>
      API: int poll(struct pollfd fds[], nfds_t nfds, int timeout);
      参数:
         fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符;每当调用这个函数之后,系统不会清空这个数组,操作起来比较方便;特别是对于socket连接比较多的情况下,在一定程度上可以提高处理的效率;这一点与select()函数不同,调用select()函数之后,select()函数会清空它所检测的socket描述符集合,导致每次调用select()之前都必须把socket描述符重新加入到待检测的集合中;因此,select()函数适合于只检测一个socket描述符的情况,而poll()函数适合于大量socket描述符的情况;
         nfds:nfds_t类型的参数,用于标记数组fds中的结构体元素的总数量;
         timeout:是poll函数调用阻塞的时间,单位:毫秒;
      返回值:
         >0:数组fds中准备好读、写或出错状态的那些socket描述符的总数量;
         ==0:数组fds中没有任何socket描述符准备好读、写,或出错;此时poll超时,超时时间是timeout毫秒;换句话说,如果所检测的socket描述符上没有任何事件发生的话,那么poll()函数会阻塞timeout所指定的毫秒时间长度之后返回,如果                       timeout==0,那么poll() 函数立即返回而不阻塞,如果timeout==INFTIM,那么poll() 函数会一直阻塞下去,直到所检测的socket描述符上的感兴趣的事件发生是才返回,如果感兴趣的事件永远不发生,那么poll()就会永远阻塞下去;
         -1: poll函数调用失败,同时会自动设置全局变量errno; 

      2.3 epoll

         

        2.4 文件就绪

       

    0x03 对比

         

    0x04 总结

         不用的场景使用的技术不同,只有选择最适合的才能发挥其设计优势。再次复习这些基础知识,如何使用得选择适合场景。
    展开全文
  • Beaglebone与FPGA通信截图(GPMC使用数据地址复用方式)。 这是使用Signal-Tap抓到的图,还是很理想的。 读写速度一般般,200ns读或者写一次吧。
  • RMAN+多路复用方式实现数据安全的策略     添加控制文件: alter system set control_files='+WDFDATA/wdfwms/controlfile/current.260.942065661','/home/wdforadata/controlfile/control.ctl' scope=...
  • 1. 使用dequeueReusableCellWithIdentifier:可不注册,但是必须对返回的cell进行判断,若...forIndexPath:必须注册,返回的cell可省略空值判断,当无可复用cell时runtime将使用注册时提供的资源去新建一个cell并返回;
  • MPEG-2 系统的传输流复用方式

    千次阅读 2014-08-03 22:20:13
    2.5 MPEG-2 系统的传输流复用方式     MPEG-2标准可分为三部分:视频、音频和系统。上面所述的MPEG-2视频、音频编码是针对每一路电视信号的图像和伴频进行的。视频编码和音频编码部分输出的是视频或音频...
  • 同时很多数据的提供者允许使用者通过InputStream类的对象方式来读取数据。根据java对io的抽象(Stream),流的复用是矛盾的。按照流本身所代表的抽象含义,数据一旦流过去了,就无法被再次利用了。对于现实应用中存在...
  • 一.继承中的方法重载(名称屏蔽) 如果在基类中有某个方法被多次重载,那么在子类中重新定义该方法名称时并不会屏蔽在基类中的任何一个版本。在子类中,基类和子类的该方法的 任何一个版本都可以正常工作。...
  • 文章介绍了3种十分常用的OFDM-PON(正交频分复用-无源光网络)结构:WDM(波分复用)-OFDM-PON、TDM(时分复用)-OFDM-PO
  • 开发过程中,cell的复用是一直关心的技术点,在cell的使用过程中展现...所以复用cell的方式就会有两种方式,纯代码,XIB //第一中cell的复用标识 static NSString* firseCellid = @"codeFirstCell"; 纯代码:
  • 第二,在Java 1.4中引入了NIO框架(Java.nio包),通过Channel、Selector、Buffer等新的抽象,可以构建多路复用、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式。 第三、在Java 7中,NIO有了...
  • 2.1物理层基本概念 目的:启动、维护和关闭数据...数据在通信线路上的传输方式一般都是串行传输,即逐个比特按照时间顺序传输。 ** 2.2数据通信的基础知识 ** 2.2.1数据通信系统的模型 一个数据通信系统可分三大部分
  • MC9S12XEP100引脚的复用方式

    千次阅读 2019-04-27 22:02:45
    简要讲了下MC9S12XEP100的复用引脚的功能选择方法
  • 组件复用 复用什么? state 操作state的方法 两种方式: render props模式 高阶组件(HOC) 注意: 这两种方式不是新的API,而是利用React自身特点的编码技巧,演化而成的固定模式 render-props模式 将要复用...
  • 实现三问一答,使用第一种非注册复用方式。注意通过xib自定义的cell需要load nib - ( NSInteger )numberOfSectionsInTableView:( UITableView *)tableView { return 1 ; } - ( NSInteger )tableView:( ...
  • I/O复用函数 select poll epoll<Linux的独有的I/O复用> 接下来我们最后一个I/O复用,也是Linux独有的I/O复用并对三种I/O复用进行简单的分析 epoll epoll不再是一个函数,而是一组函数,分别是: int epoll_...
  • iOS—自定义cell及两种复用方式

    千次阅读 2020-07-20 04:09:04
    首先,在这里反省一下自己,在遇到问题的时候没有及时去解决,这一点很不好,得改 一、关于UITableView 复用cell两种方法: 非注册 -(id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 如果没有复用...
  • 最后会用一个 Todolist 的项目实战,向大家介绍「Vue3.0的逻辑复用写法以及借用provide和inject的新型状态管理方式」 本文提纲: 如何新建一个使用vue3.0的项目 conposition api 逻辑复用(hook)和状态管理(provide...
  • I/O复用函数 select poll epoll<Linux的独有的I/O复用> 接下来我们逐一进行介绍//这里插入I/O复用的功能 select select的原型是 int select(int maxfd,fd_set *readfds,fd_set,fd_set *writefds,fd_set *...
  • I/O复用函数 select poll epoll<Linux的独有的I/O复用> 接下来我们分三次进行介绍I/O复用 poll poll的原型是 int poll (struct pollfd *fds,int nfds,int timeout); 比起select更加简洁了一些,事件不再由...
  • 三种I/O复用方式的比较

    千次阅读 2017-03-21 12:09:23
    select、poll、epoll这三组I/O复用系统调用都能同时监听多个文件描述符,他们都通过timeout参数指定要等待的时间。直到事件就绪时返回,返回值就是就绪的文件描述符的数量。下面我们从事件集、最大支持文件描述符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,541
精华内容 5,416
关键字:

复用方式