Java基础面试题(上篇)

Java基础面试题(上篇)

1、short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1; 有错吗?

对于short s1=1;s1=s1+1:由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。

而shorts1=1;s1 +=1;+=操作符会进行隐式自动类型转换,是Java 语言规定的运算符:Java编译器会对它进行特殊处理,因此可以正确编译。因为s1+=1;相当于s1=(short)(s1 +1),可以正确编译。

2、重载和重写的区别

1)重写(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 ");
}
}

重写总结:

  • 发生在父类与子类之间
  • 方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
  • 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
  • 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
  • 构造方法无法被重写
  • 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

2)重载(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);
}
}

重载总结:

  • 重载Overload是一个类中多态性的一种表现
  • 重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
  • 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

3、数组实例化有几种方式?

静态实例化:创建数组的时候已经指定数组中的元素

int [] a= new int[]{ 1 , 3 , 3};

动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值

4、Java 中各种数据默认值

Byte,short,int,long默认是都是0

Boolean默认值是false

Char类型的默认值是''(为空)

Float与double类型的默认是0.0

对象类型的默认值是null

5、Object类常用方法有那些?

equals 、hashcode 、toString 、wait 、notify 、clone 、getClass

6、java中是值传递引用传递?

理论上说,java都是引用传递,对于基本数据类型,传递是值的副本,而不是值本身。对于对象类型,传递是对象的引用,当在一个方法操作操作参数的时候,其实操作的是引用所指向的对象。

7、形参与实参区别

实参(argument):

全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

形参(parameter):

全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用

形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送

1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。

2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。

4)函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

5)当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变

8、构造方法能不能重写?能不能重载?

可以重载,但不能重写

9、内部类与静态内部类的区别?

静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法;

普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。

如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。

如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性。

如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。

10、Static 关键字有什么作用?

Static可以修饰内部类、方法、变量、代码块。

Static修饰的类是静态内部类。

Static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象的,静态方法也不能被重写,可以直接使用类名来调用。在static方法中不能使用this或者super关键字。

Static修饰变量是静态变量或者叫类变量,静态变量被所有实例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,在JVM加载类的时候,只为静态分配一次内存。

Static修饰的代码块叫静态代码块,通常用来做程序优化的。静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。

11、final 在 java 中的作用,有哪些用法?

final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法

特征:凡是引用final关键字的地方皆不可修改!

  • 修饰类:表示该类不能被继承;
  • 修饰方法:表示方法不能被重写;
  • 修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

被final修饰的方法,JVM会尝试将其内联,以提高运行效率。

被final修饰的常量,在编译阶段会存入常量池中。

除此之外,编译器对final域要遵守的两个重排序规则更好:

  • 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序;
  • 初次读一个包含final域的对象的引用,与随后初次读这个fifififinal域,这两个操作之间不能重排序。

12、String str=”aaa”,与 String str=new String(“aaa”)一样吗?

不一样,String str="aaa"是存储在方法区的常量区,而且"aaa"在常量区只有一份,所以如果是String str1="aaa",String str2="aaa"。。。String strN="aaa",str1、str2。。。strN都是相等的,但如果是new一个String对象,结果就会有所不同,此时在堆区会有一个对象被创建。使用new创建字符串时,会在堆区(heap)创建一个对象,它会引用常量区的一个字符串,所以,String str="aaa"和String str=new String(“aaa”)不同。

13、讲下 java 中的 math 类有那些常用方法?

Pow():幂运算

Sqrt():平方根

Round():四舍五入

Abs():求绝对值

Random():生成一个0-1的随机数,包括0不包括1

14、Char 类型能不能转成 int 类型?能不能转化成 string 类型,能不能转成 double 类型?

Char在java中也是比较特殊的类型,它的int值从1开始,一共有2的16次方个数据。

Char<int<long<flfloat<double;Char类型可以隐式转成int,double类型,但是不能隐式转换成string。

15、什么是拆装箱?

装箱就是自动将基本数据类型转换为包装器类型(int-->Integer)。调用方法:Integer的valueOf(int)方法

拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的intValue方法

在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:

Integer i = new Integer(10);

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:

Integer i = 10;

16、Java 中的包装类都是那些?

byte:Byte,short:Short,int:Integer,long:Long,flfloat:Float,double:Double,char:Character ,boolean:Boolean

17、一个 java 类中包含那些内容?

属性、方法、内部类、构造方法、代码块。

18、针对浮点型数据运算出现的误差的问题,你怎么解决?

使用Bigdecimal类进行浮点型数据的运算

19、面向对象的特征有哪些方面?

面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。

1)抽象

抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

  • 数据抽象 -->鸟有翅膀,羽毛等(类的属性)
  • 行为抽象 -->鸟会飞,会叫(类的方法)

2)封装

把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。

3)继承

子类继承父类的特征和行为。子类可以有父类的方法,属性(非private)。子类也可以对父类进行扩展,也可以重写父类的方法。缺点就是提高代码之间的耦合性。

4)多态

发表评论

相关文章