「java模板函数」模板类中的模板函数
本篇文章给大家谈谈java模板函数,以及模板类中的模板函数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、在JAVA中是如何体现C++的函数模板这种机制的?
- 2、java中,什么是类,方法,函数? 三者又有什么区别?
- 3、JAVA中的泛型和C++中的模板是不是一样啊,哪位大侠知道,请举例说明下,多谢。
- 4、Java中如何调用函数和自定义函数
- 5、java的模板类实例化问题
在JAVA中是如何体现C++的函数模板这种机制的?
很不好意思,Java的特性比C++少得多。Java不支持模板。只支持很少的类似于C++模板的语法来实现很有限的泛型编程。
Java对泛型编程的支持也是最近才加进去的,而且支持的很不好。你就不用指望能像C++那样用它了。
Java是一个非常纯粹的OOP语言,它天生就是相对动态的、后期的,编译期处理的信息非常少,这和C++强静态的特性是完全相反的。
Java的绝大部分类型信息都属于RTTI,也就是在运行时动态获取,不像C++是在编译期由编译器推导的,所以Java基本上不可能支持C++那样灵活的模板。
Java的泛型也是,说白了只是个障眼法,用类似C++那样的模板语法来包装了其面向对象动态cast的本质而已。
举例说,java中的Vectorint,你给里面保存int的时候,每一个int都是先被包装成一个Integer对象然后塞进去,取出来的时候是先取出Object对象,转换成Integer对象,然后再从里面取出int这个整数,绕了很大一个弯子。
虽然从代码上写的和C++差不多都很简洁,但是实际的效率和C++差了n个数量级。这点上实在是比较恶心,C#都做得比它好,C#至少对于值类型还是会实例化代码的。
Java天生就是一个鼓励动态化、运行期化、OOP化的一个语言,所以它不适合使用C++中那些泛型编程的范式来设计程序。你如果能够忍受Java的装箱拆箱的巨大效率损失,你可以用OOP的方式来实现那种同一个函数服务多种类型的想法,但是的确很低效。
java中,什么是类,方法,函数? 三者又有什么区别?
类 就是 指一个种类,比如 人 ,是一个类,动物 也是一个类,等等
而如果特指某个人,则是实体。
在Java中,类的定义是 : class 类名 ,通常,我们在Java 中提到class,就是指类的意思。
( 符号要去掉)
另外,方法与函数其实一样的,只是在C语言中我们习惯叫函数,而在Java中我们习惯叫方法,不管怎么叫,都是指同一个意思。
方法(或函数,为了方便,下面我都说 方法 ) 必须在类中。方法的定义 :
修饰符返回值方法名 (参数类型 参数名){.....}
( 符号要去掉)
通常你看到一个带()的就是方法了,例如: aa.XXX(); 是指调用实体 aa的XXX()方法。
类 可以拥有 属性跟方法。方法在类中。
在 类 和 方法 中均创建 某个类 的实体,可以调用类的方法。
程序运行时,首先是从main()方法开始运行的。
main()函数必须放在 跟你文件名同名的类中,另外一个class文件中只能有一个mian()方法,
否则,在编译运行的时候会出错。
JAVA中的泛型和C++中的模板是不是一样啊,哪位大侠知道,请举例说明下,多谢。
很不一样,随便列举一些
c++的模板,就如同模板这个词字面上的意思一样,属于字符的替代过程
比如有一个模板函数
template typename T
void foo(T t) {
t.bar();
}
那么这个可以编译。不过你使用这个函数的时候,T必须是包含bar函数的类
java 则不行
static T void foo(T t) {
t.bar();
}
这个是通不过编译的,因为编译器只知道T是一种Object,不知道T的具体类型。
你甚至不能写T t = new T(); 因为在这个方法定义的时候,编译器也不能保证T是有构造函数的
因为c++的模板做事方式是字符串的替代,所以模板参数是int等基本类型是完全没有问题的。
java则不允许int等基本类型作为泛型参数。比如ArrayListint是不可以的
java 有covariance 和 contravariance
也就是也可以写一个泛型方法,限定泛型参数是某一个具体的类的子类,比如
static T void foo(ListT extends Object list)
这将能够接受ListString作为参数,如果只写ListObject,那是不能将ListString作为参数传给他的
c++没有这种机制
Java中如何调用函数和自定义函数
调用函数
System.out.println("hello world");
println即为函数,out为是输出对象,System为java系统类。
java是面向对象语言,调用非静态方法时,需要创建一个类的对象才能调用方法;
调用静态方法时,直接用类名调用即可。
import java.util.Array; //调用其他包下的方法时需要导包
Array.sort(arr); //Array是工具类,方法都为静态方法
定义函数
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值
;}
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法体:方法体包含具体的语句,定义该方法的功能。
注意: 在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。
拓展内容
java
Java源程序(.java文件)——java字节码文件(.class文件)——由解释执行器(java.exe)将字节码文件加载到java虚拟机(jvm)——字节码文件(.class)就会在java虚拟机中执行。
Java的基本包
java.lang 其中包含有:
接口:Comparable、Cloneable、Runable等
类:八个基本数据类型封装类、Math、Runtime、Object、String、StringBuffer、Thread、Exception等
java的模板类实例化问题
class vector(T)这里面的T表示某种具体的类类型,由你实际调用的时候来决定,你可以阅读一些关于Java泛类型的知识,就会明白了。
然后针对你main()方法里面v.add((byte)0);你把byte作为了"某种具体的类",那么
vectorT v=new vectorT();
改为以下就可以了:(用byte的封装类Byte作为某种具体类)
vectorByte v=new vectorByte(null);
关于java模板函数和模板类中的模板函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-14,除非注明,否则均为
原创文章,转载请注明出处。