Java入门初级中级问题及解答
1:什么是注释?注释分为几种?注释有什么作用?
注释就是对代码的解释说明性文字,分为三种:单行注释、多行注释、文档注释。注释可以对程序进行说明,给人看,还可以对程序进行排错。
2:什么是关键字?有什么特点?
关键字就是被java语言赋予了特殊含义的单词。特点就是所有的关键字都是小写。
3:什么是标识符?由哪些部分组成?常见的命名规则有哪些?
标识符就是给类、接口、方法、变量名起的名字。常见的规则有:有数字、字母、_以及$符号组成,不能以数字开头,不能是java中的关键字。
4:什么是常量?常量的分类?字面值常量表现形式有哪些?
在程序的运行过程中其值不发生改变的量。
字面值常量: 1 14
自定义常量: int MAX = 100;
5:什么是变量?变量的定义格式?要使用变量需要注意什么?
在程序运行过程中,其值是可以在某个范围内发生改变的量。
变量其实就是内存中一小块区域。
由3部分组成:
1,数据类型: 限定变量的取值
2,变量名:方便使用。
3,值: 如果没有值就没有意义。
6:Java中的数据类型分几类?基本数据类型有哪些?
基本类型:4类8种。基本数据类型有:
整数(byte,short,int,long)、浮点数(float,double)、字符(char)、布尔(boolean)。
7:算术运算有哪些,各自的作用?
有:+,-,*,/,%,++,--。
+:正号,加法,字符串连接符
%:取得余数
++,--:
单独使用:在操作数据的前后效果一致。
参与操作使用:
在操作数据的前面,是先++或者--,然后参与操作。
在操作数据的后面,是先参与操作,后++或者--。
8:+运算符需要注意的问题?
当把+号作为加法和字符串连接符一起使用的时候,注意把运算的地方()起来。
9:赋值运算符常见的有哪些,各自的作用?
=:把右边的内容赋值给左边
+=,-=,*=,/=,%=:把左边的和右边的操作后赋值给左边。
注意:
+=隐含了强制类型转换。
x+=y;等价与:x = (x的数据类型)(x + y);
10:逻辑运算符有哪些都有什么作用?
&:有false则false
|:有true则true
^:相同为false,不同为true。通过情侣关系来理解。
!:非false则true,非true则false。偶数次不改变以前的真假。
&&:和&的结果一样,但是具有短路效果。左边有false,右边不执行。
||:和|的结果一样,但是具有短路效果。左边有true,右边不执行。
11:位移运算符有什么不同?
要想操作,就必须把所有的数据转换为二进制。然后操作。
<<:把数据向左移动,后边补0。其实相当与乘以2的移动位数次幂。
>>:把数据向右移动,左边补是最高位的值。其实相当与除以2的移动位数次幂。
>>>:把数据向右移动,左边补0。其实相当于除以2的移动位数次幂。
12:什么是函数重载?
函数名相同,参数列表不同,跟返回值不关,就是函数重载。
13:类是什么?类的组成是哪些?
类是抽取了同类对象的共同属性和行为形成的对象或实体的"模版".
类是由成员变量,成员方法,构造函数组成
14:对象是什么?什么时候需要使用对象?
对象是现实世界中实体的描述,是其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所
构成的独立实体.
需要描绘具体事物的时候要使用对象.
15:封装是什么?自己概述
隐藏对象的属性和具体的实现细节,仅对外提供公共的访问方式.
类、方法其实也是封装的体现。
16:继承是什么?自己概述
概念:把多个类中相同的内容抽取出来,单独定义到一个类(父类)中,再定义其他类(子类)的时候,继承父类即可.
好处:1.提高了代码的复用性,降低了代码的重复率.2.提高了代码的维护性3.让类与类之间产生了关系,是多态的前提.
17:匿名对象是什么?应用场景是什么?
匿名对象就是没有名字的对象,由于没有指向,所以效率较高一些。
应用场景:A:调用方法。但是仅仅只限调用一次而已。B:匿名对象用作实际参数传递。
18:构造方法的作用是什么?构造方法的特点是什么?构造方法的注意事项是什么?
构造方法的作用是初始化数据。特点是:名称和类名一致,并且没有返回值类型的修饰和返回值。
注意:如果我们没有给构造方法,系统将给出一个无参构造方法。如果我们给出了构造方法,系统将不再提供构造方法。
19:给成员变量赋值有几种方式?
1,通过set/get方法。
2,通过带参构造。
20:方法重写和方法重载的区别?重载可以改变返回值类型吗?(*面试题)
方法重写:
子类中出现和父类中一模一样的方法声明的方法。
方法重载:
同一个类中,出现方法名相同,参数列表不同的方法。
跟返回值无关。
重载可以改变返回值类型,因为他跟返回值无关。
21:static关键字是什么?有什么特点?什么时候用呢?
static关键字:是静态的意思,可以修饰类中成员变量和成员方法。
静态的特点:随着类的加载而加载、优先与对象而存在、被所有对象所共享、可以通过类名.静态的内容调用。
22:this和super的区别,以及应用场景? (*面试题)
this:当前类的引用对象。谁调用代表谁。
super:父类的存储空间标识。可以理解为父类对象,谁调用代表谁父亲。
应用场景:
A:成员变量
this.成员变量 本类的成员变量
super.成员变量 父类的成员变量
B:构造方法
this(...) 本类的构造方法
super(...) 父类的构造方法
C:成员方法
this.成员方法() 本类的成员方法
super.成员方法() 父类的成员方法
23:代码块是什么?代码块的分类有哪些及每种代码块的作用是什么?
用{}括起来的代码,就叫代码快。
分为:
A:局部代码快: 就是在方法中用{}括起来的代码。作用是限定变量的生命周期,提高效率。
B:构造代码快:在类中,方法外。用{}括起来的代码。作用是把所有构造方法中相同的内容抽取出来,
定义到构造代码块中,将来在调用构造方法的时候,会去自动调用构造代码块。构造代码快优先于构造方法。
C:静态代码快:在类中、方法外。用{}括起来的代码。只不过加了static修饰。
作用是:随着类的加载而加载,而且只加载一次的代码。
24:一个类的实例化过程有哪些步骤?(*面试题)
Student s = new Student(); 在内存中到底执行了哪些步骤。
1,加载Sutdent.class文件进内存(类加载器)
2,在栈内存为 s 变量申请一个空间
3,在堆内存为Student对象申请空间
4,对类中的成员变量进行默认初始化
5,对类中的成员变量进行显示初始化
6,有构造代码块就先执行构造代码块,如果没有,则省略
7,执行构造方法,通过构造方法对对对象数据进行初始化
8,堆内存中的数据初始化完毕,把内存值复制给 s 变量
26:继承是什么?继承的好处是什么?Java中的继承特点是什么?
继承就是:把多个类中相同的内容提取出来,定义到一个类中。
然后让这多个类和这个类产生一个关系,这多个类就具备该类的数据了。
这种关系叫:继承。
继承的好处是:提高代码的复用性,提高了代码的维护性,让类与类之间产生了一个关系,是多态的前提。
继承的特点是:Java中类只能够单继承,但是可以多层继承。
27:方法重写和重载有什么区别?重载可以改变返回值类型吗?(*面试题)
方法重写:子类中出现和父类一模一样的方法声明的方法。
方法重载:同一个类中,出现的方法名相同,参数列表不同的方法。
重载可以改变返回值类型,因为跟返回值无关。
28:子父类中构造方法的执行有什么特点?为什么要这样?
子类构造方法的执行,首先会去执行父类的构造方法。
因为子类中可能直接访问了父类的数据,父类的数据要优先于子类的数据进行初始化。
29:静态代码块,构造代码块,构造方法的执行顺序是什么?
静态代码块 -- 构造代码块 -- 构造方法
30:final关键字是什么,可以修饰什么,有什么特点?
final关键字:是最终意思,可以修饰类、方法、变量。
修饰类:类不可以被继承。
修饰方法:方法不可被重写
修饰变量:变量为常量。
31:多态是什么,前提是什么?
多态:对象在不同时刻表现出来的多种状态。是一种编译时期状态和运行时期状态不一致的现象。
成员变量:编译看左边,运行看左边。
成员方法:编译看左边,运行看右边。因为,普通成员方法可以重写,变量不可以。
静态方法:编译看左边,运行看左边。
前提:类与类之间要有继承关系。要有方法的重写。父类引用指向子类对象。
32:多态的好处及弊端?如何解决多态的弊端。
;
好处:提高了程序的可维护性(前提要有继承保证),和扩展性。
弊端:不能使用子类的特有功能。
33:什么是抽象类?抽象类的特点和好处是什么?
相同的方法,有相同方法的声明,但是方法体不一样,只抽取方法声明的方法,叫做抽象方法,有抽象方法的类,叫做抽象类。
特点:
A:类或者方法必须用abstract修饰。
B:具体类在继承抽象类的时候,要么本身也是抽象类,要么实现抽象类中的所有抽象方法。
C:抽象类不能被实例化。要想使用,必须按照多态的方式使用。
D:成员特点:
a:成员变量
可以是变量,也可以是常量。
b:构造方法
有构造方法,但是不能实例化。
用于子类访问父类数据的初始化。
c:成员方法
可以有抽象方法也可以有非抽象方法。
好处:
A:限定子类必须实现某些功能。
B:提高代码的复用性。
抽象类的几个问题:
A:抽象类不能实例化,构造方法有什么用。
用于子类访问父类数据的初始化。
B:抽象类没有抽象方法,有什么意义?
限制创建对象。
C:abstract不能和哪些关键字共存?
final: 冲突
private: 冲突
static: 无意义
34:什么是接口? 接口的特点?
如果一个抽象类中的方法全部是抽象方法,那么java就针对这种类型的抽象类,给出了一个更抽象的表达式:接口。
特点:
A:所有的方法,都是抽象方法。
B:类实现接口
要么本身是抽象类,要么重写接口中的抽象方法。
C:接口不能被实例化,要想使用,用多态。
D:成员特点
a:成员变量
只有常量,并且是静态常量。默认修饰符:public static final
b:构造方法
没有构造方法,子类数据的初始化默认走的是Ojbect类的构造方法
c:成员方法
全部是抽象的,有默认修饰符:public abstract
35:抽象类和接口的区别? (*面试题)
A:成员区别
抽象类:
成员变量:可以是变量,也可以是常量。
构造方法:有。
成员方法:有,可以是抽象的,也可以是非抽象的。
接口:
成员变量:只能是常量。默认修饰符:publci static final
构造方法:没有,子类数据的初始化默认走的是Ojbect类的构造方法。
成员方法:只能是抽象的,默认修饰符是:public abstract
B:类与接口的关系区别
类与类:
继承关系,单继承。
类与接口:
实现关系,单实现、多实现。
接口与接口:
继承关系,单继承、多继承。
C:设计理念的区别
抽象类被继承体现的是:is a的关系。抽象类中一般定义的是整个继承结构的共性功能。
接口被实现体现的是:like a的关系。接口中一般定义的是整个继承结构的扩展功能。
36,什么是内部类?有什么特点?
把类定义在其他类的内部,就被称为内部类。
内部类的访问特点:
A:内部类可以直接访问外部类的成员,包括私有。
B:外部类要访问内部类的成员,必须创建对象。
37,为什么内部类访问局部变量必须加final修饰?(*面试题)
A: 防止在使用后数据发生改变。
B: 延长变量的生命周期。
38,什么是匿名内部类?本质是什么?
匿名内部类就是没有名字的内部类。
格式:
new 类名或者接口名() {
重写方法;
};
本质:是继承类或者实现接口的子类匿名对象。
39,==和equals()的区别? (*面试题)
A:==
a:基本类型 比较的是基本类型的值
b:引用类型 比较的是引用类型的地址值
B:equals()
只能比较引用类型。
默认比较地址值。
40,什么是字符串?字符串的特点是什么?
字符串:由多个字符组成的一串数据。
特点:一旦被赋值就不能被改变。(*面试题)
注意:这里指的是字符串的内容不能发生改变。而字符串的引用是可以再次赋值的。
41:String s1 = new String("hello");和String s2 = "hello";的区别?(*面试题)
有区别,区别是:前者创建了两个对象,后者创建了一个对象。
42:String、StringBuffer、StringBuilder的区别?(*面试题)
String:字符长度是固定的。
StringBuffer/StringBuilder:字符长度是可变的。
StringBuffer:安全的,但效率较低一些。
StringBuilder:不安全的,但效率较高一些。
StringBuffer和StringBuilder兼容。
43:什么是基本数据包装类?
为了对基本类型的数据进行更多的操作的,java就针对每种基本类型的数据提供了对应的包装类类型。
对应的类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
44:什么是正则表达式?
正则表达式就是符合一定规则的字符串。
45:集合和数组有什么区别?(*面试题)
集合:
长度可以发生改变。
只能存储对象类型,引用类型。
可以存储任意类型的对象。
数组:
长度固定。
可以存储基本类型,也可以存储引用数据类型。
只能存储同一种类型的元素。
46:集合有多少种? 各自的特点是什么?
Collection
|--List 有序(存入和取出的顺序一致),元素可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
|--Set 无序的 元素唯一
|--HashSet
|--TreeSet
47:泛型是什么?有什么用?在哪里用?泛型有什么好处和弊端?
泛型是一种把明确数据类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的数据类型。
能优化程序设计,解决了黄色警告线问题。
把运行时期的异常提前到了编译时间。
避免了强制类型转换。
好处:
优化了程序的设计,解决了黄色警告线的问题。
把运行时期的问题提前到了编译时期间解决了。
避免了强制类型转换。
弊端:让类型统一了,不能存储不同的数据类型了。
48:用迭代器遍历集合的时候,用集合修改集合有没有问题?如果有,怎么解决?(*面试题)
有问题,因为会出现并发修改异常。
解决方法有多种,比如,我们可以不通过集合来修改集合,而使用迭代器来修改集合。
像ListIterator迭代器就有添加方法。
49、HashSet如何保证元素唯一性的呢?
底层数据结构是哈希表(散列表)。具体的是由一个元素是单向链表的数组组成。
它依赖于两个方法:hashCode()和equals()方法。
执行顺序:
先判断hashCode()是否相同,
如果相同
继承执行equals()方法,看其返回值:
true:元素重复,不存储。
false:元素不重复,存储。
如果不同
存储。
记住:
看到HashXxx结构的集合,就要知道,被该集合存储的元素要重写hashCode()和equals()方法。
而且,是自动生成的。
50、TreeSet底层数据结构是什么?如何保证元素的唯一性的呢?
底层数据结构是二叉树。
根据比较的返回值是否是0来决定。
如何保证元素的排序的呢?
A:自然排序 元素具备比较性
让集合中被存储的元素所属的类实现Comparable接口。
B:比较器排序 集合具备比较性
在创建集合对象的时候,让构造方法接收一个Comparator接口的子类对象。
自然排序和比较器排序的区别:
TreeSet构造函数什么都不传, 默认按照Comparable(接口,compareTo(T))的顺序(没有实现Comparable就报错ClassCastException)
TreeSet如果传入Comparator(接口compare(T1,T2)), 就优先按照Comparator
51、LinkedHashSet底层数据结构是什么?如何保证元素的唯一性的呢?
底层由链表和哈希表组成。
由链表保证有序。
由哈希表保证唯一。
52、什么是可变参数?
针对在写一个方法的时候,不知道具体要有多少个形式参数的时候。
java提供了可变参数的用法。
注意:
A:变量其实是该数据类型的一个数组。
B:形式参数如果有多个的话,可变参数只能是最后一个。
C:数据类型要一致。
53、Map和Collection集合的区别?(*面试题)
A:Map集合存储的是键值对形式的元素。
Collection集合存储的是单个的元素。
B:Map集合的键是唯一的。
Collection的子接口Set集合元素是唯一的。
C:Map集合的值是可以重复的。
Collection的子接口List集合的元素是可以重复的。
D:Map集合的数据结构仅对键有效,对值无效.
Collection的数据结构是针对元素有效的
54、Hashtable和HashMap的区别?(面试题)
A:HashMap 线程不安全,效率高。允许null键和null值。
B:Hashtable 线程安全,效率低。不允许null键和null值。
55、Collection和Collections有什么区别?
Collection:是集合的顶层接口,定义了集合的通用方法。
Collections:是一个工具类,里面定义了对集合进行操作的一些常见方法。
56、什么是异常?异常有哪几种?各有什么特点?
程序出现了不正常的情况,就是异常。
异常的继承体系结构:
Throwable
|--Error 严重的问题,一般我们解决不了。
|--Exception
|--RuntimeException 运行时期异常,这种问题一般要修正代码。
|--非RuntimeException 编译时期异常,必须进行处理,否则代码不能够通过。
57、throws和throw的区别? (*面试题)
throws
位置:在方法()后面,跟的是类名,后面可以跟多个异常类名,并且用逗号隔开
表示抛出异常,交给调用者去处理
如果后面根据的是RuntimeException及其子类,那么,该方法可以不用处理。
如果后面根据的是Exception及其子类,那么,必须要编写代码进行处理,或者调用的时候抛出。
throw
位置:在方法中,跟的对象名称。后面只能跟一个异常对象
表示抛出异常,由方法体内语句处理
如果方法中,有throw抛出RuntimeException及其子类,那么,声明上可以没有throws。
如果方法中,有throw抛出Exception及其子类,那么,声明上必须有throws。
58、final、finally、finalize的区别?(*面试题)
final:是最终的意思,用于修饰类、变量、和方法。修饰类的时候,类是最终类,不可以被继承。
修饰变量的时候,变量为常量,不可以被改变。修饰方法的时候,方法不能被重写。
finally:是异常处理的一部分,它里面的代码永远会执行(前提:jvm没退出),一般用于释放资源。
finalize:是object类的一个方法,用于垃圾处理。
59、什么是递归?使用递归需要注意哪些?
递归就是方法定义中调用方法本身的现象。
A:递归一定要有出口,否则就是死递归。
B:递归的次数不能太多,否则内存溢出。
C:构造方法不能递归使用。
60、基本的IO流有哪些?(*面试题)
字节流:InputStream、OutputStream、FileInputStream、FileOutputStream、
字符流:Writer、Reader、FileWriter、FileReader、
高效字节流:BufferedInputStream、BufferedOutputStream
高效字符流:BufferedWriter、BufferedReader
最开始的时候,只有字节流,但是后来由于中文字符或者其他字符的出现,用两个字节才能表示。
如果用字节流也是可以读写字符文件的数据的,但是比较麻烦。为了简化这种操作,就提供了字符流。
61、flush()和close()的区别?(*面试题)
flush():刷新缓冲区,流对象还可以继续使用。
close():释放流资源,但是会先刷新一次缓冲区,操作完毕后,流对象不可以再使用。
62、什么是多线程?进程和线程的区别是什么?
多线程就是应用程序的多条执行路径。
进程:正在运行的应用程序,每个进程的具备独立的运行空间。
线程:是进程的执行单元,执行路径。如果是多个线程,那么,这多个线程共享同一个进程资源。
63、启动线程调用的是run()还是start()方法?run()和start()的区别是什么?(*面试题)
启动线程调用的是start()
run()封装了被线程执行的代码,start()是启动线程并调用run()方法。
64、多线程有几种实现方案?分别是什么?如何操作?(*面试题)
多线程有两种实现,分别是:
1,继承Thread类
自定义类继承Thread类,在类中重写run()方法,测试类中创建自定义类对象,并调用start()方法
2,实现Runnable接口
自定义类实现Runnable接口,重写run()方法,测试类中创建自定义对象,
创建Thread对象,把自定义对象作为构造参数传递。调用Thread类的start()方法。
65、线程的生命周期? (*面试题)
新建: 创建线程对象
就绪: 具备cup执行资格,没有执行权,随时准备执行
运行: 具备执行资格,执行权,执行run()中的代码
堵塞: 是当线程运行到符合某个我们定义的条件时,它会停止下来等待唤醒
死亡: run()结束了
66、多线程为什么会出现安全问题?怎么解决呢?(*面试题)
如果满足以下条件,那么就会出现安全问题:
A:是多线程程序。
B:有共享的数据。
C:针对共享数据有多条语句操作。
只要我们把多线程环境中,把操作共享数据的操作,变成单线程就没有问题了。
Java针对这种情况,就提供了同步技术:
A:同步代码块
B:同步方法
C:JDK5以后的Lock锁
67、同步的锁对象分别是?(*面试题)
代码块:任意对象
方法:this
静态方法:类名.class
68、sleep()和wait()的区别?(*面试题)
sleep():必须指定时间,不释放锁对象。
wait():可以指定时间,也可以不指定。释放锁对象。
69、线程死锁是什么,为什么有死锁,怎么解决死锁?(*面试题)
为了解决程序因占用资源,出现资源争抢,而出现的程序进入等待的状态(死锁)。
举例:有A和B两个线程,有CD 两把锁, A和B嵌套CD锁,A线程中有C,D锁,B线程中有D C两把锁,当两个线程运行时,就可能会出现死锁导致
程序停滞的情况。
怎么解决:真正意义上来说,死锁是不能被解决的,死锁是多线程中的一个需要避免的重大的问题,当我们在编写程序时,可以给共享的资源加上另外一
个把锁,控制资源的动态,同时可以设置线程的优先级使线程之间协调合理的利用CPU的时间。
70、线程间的通信是什么?
不同种类的线程针对同一个资源的操作。
71、什么是网络编程?
用编程语言来实现计算机的资源共享和信息传递,就叫做网络编程。
72、网络通信三要素是什么? (*面试题)
A:IP地址
计算机在网络中的唯一标识。
现在使用的是:"点分十进制"
B:端口
应用程序的的标记。
C:协议
通信的规则。
73、UDP和TCP的区别? (*面试题)
UDP:不建立连接,数据打包传输,数据有限制,数据不可靠,速度快。
TCP:建立连接,数据无限制,数据可靠,速度慢。
74、反射是什么?反射获取字节码文件的三种方式?反射的好处?(*面试题)
在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。就是反射。
3种方法:
A.用Object类的getClass方法得到。
B.用任意数据类型的静态class属性可以得到
C.用Class类的静态方法forName(String className)方法得到
好处:只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法。包括私有的。