本文目录一览:
- 1、JAVA中的类 相当于C语言里的 什么?
- 2、JAVA中有没有类似C语言中sizeof那样的功能?
- 3、请问java语言中有没有类似C语言里scanf的语句?
- 4、java中有类似于c中的结构体一样的数据类型吗
- 5、java中类似C中的scanf函数是什么,怎么用
- 6、java中类似于C语言的goto无条件转向语句的语法是什么?
JAVA中的类 相当于C语言里的 什么?
C语言不是面向对象的,所以没有类这个概念,要说最相近的概念,是结构体
C++才有面向对象,同样也叫做类。
JAVA中有没有类似C语言中sizeof那样的功能?
Java没有提供任何类似于C语言的sizeof()的操作器。但是java中可以模拟C语言中对sizeof的实现。
实现的想法是这样的:java.lang.Runtime类中有一些简单的能涉及到内存管理的函数:
使用这些简单的内存访问,可以得到内存的一些情况,通过建立一个大的某个类的数组,来查看内存用了多少,进而可以求得类的大小。
程序代码示例:
public class Sizeof {
public static void main(String[] args) throws Exception {
// Warm up all classes/methods we will use
runGC();
usedMemory();
// Array to keep strong references to allocated objects
final int count = 100000;
Object[] objects = new Object[count];
long heap1 = 0;
// Allocate count+1 objects, discard the first one
for (int i = -1; i count; ++i) {
Object object = null;
/* Instantiate your data here and assign it to object*/
//object = new Object ();
//object = new Integer (i);
//object = new Long (i);
//object = new String ();
//object = new Byte( (byte) 0);
//object = new Float( 0.2f);
//object = new Double( 0);
//object = new HelloWorld();
if (i = 0)
objects[i] = object;
else {
object = null; // Discard the warm up object
runGC();
heap1 = usedMemory(); // Take a before heap snapshot
}
}
runGC();
long heap2 = usedMemory(); // Take an after heap snapshot:
final int size = (int) Math.round(((double) (heap2 - heap1)) / count);
System.out.println("'before' heap: " + heap1
+ ", 'after' heap: " + heap2);
System.out
.println("heap delta: " + (heap2 - heap1) + ", {"
+ objects[0].getClass() + "} size = " + size
+ " bytes");
for (int i = 0; i count; ++i)
objects[i] = null;
objects = null;
}
private static void runGC() throws Exception {
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r 4; ++r)
_runGC();
}
private static void _runGC() throws Exception {
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 usedMem2) (i 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
private static final Runtime s_runtime = Runtime.getRuntime();
} // End of class
需要注意的是上面的一句:Object[] objects = new Object[count];
只是分配了数组空间,没有分配对象的空间。数组中只有引用而已。
结论:下代码测试基本对象时,得出的结果象下面:
Object类对象 : 8字节
Integer类对象 : 16字节
Long类对象 : 16字节
Byte类对象 : 16字节
此示例说明了java中基本类型封装对象所占内存的大小。
1.简单的Object对象要占用8个字节的内存空间,因为每个实例都至少必须包含一些最基本操作,比如:wait()/notify(),equals(), hashCode()等。
2.使用Integer对象占用了16个字节,而int占用4个字节,说了封装了之后内存消耗大了4倍。
3.Long看起来比Integer对象应该使用更多空间,结果Long所占的空间也是16个字节。
那么就正好说明了JVM的对于基本类型封装对象的内存分配的规则是如下:
a、Object所占内存(8个字节)+最大基本类型(long)所占内存(8个字节) = 16字节。
b、JVM强制使用8个字节作为边界。
c、所以所有基本类型封装对象所占内存的大小都是16字节。但是还是有区别,比如:Integer对象虽然占用了16个字节的内存,但是只是利用了Object所占内存(8个字节)+int所占内存(4个字节) = 12字节。还有4个字节根本没有被使用。
请问java语言中有没有类似C语言里scanf的语句?
当然有,
Scanner
in=new
Scanner(System.in);
while(in.hasNext())
{
String
str=in.nextLine();//这就可以得到一个字符串
}
具体去看看Scanner类就可以了
java中有类似于c中的结构体一样的数据类型吗
用class就可以了,其实C++里的struts已经是多余的了,只不过是一个全public的class,基本是为了兼容C才保留的。
java中类似C中的scanf函数是什么,怎么用
使用 Scanner 类,Scanner 被称为输入流扫描器类,从控制台读取数据的 构造方法 如下:
Scanner类在 java.util 包下,使用时要加
import java.util.Scanner;
Scanner input = new Scanner(System.in);
举例:
Scanner s = new Scanner(System.in);
//在控制台输入一个字符串,回车
String str = s.next();
s还有提供许多其它方法,可以参考jdk的api文档系统学习
java中类似于C语言的goto无条件转向语句的语法是什么?
Java不存在goto语句,但是已经用”类名.方法“的形式进行方法调用。
解释:goto语句作为java的保留字段,但是没有实际的应用的。goto语句实际上是C语言的范畴,用来定义指针跳转用的,java中通过”类名.方法“的形式进行的方法调用,不在用goto语句进行实现,这个是java的一大改进。
JAVA中实现goto语句功能 :
使用方法如下:
1 label0:
2 for (int k = 0; k 10; k++) {
3 ..........
4 label1:
5 for (int j = 0; j 10; j++) {
6 ................
7 break label0;
8 }
9 ...........
10 label2:
11 for (int kk = 0; kk 10; kk++) {
12 ..............
13 break label0;
14 }
15 }
16 System.out.println("here");
将需要跳转的到的循环开始处使用lablename:的方式标注(lablename是自定义标签名)
例如,第1行代码所示.在循环体内,可以使用break lablename;或者continue lablename跳转到该处第1行代码的地方,第7行代码执行后,将跳转到第1行代码处.
break 和continue的区别就是,break跳到lablename处后,接下来是执行该lablename所代表的循环之后的语句,例如第16行代码;而 continue则是将循环记数加1或者减1继续执行lablename所代表的循环,直到条件不满足或遇到return语句为止.
这样我们就可以在循环中任何位置跳转到父循环外去,无论嵌套多深.
注意:
1. lablename标签名和所代表的标签之前不能有任何其他的语句,例如第1行和第2行之间不能有其他的任何语句出现,否则编译不通过;
2.该跳转只能跳转到祖先级循环,同级循环之间不能跳转,例如第13行不能跳转到第4行
3.虽然该跳转在一定程度上方便了编程,不过最好尽量避免,因为它和goto一样在一定程度上破坏了结构化编程的特点。
更详细的例子可参考如下链接: