21.在Java中长度为0的数组是合法的。这种数组可以用于下面的情况:编写了一个方法去计算数组的结果,计算结果碰巧为。 可以按照下面的语法创建长度为 0的数组:
new elementTye[0]
要注意,长度为0的数组与null是不同的。
22.拷贝数组
可以把一个数组变量拷贝给另一个,这时,两个变量都指向相同的数组:
int [] luckyNumbers=smallPrimes;
如果实际上只想一个数组中的值拷贝给另一个变量,那么需要使用system类中的
arraycopy方法。其语法如下:
System.arraycopy(from,fromIndex,to,toIndex,count);
23.Java数组与C++数组在堆栈上很不相同。它在本质上其实相当于指向C++分配在堆中的数组指针。
即:int []a=new int[100];//java
并不等同于 int a[100];//c++
而是相当于 int * a=new int[100];//c++
24.Java中其实并没有多维数组,它只有一维数组。多维数组其实就是"数组的数组"。数组的各行可以被独立访问,实际上可以堆对他们进行交换。如下代码:
double [] temp =balance[i];
balance[i]=balance[i+1];
balance[i+balmp;
我们也可以创建不同行不同列的不规则数组。如下代码
int [][]odds=new int[NMAX+1][];
for(n=0;n<NMAX;n++)
odds[n]=new int[n+1];
在Java中声明new double[10][6]时,这个循环是自动执行的。不过当需要使用不规则数组时,需要单独分配行数组。
25.String 类中equals和Compareto 的区别
equals是任意对象都有的方法,而compareto只是string类的一个方法。
26.在Java中if语句中的条件必须是布尔类型的值。即其条件可以用逻辑运算产生,也可以用布尔类型的变量产生。
27.在Java中必须使用clone方法来实现一个对象的完全拷贝.
28.构造器和其他方法的一个重要不同在于:构造器只能和new运算符一起被调用。不能把构造器用于一个已存在的对象以重新设置其实例字段。
29. 在System类中有一个setOut方法可以把System.out设置为另外一个流。
疑问:System.out方法被标记为final 怎么能能够被setout 方法改变呢?
解答:setout方法是一个本地方法,并不是在Java程序设计语言中实现的。本的方法可以绕过Java语言的访问控制机制。(摘抄)
疑问:什么叫本地方法,如何设置本地方法?
解答:本地方法是不需要Java的虚拟机去解释直接在本地编译执行。和Java没有关系。
30. 静态方法可以被对象调用也可以被类名调用。但一般情况下建议用类名调用。
31.Java中静态字段和方法与C++的静态字段和方法的区别与联系。
Java中静态字段和方法与C++的静态字段和方法是相同的。不过在语法上略有不同。C++使用::运算符访问自身作用域之外的静态字段或方法,不能够通过对象访问。
32.什么叫工厂方法?试举一个例子。问题提出参考:Java2核心技术 卷1:基础知识第111页。
解答:暂时不需要理解。
33.关于main方法。
main方法并不对任何对象施加操作。事实上,程序开始执行时还不存在任何对象。静态main方法执行并构造程序所需要的对象。每个类都可以有一个main方法。这在对类进行单元测试时是一个很方便的。
34.Java程序调用函数时,方法参数是如何传递的?什么出售传值调用",什么时候是"传引用调用"?
当方法传递参数时如果是基本数据类型的数据,这函数传递的是值并不是地址。
当方法传递参数时如果的类的对象时,函数传递的是对象的地址。
因为对象的创建都是用new创建的,都是创建的堆中的,在栈中只有对象的地址。
35.在类中用final修饰的字段,在构造函数中必须被初始化。
36.默认字段初始化:
如果构造器中没有显示地对 某个字段赋值,那么它会被自动赋为默认值:数字变量为0,布尔变量为false,如果是对象引用,那么是null。
37.如果一个类提供了至少一个构造器,但没有提供默认构造器,那么构造没有构造参数的对象是非法的
只有类中没有其他构造器时,系统才会提供默认构造器。
38. 在一个构造器中调用令一个构造器。
如果构造器的第一个语句具有this(....),那么这个构造器将调用同一类中的其他构造器。如下典型的例子:
public Employee(double s){
//调用Employee(String ,double)
this("Employee #"+nextId,s);
nextId++;
}
39.在Java中有一种初始化变量的方法叫初始化块。类中声明中可以包含任意多的代码。只要构造了类的对象,这些代码块就会被执行。不管用那个构造器构造对象,初始化块都首先被运行,然后才是构造器的主体部分被执行。
40.静态初始化块与一般初始化块的区别?
41.数据字段在调用构造器后详细的执行过程。
1)初始化所有数据字段为默认值
2)按照在类声明中出现的次序依次执行所有字段初始化代码和初始化块。
3)如果构造器的第一行代码调用了另一个构造器,则执行被调用的构造器主体。
4)执行构造器主体
42.Java中不支持析构器,但我们可以把finalize方法添加到任何类中。finalize方法会在垃圾收集器清除对象之前被调用。但在实际的操作中,不要依赖finalize方法回收任何短缺资源---我们很难知道这个方法什么时候才被调用。有一个叫做System.runFinalizeersOnExit(true)的方法可以确保finalize方法在Java关闭前被调用。不过这种方法并不安全,也不鼓励使用。另一种替代的方法是使用Runtime.addShutdownHook子".
43.如何打包?
解答:在类的源文件开始出增加package 包名
然后在命令提示符窗口中输入javac -d . 文件名
44.如何把包打在C盘的根目录下?
解答:先看一下打包的命令:javac -d . 文件名
其中的"."代表了什么,是当前路径。现在这个问题就很明了了,要把包打在C盘的跟目 录下,就可以这么写:javac -d c:// 文件名
45.假设我已经把包打到C盘目录下了,但我在D盘中写了一个程序,现要用C盘目录下的包,请问应该怎么办?(要求不能拷贝)
解答:
46.编译器定位比虚拟机更为复杂。如果引用了类,而没有指定其所在的包,那么编译器就需要找到包含这个类的包。它会询问所以的import指示,查看其中是否包含了要找的类。它会查找每一个import给的路径给出的类,如果有多个匹配,就会产生编译时错误。(import 语名的顺序并不重要)。
编译器的还会去查看源文件观察源文件是否比类文件新。如果是这样的话,源文件就会被自动编译。
在一个源文件中只能引入其他包中的共有类。由于每个源文件只能包含一个共有类,文件名还必须和共有类的名字匹配。编译器从而可以很容易地为共有类定位源文件。当然,我们也可以引入当前包的非共有类。定义这些类的文件,文件名可能会与类名不同。如果引入了当前包中的类,编译器就需要查找当前包中所有的源文件以便确定是在哪个源文件中定义了这个类。
47.javac编译器总是在当前目录中查找文件,而java解释器只有在类路径中包含了"."目录的情况下才会查找当前目录。如果类路径没有设置,并不会产生什么问题---默认类路径中包含"."目录,但如果设置了类路径,却没有包含"."目录的话,就会产生问题---程序编译时不会出错,却无法运行。
48.如何设置类路径?
设置环境变量的classpath;
49.在类中如果一个变量没有标记为public或priavte,那么部件(类,方法或变量)可以被同一个包中的所有方法访问。
50.虚拟机定位类的方法?