JavaOOP面试题02
21、String 是最基本的数据类型吗?
不是。Java 中的基本数据类型只有 8 个:byte、short、int、long、float、double、 char、
boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type),Java 5 以后引
入的枚举类型也算是一种比较特殊的引用类型。
22、float f=3.4;是否正确?
答:不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于 下转型(down-
casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f =(float)3.4; 或者写成 float f
=3.4F;。
23、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1; 有错吗?
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型
才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确 编译,因为 s1+= 1;相当于 s1 = (short)(s1 +
1);其中有隐含的强制类型转换。
24、重载和重写的区别
重写**(Override)**
从字面上看,重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类
原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
(简单说,就是两同两小一大原则,方法名和参数类型相同,但子类的返回值和抛出的异常小于或等于父类抛出的异常,子类的方法访问权限大于父类方法的访问权限)
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by son");
}
}
虽然son继承了Father类的sayHello方法,但son子类重写了Father的sayHello方法,所以在调用的时候,还是会调用son子类的sayHello方法,所以上述程序输出的结果是hello by son
重写 总结:
(一句话,就是两同,两小,一大)具体如下:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)
则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来
判断重载。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
重载总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回类型别作为重载函数的区分标准
25、equals与==的区别
==:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
- 比较的是操作符两端的操作数是否是同一个对象。
- 两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
- == 比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如: ==
== int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。 ==
equals:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
总结:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
equals用来比较的是两个对象的内容是否相等
注意:用equals 并且在对常量相比较时,把常量写在前面,因为使用object的equals方法时,object可能为null,则会抛出空指针的错误。
36、++i与i++的区别
i++:先赋值,后计算 ++i:先计算,后赋值
37、程序的结构有那些?
顺序结构
选择结构
循环结构
38、数组实例化有几种方式?
静态实例化:创建数组的时候已经指定数组中的元素int [] a= new int[]{ 1 , 3 , 3}
动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值
39、Java中各种数据默认值
Byte,short,int,long默认是都是0
Boolean默认值是false
Char类型的默认值是\u0000
Float与double类型的默认是0.0
对象类型的默认值是null
40、Java常用包有那些?
Java.lang
Java.io
Java.sql
Java.util
Java.awt
Java.net
Java.math
41、Object类常用方法有那些?
Equals
Hashcode
toString
wait
notify
clone
getClass