下面是10道java基础面试题,后附答案
1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
2.“static”关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是static 的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。
3.JDK 和 JRE 的区别是什么?
Java 运行时环境(JRE)是将要执行 Java 程序的 Java 虚拟机。它同时也包含了执行 applet 需要的浏览器插件。Java 开发工具包 (JDK)是完整的 Java 软件开发包,包含了 JRE,编译器和其他的工具(比如:JavaDoc,Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。
4.是否可以在 static 环境中访问非 static 变量?
static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
5.Java 支持的数据类型有哪些?什么是自动拆装箱?
Java 语言支持的 8 中基本数据类型是:
byte
short
int
long
float
double
boolean
char
自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把 int 转化成 Integer,double 转化成 double,等等。反之就是自动拆箱。
6.Java 支持多继承么?
不支持,Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
7.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。
Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java 不会创建默认的复制构造函数。
8.Java 中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
9.接口和抽象类的区别是什么?
Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private, protected 或者是 public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
10.什么是值传递和引用传递?
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
最后祝你面试顺利!
一、问答题1、Java语言的数据类型有哪些?8
答:有byte(字节型)、char(字符型)、boolean(布尔型)、short(短整型)、int(整型)、long(长整型)、
浮点型:float(单精度)、double(双精度)。
2、写出算术运算符、关系运算符、逻辑运算符各自包含的运算符,写出条件运算符的形式,并简述其执行过程。10
答:
算术运算符:++、--、+、-、*、/、%
关系运算符:!=、>=、<=、>、<、==
逻辑运算符:!(逻辑非)、&&(逻辑与)、||(逻辑或)
条件运算符的形式:表达式1?表达式2:表达式3;3、数组有怎样的特征?写出一维数组两种初始化的语法格式(可使用具体的实例)。10
答:数组特征:数组有若干个元素;
各元素有相同的数据类型;
按一定的顺序排列;
一维数组两种初始化的语法格式:
int a[]=new int[2]
a[0]=1
a[1]=2
或int a[]
a[]=new int[2]
a[0]=1
a[1]=2int a[]={1,2}
4、比较顺序表、栈、队列的异同点,分别写出冒泡法排序的主要特点。12
答:都运用数组的知识,都运用了方法调用;
栈的特点是:
冒泡法排序的主要特点:
经过多轮循环,每一轮循环从最后一个元素依次与前面的元素比较大小,最终找到的最小元素排在第一位,第一轮循环终止;再依次进行下一轮循环。
二、编程题
1、规定一个工人工作时间一月160小时,每小时工资5元,加班的话,每小时增加4元,请编程计算此工人一个月的工资,工作时间由键盘输入。15
import jaimport java.io.*
pubic class Qgrgz
{
public static void main(String[] args)throws IOException
{int x,result<br> InputStreamReader ir<br> BufferedReader in<br> ir=new InputStreamReader(System.in)<br> in=new BufferedReader(ir)<br> System.out.println("Shurugongrengongzuoshijian:")<br> String s=in.readLine()<br>x=Integer.parseInt(s)<br>if(0<x&&x<=160)<br>result=x*5<br>else<br> result=(160*5+(x-160)*9)<br>System.out.println("gongrenyuegongziwei:"+result)<br> }
}2、编程求解1—100中是7的倍数的数值的和。15
public class Qh
{
public static void main(String[] args)
{
int sum=0
int i=1
while(i<100)
{
if(i%7==0)
sum +=i
i++
}
System.out.println("sum="+sum)
}
}
3、输入3名学生4门课程的成绩,分别统计每个学生4门课程的平均成绩。15
import java.io.*
public class Pjf
{
public static void main(String[] args)throws IOException
{
InputStreamReader ir
BufferedReader in
ir=new InputStreamReader(System.in)
in=new BufferedReader(ir)
for(int i=1i<=3i++)
{
double v=0,sum=0
for(int j=1j<=4j++)
{
System.out.print("请输入第"+i+"个学生第"+j+"科成绩:")
String a=in.readLine()
int x=Integer.parseInt(a)
sum=sum+x
}
v=sum/4
System.out.println("总分是:"+sum)
System.out.println("平均分是:"+v)
}
}
}
4、运用方法调用求一维数组中的最大元素及下标,在main方法中输入数组元素。15
import java.io.*
public class Qszzdys
{ int a[]=new int[10]
public static void main(String[] args)throws IOException
{
int i
Qszzdys b=new Qszzdys()
InputStreamReader ir
BufferedReader in
ir=new InputStreamReader(System.in)
in=new BufferedReader(ir)
for(i=0i<10i++)
{
System.out.println("请输入a["+i+"]:")
String s=in.readLine()
b.a[i]=Integer.parseInt(s)
}
b.d()
}
void d()
{
int max,x=0
max=a[0]
for(int j=1j<10j++)
if(a[j]>max)
{
max=a[j]
x=j
}
System.out.println("最大值是:"+max+"下标是:"+x)
}
}
5、运用选择法对23,45,34,78,99,12,50,0这组数进行升序排列。(选做题,做了加分,没做不减分)15
public class Paixu
{
int [] a
int len
void f(int maxSize)
{
a=new int[maxSize]
len=0
}
void b(int value)
{
a[len]=value
len++
}
void display()
{
for(int i=0i<leni++)
{
System.out.print(a[i]+" ")
}
System.out.println()
}
void ff()
{
int out,in,min
for(out=0out<len-1out++)
{
min=out
for(in=out+1in<lenin++)
if(a[in]<a[min])
min=in
swap(out,min)
}
}
void swap(int one,int two)
{
int temp=a[one]
a[one]=a[two]
a[two]=temp
}
public static void main(String[] args)
{
Paixu paixu=new Paixu()
int maxSize=100
paixu.f(maxSize)
paixu.b(23)
paixu.b(45)
paixu.b(34)
paixu.b(78)
paixu.b(99)
paixu.b(12)
paixu.b(50)
paixu.b(0)
System.out.println("排序前:")
paixu.display()
paixu.ff()
System.out.println("排序后:")
paixu.display()
}
}