`
hideto
  • 浏览: 2682664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Tiger in the house

    博客分类:
  • Java
阅读更多
很高兴花周五晚上2个小时的时间来阅读这样一本实用的书 -- 《Java 5.0 Tiger》

很多我面试过的朋友,工作经验两年以上,到今天都只用过JDK1.4,中WebSphere/WebLogic的毒不浅
智,日日知新也

一、新的类库
1, java.util.Arrays
提供对数组的一大堆实用的static方法:
binarySearch([], key):  使用二分搜索法来在指定数组中搜索指定值,返回搜索值的索引
toString([]): 打印数组内容
deepToString([]): 深层打印数组内容,适用于多维数组
equals([], []): 数组比较
deepEquals([], []): 深层比较,适用于多维数组
fill([], val): 给数组的每个元素赋值
sort([]): 对数组升序排序

2, java.util.Queue<E>
FIFO(先进先出)的必需品:
offer(E): 进
poll(): 出
Queue是接口,Queue q = new LinkedList();

3, java.util.Comparator<T>
结合java.util.Priority<E>构造自己排序的Queue:
compare(t1, t2): 实现自己的compare方法来排序

4, Override返回类型
Tiger让方法覆盖时连返回类型也可以Override:
public class Test1 {

  protected Test1 returnSomething() {
    return new Test1();
  }

}
public class Test2 extends Test1 {

  @Override
  protected Test2 returnSomething() {
    return new Test2();
  }

  public static void main(String... args) {
    System.out.println(new Test2().returnSomething().getClass().getName());
  }

}

Test2运行结果为: Test2
返回类型可以为superclass返回类型的extension

5, Unicode
Tiger前的Java版本支持Unicode 3.0,所有Unicode字符容于16位(一个char)
而Tiger改为支持Unicode4.0,它定义了不能容于16位的字符,这些字符不能容于一个char
这时我们用int类型的codePoint来表示该字符
codepoint是一个代表特定字符的数字,如0x3C0是π这个符号的codepoint
我们需要关注Character类的新方法

6, StringBuilder
不担心thread安全的情况下使用StringBuilder代替StringBuffer是最好的方式
引用

Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
分享到:
评论
16 楼 fhjxp 2007-12-17  
使用了Anotation之后,请问能不能在Anotation里面编码实现对被Anotation方法的拦截?
15 楼 dalang81 2007-08-31  
现在写Tiger有点晚了,都准备换Java6了。
Annotation确实是Java语言的一大进步。另外,Generic 和for循环也能使Java代码简洁很多。Autoboxing与Unboxing用起来方便,但感觉不是很好,不小心容易出问题。
==================
Annotation进步了?
这个是很有争议的话题,他把java推向了破坏结构,依赖实现的境地了。
14 楼 万里有那么一点云 2007-08-01  
恩那,我们现在的项目据说还有可能要用jdk1.4呢,老古董啊,=。 =
13 楼 bromon 2007-07-28  
我就是中了was毒,1.5的东西只能看不能用
12 楼 xly_971223 2007-07-27  
kjhot 写道
这种文章也能评为精华,呵呵

仔细的看了一下日期 就怕看错了 Tiger刚推出的时候发这个帖子绝对要精华
可现在。。。。
11 楼 Garriot 2007-07-27  
simohayha 写道
Generic 我觉得就是个空壳子,类型擦除真是很不好的说。不过貌似这个是为了兼容原来的代码,才这样做的。

不过5里面最吸引人的就是线程部分的改动了。


JDK1.5其实对编译器的改动非常小,很多新特性都是用了预编译或解释时的一些Hacks,所以说一些表面功能的背后可能还会隐藏着深层问题。

不过annotation确实令人兴奋,终于可以有个优雅的方式能得到代码的元信息了
10 楼 kjhot 2007-07-20  
这种文章也能评为精华,呵呵
9 楼 Tin 2007-07-20  
hideto看看Generic的背后会哭的……擦拭法造成的不一致。
还有Generic超级晦涩的语法……
经常被人用来攻击Java
8 楼 simohayha 2007-07-18  
Generic 我觉得就是个空壳子,类型擦除真是很不好的说。不过貌似这个是为了兼容原来的代码,才这样做的。

不过5里面最吸引人的就是线程部分的改动了。
7 楼 dunsword 2007-07-18  
现在写Tiger有点晚了,都准备换Java6了。
Annotation确实是Java语言的一大进步。另外,Generic 和for循环也能使Java代码简洁很多。Autoboxing与Unboxing用起来方便,但感觉不是很好,不小心容易出问题。
6 楼 yfmine 2007-07-15  
fsword 写道

有的东西确实还不错,例如concurrent部分,有的东西没有什么大用处,例如静态import(远不能达到在开发中提高生产力的效果)和for语法,还有些东西是看起来很美,实际上一用就麻烦不断。

EasyMock2,JUnit4中不用静态import写出的代码会丑陋无比,谁说不能提高生产力了
5 楼 hideto 2007-07-14  
罪过啊罪过,我本将心照Tiger,无奈Tiger照沟渠
其实Tiger的Generic和Annotation算是为Java撑了点脸面了
4 楼 fsword 2007-07-14  
楼主写的rails系列很好阿,怎么又捡起tiger这条破船了?
有的东西确实还不错,例如concurrent部分,有的东西没有什么大用处,例如静态import(远不能达到在开发中提高生产力的效果)和for语法,还有些东西是看起来很美,实际上一用就麻烦不断。
例如范型,它鼓励的是一种严格类型化的开发模式,当初刚出来的时候还是很吸引我的,但是用一用就觉得确实有问题,关键是缺少runtime的类型,而且语法也很不方便,实际上是个鸡肋。
那个covariant return感觉虽好,但是似乎更多的意义在于把java完善了一下(印象中用tiger开发的时候压根就没有考虑这个地方)。
至于anotation,没怎么用过元编程的东西,倒是希望其他人谈谈。
3 楼 hideto 2007-07-14  
七、for/in
抛弃Iterator吧
for(int n : numbes) {
  println(n);
}

for(String s : stringList) {
  println(s);
}

自定义实现Iterable接口或继承现有Collection的类来让你的类可以使用for/in

八、静态Import
Tiger中静态方法也可以import了,enum元素也可以import
import static java.lang.System.out;
import static java.lang.Math.*;
import static xx.xx.xx.SomeEnum.*;


九、java.util.Formatter
让你拥有C的printf()风格的字符串格式化
formatter.format("Remaining account balance: $%.2f", balance);


十、线程
Tiger引进大量全新的并发性功能,更好的支持mutilthread

HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList让我们用的放心、舒心、省心
在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意

BlockingQueue、Callable、Executor、Semaphore...
2 楼 hideto 2007-07-14  
六、Annotation
Annotation是Java中的metadata

1, Tiger中预定义的三种标准annotation
a, Override
指出某个method覆盖了superclass的method
当你要覆盖的方法名拼写出错时编译不通过
b, Deprecated
指出某个method或element类型的使用是被阻止的
子类将不能覆盖该方法
c, SupressWarnings
关闭class、method、field/variable初始化的编译期警告
比如没有List没有使用Generic,则@SuppressWarnings("unchecked")将去掉编译期警告,这对将程序移植到JDK1.4有意义

2, 自定义annotation
public @interface Marked {}

3, meta-annotation
或者说annotation的annotation
四种标准的meta-annotation全部定义在java.lang.annotaion包中:
a, Target
指定所定义的annotation可以用在哪些程序单元上
如果Target没有指定,则表示该annotation可以使用在任意程序单元上
@Target({ElementType.ANNOTATION_TYPE,
         ElementType.CONSTRUCTOR,
         ElementType.FIELD,
         ElementType.LOCAL_VARIABLE,
         ElementType.METHOD,
         ElementType.PACKAGE,
         ElementType.PARAMETER,
         ElementType.TYPE})
public @interface TODO {}

b, Retention
指出Java编译期如何对待annotation
annotation可以被编译期丢掉,或者保留在编译过的class文件中
在annotation被保留时,它也指定是否会在JVM加载class时读取该annotation
@Retention(RetentionPolicy.SOURCE)  // Annotation会被编译期丢弃
public @interface TODO1 {}
@Retention(RetentionPolicy.CLASS)   // Annotation保留在class文件中,但会被JVM忽略
public @interface TODO2 {}
@Retention(RetentionPolicy.RUNTIME) // Annotation保留在class文件中且会被JVM读取
public @interface TODO3 {}

c, Documented
指出被定义的annotation被视为所熟悉的程序单元的公开API之一
被@Documented标注的annotation会在javadoc中显示,这在annotation对它标注的元素被客户端使用时有影响时起作用
d, Inherited
该meta-annotation应用于目标为class的annotation类型上,被此annotattion标注的class会自动继承父类的annotation

4, Annotation的反射
我们发现java.lang.Class有许多与Annotation的反射相关的方法,如getAnnotations、isAnnotationpresent
我们可以利用Annotation反射来做许多事情,比如自定义Annotation来做Model对象验证
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface RejectEmpty {
	/** hint title used in error message */
	String value() default "";
}

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD, ElementType.METHOD })
public @interface AcceptInt {
	int min() default Integer.MIN_VALUE;
	int max() default Integer.MAX_VALUE;
	String hint() default "";
}

使用@RejectEmpty和@AcceptInt标注我们的Model的field,然后利用反射来做Model验证
1 楼 hideto 2007-07-14  
二、Generic
不光是类型安全,Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection等功能的基石
1, 类型安全
抛弃List、Map,使用List<String>、Map<Integer, String>
给List、Map添加元素或者使用Iterator<T>遍历时,编译期就可以给你检查出类型错误

2, 方法参数和返回值统统加上Type
抛弃List getStringListFromIntegerList(List list)
使用List<String> getgetStringListFromIntegerList(List<Integer> list)

3, 不再需要类型转换
List<String> l = new ArrayList<String>()
String s = l.get(i)

4, 类型通配符
假设一个打印List<T>中元素的方法printList,我们希望任何类型T的List<T>都可以被打印:
public void printList(List<?> list, PrintStream out) throws IOException {
  for (Iterator<?> i = list.iterator(); i.hasNext(); ) {
    out.println(i.next().toString());
  }
}

类型通配符"?"让我们的printList方法更通用

5, 限制类型参数
如果通配符?让我们的参数类型过于广泛,我们还可以限制一下它:
public void printList(List<? extends Number> list, PrintStream out) throws IOException {
  for (Iterator<? extends Number> i = list.iterator(); i.hasNext(); ) {
    out.println(i.next().toString());
  }
}


三、Enumerated类型
Tiger加入了枚举类型,而且是enum是类型安全的
枚举类型入门

四、Autoboxing与Unboxing
Primitive与Wrapper类型可以自动互转了
int、short、char与Integer、Short、Char一视同仁

五、vararg
变长参数让我们的方法更灵活更重用:
public Guitar(String... features)
public static void main(String... args)

相关推荐

    机器学习(预测模型):新私家车注册和燃料类型的详细统计数据

    数据集提供了关于新私家车注册和燃料类型的详细统计数据。这个数据集包含了不同国家或地区在一定时期内新注册的私家车数量,以及这些车辆所使用的燃料类型分布。这些信息对于分析汽车市场趋势、能源消耗模式以及环境影响等方面具有重要价值。 该数据集可能包含以下关键信息: 时间范围:数据覆盖的具体年份或时间段。 地理覆盖:包括的国家或地区,可能涉及全球、特定大洲或单一国家。 车辆类型:私家车的新注册数量,可能按车辆类型(如轿车、SUV等)分类。 燃料类型:包括各种燃料类型的车辆数量,如汽油、柴油、电动、混合动力等。 趋势分析:随时间变化的新注册车辆数量和燃料类型的分布变化。 通过这个数据集,研究人员、政策制定者和市场分析师可以深入了解私家车市场的发展动态,评估不同燃料类型车辆的市场接受度,以及预测未来市场趋势。这对于制定交通政策、推动能源转型和减少环境污染等方面具有重要意义。

    【JCR一区级】基于matlab蚁狮算法ALO-CNN-BiLSTM-Attention故障诊断分类预测【Matlab仿真 5476期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    人工智能与机器学习之多级关联规则学习:Python实现与应用

    内容概要:本文介绍了多级关联规则学习在数据挖掘和机器学习中的应用,特别是多级 Apriori 算法。主要内容包括多级关联规则的基本概念、多级 Apriori 算法的原理和实现步骤、Python 代码示例以及在零售业和电子商务推荐系统中的具体应用。文章还讨论了算法的局限性和未来研究方向,如高效算法设计、规则精简与优化、可视化与解释等。 适合人群:具备一定编程基础的数据科学家、机器学习工程师和研究人员。 使用场景及目标:①零售业中的商品关联分析;②电子商务中的个性化推荐系统;③多级关联规则学习的高级应用和技术改进。 其他说明:文章提供了详细的 Python 代码示例,包括数据预处理、多级 Apriori 算法实现、关联规则生成等。同时,文中还介绍了如何处理大规模数据集和稀疏数据集的策略,以及如何应用多级关联规则在实际业务中提供数据支持。

    默纳克刷机,默纳克刷协议,默纳克显示板 外呼板协议更改 烧录 默纳克各种软件各种刷机,含主板、轿顶板、外呼板刷机软件原程序、操作器刷机软件及协议一应俱全

    默纳克刷机,默纳克刷协议,默纳克显示板 外呼板协议更改 烧录 默纳克各种软件各种刷机,含主板、轿顶板、外呼板刷机软件原程序、操作器刷机软件及协议一应俱全。

    【SCI一区】海洋捕食者算法MPA-CNN-LSTM-Attention风电功率预测【Matlab仿真 5558期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    STM32L151单片机连接BC28-NBIOT模块实现多个参数值以JSON格式发送到阿里云平台并自动感应报警.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32L151运行,如果是STM32L15X其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。

    【铜冠金源期货-2024研报】南美丰产或逐步兑现,豆粕弱势寻底.pdf

    【铜冠金源期货-2024研报】南美丰产或逐步兑现,豆粕弱势寻底.pdf

    【SCI一区】被囊群算法TSA-CNN-LSTM-Attention风电功率预测【Matlab仿真 5549期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    STM32L152连接BC26-NBiot模块实现TCP协议与云服务器数据的双向透传.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32L152运行,如果是STM32L15X其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。

    MSCOMM控件资源WIN-ALL

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    AVR单片机项目-简单遥控小车(源码+仿真+效果图).zip

    使用串口连接蓝牙,配置好就可以跟手机通信,直接发命令给单片机,解析后即可根据命令执行对应的动作。用定时器产生2路pwm波通过引脚硬件输出,接到电机驱动模块(l98n)的两个en脚,再通过各2个引脚来控制驱动模块,来决定两个电机的正反转、或是刹车。接着根据数据手册和实物调试,编写好小车前进、后退、左右转的动作函数。前后走就是电机都往同一个方向转,左右转弯是利用左右两侧电机的差速实现的,或是两侧电机方向相反转即可。那蓝牙指令控制什么呢?首先是整个小车的状态:前进、后退、左转、右转刹车。用手机的SPP软件可以配置按键,按下运动,抬起就刹车,用起来就很好。我也增加了左右轮的pwm占空比控制,可以通过指令增加减小对应的速度,也加了范围限制,防止数值超范围的异常。就这样调试好久能玩耍啦~ 其实用1个pwm也可以,这里用2个是因为pwm相同,但实物误差下,小车不是走直线,需要软件校正。 使用串口连接蓝牙,配置好就可以跟手机通信,直接发命令给单片机,解析后即可根据命令执行对应的动作。用定时器产生2路pwm波通过引脚硬件输出,接到电机驱动模块(l98n)的两个en脚,再通过各2个引脚来控制驱动模块,来

    基于小程序的家庭大厨微信小程序源代码(java+小程序+mysql+LW).zip

    本家庭大厨微信小程序管理员功能有个人中心,用户管理,店铺管理,菜品信息管理,菜品分类管理,购买菜品管理,订单行管理,系统管理等。店铺和用户都可以在微信小程序上面进行注册和登录。登录后才可以对菜品还有订单信息进行操作。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7 小程序开发工具:hbuildx/微信开发者工具

    基于Yolov5车牌检测,更快更准.源码+详细文档 +全部资料+高分项目.zip

    【资源说明】 基于Yolov5车牌检测,更快更准.源码+详细文档 +全部资料+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    【电力负荷预测】基于matlab鲸鱼算法优化回声神经网络WOA-ESN电力负荷预测(多输入单输出)【Matlab仿真 5338期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    斑马算法ZOA-CNN-BiLSTM-Attention故障诊断分类预测【Matlab仿真 5430期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【JCR一区级】基于matlab白鲨算法WSO-CNN-LSTM-Attention故障诊断分类预测【Matlab仿真 5661期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    Node后端项目的解读;

    Node后端项目的解读;

    Python详细入门(71页)

    Python详细入门(71页)

    基于大数据平台的知识图谱存储访问系统源码+文档+全部资料.zip

    【资源说明】 基于大数据平台的知识图谱存储访问系统源码+文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    计算机图形学教案(33页全)

    计算机图形学教案(33页全)

Global site tag (gtag.js) - Google Analytics