java问题整理

时间:2021-10-29 04:14:20
1、一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以有多个类。但只能有一个public类。并且public类名必须与文件名相一致。
 
2、Java有没有goto?
答:Java中的保留字,现在没有在Java中使用。
 
3、&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则有一方为false,则结果就为false。
&&还具有短路的功能,即如果第一个表达式为false,则不计算第二个表达式,如if(str != null && !str.equls(""))表达式,当str为null时,后面的表达式就不会执行,所以不会出现NullPointerException,如果将&&改为&,则会抛出NullPointerException异常。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果是0x01.
 
4、在Java中如何跳出当前的多重嵌套循环?
答:可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环,如:
ok:
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
System.out.println(" i = " + i + " , j = " + j);
if(j == 5)
break ok;
}
}

  

第二种方法:是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找某个数字:
int arr[ ][ ] = {{1, 2, 3}, {4, 5, 6, 7}, {9}};
boolean found = false;
for(int i = 0; i < arr.length && !found; i++)
{
for(int j = 0; j < arr[ i ].length; j++)
{
System.out.println("i = " + i + ", j = " + j);
if(arr[ i ][ j ] == 5)
{
found = true;
break;
}
}
}

  

5、switch语句中的变量类型有哪些?
答:byte、short、int或char。在jdk1.7以上的版本中支持Sring类型。也可以是枚举类型。
long类型不可以。

6、super()和this()的区别

答:1)super(参数):调用基类中中的某一个构造函数(应该为构造函数中的第一条语句)。
2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)。
3)super:引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数)
4)this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数形参与类中的成员数据同名,这时需用this来指明成员变量名)
5)调用super( )必须写在子类构造方法的第一行,否则编译不通过,每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
6)super()和this()类似区别是:前者从子类调用父类的构造方法,猴子是在同一类内调用其他方法。
7)两个都要放在构造方法内第一行。
8)尽管可以使用this调用一个构造器,但不能调用两个。
9)this和super不能不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其他的构造函数必然会有super语句的存在,所以在同一个构造函数里面会有相同的语句,就失去了语句的意义,编译器也不会通过。
10)两个都指的是对象,所以,均不可以在static环境中使用,包括:static变量、static方法以及static语句块。
11)从本质上,this是一个指向本对象的指针,然而super是一个Java关键字。
 
7、成员变量和局部变量
答:如
class A
{
int a; //成员变量
public static void main(String[ ] args)
{
int b = 1; // 局部变量
}
}
1)局部变量必须初始化;成员变量可以不用初始化,系统自动初始化(被final修饰且没有static的必须显式赋值)。
2)成员变量在类中,局部变量在方法中。
3)成员变量可以被public、protect、private、static等修饰符修饰,而局部变量不能被控制修饰符及static修饰;两者都可以定义成final型的。
4)成员变量存储在堆中,局部变量存储在栈中。
5)存在时间不同。
6)类变量是类中独立于方法之外的变量,用static修饰;实例变量也是类中独立于方法之外的变量,不过没有static修饰;局部变量是类的方法中的变量。
 
8、Java中长度为0的数组与null的区别
int[ ] zero = new int[0];
int[ ] nil = null;

  

1)zero是一个长度为0的数组,我们称之为”空数组“,空数组也是一个对象,只是包含元素个数为0.
2)nil是一个数组类型的空引用。
3)假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对返回数组进一步处理,而如果返回空数组,则无须null应用检查。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样对于函数调用者的处理比较方便。(省去调用API的客户端进行不必要的非null判断。)
 
9、非静态方法(不带static)可以访问静态方法(带static),但反过来不可以,为什么?
答:
1)当new一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆内存中创建对象,所以说敬爱方法会随着类的加载而被加载。
2)当new一个对象时,该对象存在于堆内存中,this关键字一般指该对象,但是如果没有new对象,而是通过类名调用该类的静态方法也可以。
3)程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以直接用类名去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象阐释(创建实例)的时候才会分配内存,然后通过类的对象去访问。
4)在一个类的静态成员中访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存总不存在的东西就会出错。
5)类是在需要调用的时候才被加载。