Java中不再谈的问题

来源:互联网 发布:update例子 mysql 编辑:程序博客网 时间:2024/05/20 01:37

Java中不再谈的问题 (增加中

 

这里列出的 是我不想再讨论的一些东西。和FAQ(frequently Answered Question)不同,讨论起来烦人。

 


 

 

 11、为什么main方法必须用static修饰?

A:public static void main(String[] s)是Java程序的起点。

用static修饰的原因:无中生有。

 

10、Q: 传说"abcd"是String的引用,对吗?

 A:严格地说,字符串常量是String的引用。

由于术语混用的原因,我们常常说"abc"是字符串对象。

如果你认为这是一个传说,不是你的错,是你的老师差劲。

 

9、Q:操作符& 和 && 的区别是什么?

A:如果你不知道& 也是逻辑运算符(重载的),你可以上网获得很多(错误的)答案。

作为逻辑运算符,&& 是短路的,而&不是。

C语言中&只能够是位运算,因为没有boolean类型,2、1都是true。

 

8、Q:引用变量、引用和对象三个术语,有必要严格区别吗?

A:学习Java的前一年,你要严格区别。

以后可以顺便混用,你看一本书的时候,首先要明白作者是怎样混用的;

objVar、ref、obj有几种混用方式:

ref与obj混用比较常见,负面效果比较小。

三者全部混用的书,你别看。(基本上没有)

 

7、Q:关于内存分配,基本变量在栈中分配、对象在堆中分配,对吧?

A:对象在堆中分配/,总在Java heap中分配,这是对的。这里“对象”是指它的所有实例变量,不管是int还是String类型。

基本变量也好、引用变量也好,一般是:作为局部变量在Java栈中分配;作为实例变量在堆中分配。

final变量(包括final局部变量)、static变量则是静态分配。(所以也不能够说:所有局部变量在Java栈中分配。)

 

6、Q:一个引用变量占据多大空间?

A:对于“Object objVar;”的objVar ,据说被分配了一个字(32位)。

 

5、Q:一个Object对象有多大?为什么没有sizeof?

A:为什么你想知道它有多大?一般来说,Java不需要sizeof。

C有这个sizeof操作符,因为用户要(不得不)管理malloc调用、因为C语言的primitive types的长度是不固定的。

有人用Runtime.getRuntime().freememory()计算创建一个对象的前后内存余量,如:

static Runtime runtime = Runtime.getRuntime();...
long start, end;
Object obj;
runtime.gc();
start = runtime.freememory();
obj = new Object(); // 你希望看的东西
end =  runtime.freememory();
System.out.println("它占据了" + (start-end) + " bytes.");

这个方式不保证准确。

一般而言,一个Object占据了16 bytes(4个字)。

 

4、Q: new String("aaa")创建几个String对象?

A:没有上下文,答案不定。1 或者2个。

问题中创建对象是什么意思呢?编译时、运行时?

总之知道“常量池”就行了。

 

3、Q:Java中只有引用没有指针,对吗?

A:reference不过是Java中用的一个术语,不考虑实际的实现方式,它就是一个指针。

Java语言中没有了指针运算(pointer arithmetic),所以ref是安全的指针。事实上,every reference to an object is a pointer.

所以你会遇到NullPointerException。总之,每一个Java程序员都会知道:

    int[] a = {0, 1, 2, 3};
    int[] b = a ;
    b[0] = 88 ;

于是 a[0] 为88 。a and b (持有的值)are pointers (or references) to the same object.

中文中,引用的翻译毫无方向感,注意这一点。

 

2、Q:构造器和方法的不同有哪些?

A:除了overload机制和长得有点像,其他的都是不同的。

 

1、Q:Java中对象按引用传递?

A:烦人的问题。

再说Java中有按引用传递,别说我瞧不起你。

榆木脑袋。

原创粉丝点击