设为首页 - 加入收藏 华夏网 ()- 云主机,资讯,互联网,人工智能,云计算,大赢家论坛,区块链,VR,站长网!
热搜: 平台 google 2019 中国
当前位置: 主页 > 电商 > 正文

lt;数据结构与算法分析gt;读书笔记--实现泛型构件pre-Java5

发布时间:2021-04-04 00:30 所属栏目:[电商] 来源:网络整理
导读:? 面向对象的一个重要目标是对代码重用的支持。支持这个目标的一个重要的机制就是泛型机制:如果除去对象的基本类型外,实现的方法是相同的,那么我们就可以用泛型实现来描述这种基本的功能。 ? ? 1.使用Object表示泛型 Java中的基本思想就是可以通过使用像Ob

?

面向对象的一个重要目标是对代码重用的支持。支持这个目标的一个重要的机制就是泛型机制:如果除去对象的基本类型外,实现的方法是相同的,那么我们就可以用泛型实现来描述这种基本的功能。

?

?

1.使用Object表示泛型

Java中的基本思想就是可以通过使用像Object这样超类来实现泛型类。

示例一:

(1)编写MemoryCell.java

package cn.pre.example;

public class MemoryCell {

    private Object storedValue;
    
    
    public Object rend() {
        
        return storedValue;
        
    }
    
    
    void write(Object x) {
        
        storedValue=x;
        
    }
    
    
    
    

}

当我们使用这种策略时,有两个细节必须要考虑。第一个细节(2)中阐释,它描述一个main方法,该方法把“37”写到MemoryCell对象中,然后由从MemoryCell对象读出。为了访问这种对象的一个特定方法,必须要强制转换成正确的类型(当然了,在这个例子中可以不必强制转换,因为在程序中可以调用toString()方法。这种调用对任何对象都是能够做到的)。

?

(2)编写TestMemoryCell并运行该类

import java.lang.management.MemoryNotificationInfo;

 javax.swing.event.MenuDragMouseEvent;
/**
 * 使用泛型MemoryCell类
 * @author youcong
 * @date 2018年12月25日20点19分
 */
 TestMemoryCell {
  
    static  main(String[] args) {
        
        MemoryCell m = new MemoryCell();
        
        m.write("37");
        
        String val = (String) m.rend();
        
        System.out.println("Content are:"+val);
// System.out.println("Content are:"+m.rend().toString()); } }

?

?

第二个重要细节是不能使用基本类型。只有引用类型能够与Object相容。

?

说到这,回顾一下Java的基础知识,基本类型有哪些?引用类型有哪些?基本类型和引用类型的区别是?

基本类型:byte、short、int、long、double、float、boolean、char。

引用类型:Object、数组、String和枚举等。

基本类型和引用类型的区别是:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的。

?

那么什么是堆?什么是栈?

堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护).
在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用.

栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.
在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).

?

下面的示例二(可以很好的说明这一点):

?

 java.awt.HeadlessException;

 HeapStackExample {

    
     stackTest() {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2);
    }
    
     heapTest() {
        
        String s1 = new String("abc");
        String s2 = );
        System.out.println(s1==s2);
    }

    main(String[] args) {
    
      HeapStackExample.stackTest();
      HeapStackExample.heapTest();
}

}

?

?

在Java中有六个不同的地方可供存数据:

(1) 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。


(2)堆栈(stack)。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些 内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成 相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其 中。

(3)堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行 这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。

(4)静态存储(static storage)。这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。


(5)常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 。


(6)非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

?

?

?

2.基本类型的包装

当我们实现算法的时候,常常遇到语言定型问题:我们已有一种类型的对象,可是语言的语法却需要一种不同类型的对象。

这种技巧阐释了包装类的基本主题。一种典型的用法是存储一个基本的类型,并添加一些这种基本类型不支持或不能正确支持的操作。

在Java中我们已经看到,虽然每一个引用类型都和Object相容,但是,8种基本类型却不能。于是,Java为这8种基本类型中的每一种都提供了一个包装类。

例如:int类型的包装是Integer。每一个包装对象都是不可变的(就是说它的状态绝不能改变),它存储一种当该对象被构建时所设置的原值,并提供一种方法以重新得到该值。包装类也包含不少的静态使用方法。

?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章