java面试题
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? |
---|
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。 |
Java有没有goto? |
---|
只作为java中的保留字,但java版本中没有用到. |
new关键词一共做三件事: |
---|
第一件事: 在堆内存中开辟地址 开空间. 第二件事: 给当前开出来的空间中的成员变量赋初始值 赋初值. 第三件事: 将当前的堆空间的地址赋值给一个局部变量 指向引用. |
说说&和&&的区别。 |
---|
1、&和&&都可以用作逻辑与的运算符,表示逻辑,当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 2、&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。 |
在JAVA中如何跳出当前的多重嵌套循环? |
---|
1.标号方式 在java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的的break语句,即可跳出 2.条件控制 外层的循环条件表达式的结果可以收到里层循环体代码的控制 3.抛出异常. |
switch语句能否作用在byte上,能否作用在long上,能否作用在String上? |
---|
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。 |
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? |
---|
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。 对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。 |
i++和+ +i的区别? |
---|
1: i++:是先运算再自增1. 2: ++i:是先自增1再运算. 3: 如果i++和++i是独立的一条语句,两者没有区别. |
char型变量中能不能存贮一个中文汉字?为什么? |
---|
java采用unicode编码,2个字节(16位)来表示一个字符, 无论是汉字还是数字,字母,或其他语言都可以存储。 2.char 在java中是2个字节,所以可以存储中文。 |
用最有效率的方法算出2乘以8等於几? |
---|
2 << 3, 因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。 |
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? |
---|
只是引用不能变,但是引用所指向的对象是可以变化的。 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。 |
"=="和equals方法究竟有什么区别? |
---|
==是比较运算符 equals是Object的方法 在Object中的equals()比较的都是地址作用相同 在有些类中作用不同就是因为这些类中重写了equals方法 作用: 1.基本类型,比较的是值是否相等. 2.引用类型,比较内存地址是否相等 3.不能比较没有父子关系的两个对象 equals()方法的作用: 1.JDK中的类一般已经重写了equals(),比较的是内容 2.自定义类如果没有重写equals(),将调用父类(默认Object类)的equals方法,Object的 equals()比较使用了thisobj 3.可以按照需求逻辑,重写对象的equals()方法(重写equals方法,一般重写hashCode方法) |
静态变量和实例变量的区别? |
---|
静态变量:被static修饰的变量 实例变量:没有被static修饰的变量 相同:都是成员变量 不同: 1.修饰符不同,是否被static修饰. 2.静态变量是属于类的:不但可以被对象调用,还可以被类直接调用. 3.静态变量是所有类的对象共享一个,实例变量是每个对象都拥有属于自己的实例变量. 4.加载的时间不同,静态变量在类加载时加载,实例变量在对象创建时才加载. |
是否可以从一个static方法内部发出对非static方法的调用? |
---|
不能,加载的时间不同,实例方法必须在实例化后加载. |
break return continue之间的区别? |
---|
continue:用于结束本次循环,跳到循环开头继续执行下一次循环。 break:用于结束并跳出当前所在循环。 return:用于结束当前所在方法.如果方法的返回值类型不为void.返回一个值。 |
Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型? |
---|
1. 重载方法参数列表必须不同,而重写方法参数列表必须相同。 2.重载方法发生在同一个类中,而重写方法发生在子类的继承或接口的实现类中。 3.重载方法与返回值无关,而重写方法的返回值必须是当前类类型或子类类型或接口的实现类类型。 4. 私有方法可以重载但不能重写。 重写方法可以改变返回值类型,是其子类或该接口的实现类。 |
Integer与int的区别 |
---|
相同点: 都代表整型变量,可以通过自动装箱和自动拆箱,互相转换. 不同点: 1.类型不同.int是基本数据类型,integer是引用数据类型. 2.默认值不同.integer类型的成员变量默认值为null,int默认值为0. 3.占内存不同,int固定占用4个字节.integer因为有方法和属性所占内存要大. |
Math.round(11.5)等於多少? Math.round(-11.5)等於多少? |
---|
12 和 -11 |
下面的代码有什么不妥之处? 1. if(username.equals(“zxx”){} 2. int x = 1; return x==1?true:false; |
---|
1.这种情况用"zxx".equals(username),比较好,这样的话当username的值为null时,不会抛出空指针异常. 2.直接 return x==1;即可 |
请说出作用域public,private,protected,以及不写时的区别 |
---|
public:当前类、同一包中、子孙类、其他包 都可使用 protected:当前类、同一包中、子孙类 可使用,但其他package不能访问 默认:当前类、同一包中 可使用,子孙类、其他package都不能访问 private:仅当前类中可使用. |
对面向对象的理解? |
---|
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节. 面向对象有三大特征:封装性、继承性、多态性,其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。对于继承性,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。多态是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性. |
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? |
---|
Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。通过参数个数和类型的不同判断该调用哪个方法 重载的概念是: 方法名相同,参数个数,次序,类型不同. 因此是否重载对返回值没有要求,可以相同,也可以不同. 如果参数的个数,类型,次序都相同,方法名也相同,仅返回值不同,刚无法构成重载.这种情况下编译器会直接报错. 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。在重写时要注意下面几点: 1、覆盖的方法的方法名必须要和被覆盖 |