java基础刷题遇到的最常见问题
可以先看一下这位博主整理的java面试题(很详细,我看了好几遍了):https://blog.csdn.net/ThinkWon/article/details/104390612
java基础知识https://blog.csdn.net/weixin_43304253/article/details/119386696
你以为你掌握基础吗?真的掌握了吗?真真真的掌握了吗?做几道题就知道有多虐心了,一个知识点变着发的搞你心态。还有很很很重要的一点,只要牵涉的知识稍微深一点,都离不开JVM知识。
建议先看一下jvm的视屏再看,整理的时候主要是内存结构图以及重要的知识。很多细节忽略了。对待刚接触jvm的不太友好。
JVM内存图:https://blog.csdn.net/weixin_43304253/article/details/119609324
1、
解析:
Java标识符命名规则:
1 由26个大小写的英文字母"A-Z",“a-z”;数字"0-9",下划线"_" 和
美元符号"$"四部分组成;
2 标识符以字母或下划线"_“或”
"
开
头
;
注
:
尽
管
"
"开头; 注:尽管"
"开头;注:尽管""是一个合法的Java字符,但尽量不要在代码中使用这个字符,
它一般用在Java编译器或其他工具生成的名字中;
3 标识符不能是关键字,如:public,protected,…
以及两个保留的 关键字const和goto;
4 标识符区分大小写。
A 中不能以数字开头;
B 中不能以& 开头(不是$);
C 中是保留的关键字;
sizeof:是C/C++的方法
保留字:const goto
显示常量值:true 、false、null
关键字:
2、
抽象类:
1、关键字abstract class
2、子类extends继承抽象类,只能单继承
3、成员变量权限四个public 、protected、default、private
【public 范围最大、protected 可以在包以外的子类、default默认修饰符只能在同一个包下、private只能在当前类。(经常问这个)】
4、抽象方法权限只有public、protected、和default三种。
5、可以包含静态代码块,静态方法
6、可以有普通方法
7、继承者如果是全部继承抽象方法就不再是抽象类,否则任然是抽象类
接口
1、关键字interface
2、子类implements实现接口,实现多个接口
3、不能有构造器
4、成员变量权限默认都是public static final ,接口中声明的变量都是常量不能被继承
5、方法默认权限public abstract
6、不可以有静态代码块,可以有静态方法
7、没有普通方法
8、下一代只能实现
接口方法的增加随着版本的更新改变
jdk1.7,接口中只包含抽象方法,使用public abstract修饰
jdk1.8(不包括)之前:接口中不能有静态方法
jdk1.8(包括哦)1.8之后:接口中可以定义静态方法。
在jdk1.8,接口中加入了默认方法(default修饰,接口的实现类,直接调用或者重写该方法)、静态方法(static修饰,通过接口调用)
在jdk1.9中,接口中加入了私有方法,使用private修饰,私有方法供接口内的默认方法使用
3、
解析:
1、String中的equal比较的是两个字符串的内容是否相等。(这里的equals重写了Object中的equals)
2、Object中的equals和==相等。比较的都是引用地址
String a=“a”;//存储在方法区中的常量池
String b=“a”;//常量池中a的引用给b
只要是new 就会在堆中开辟新的内存空间
4、
解析:
运行过程:当程序执行到try{}语句中的return方法,将返回的结果存储到一个临时栈,程序不会立即返回,而是执行finally{}中的程序,覆盖了a的值,不会去更新临时栈中的那个要返回的值。
如果finally{}里边也有一个return 执行这个return的时候,就会更新临时栈的值。
结论:
1、不管有没有异常,finally块里边的代码都会执行(也有不执行的时候,不要钻牛角尖)
2、当try{}和catch{}中都有return时,仍然会执行finally{}
3、finally{}中包含return,会让程序提前退出,返回值不再是try{}或catch{}中保存的值
巧记:任何执行try或者return语句之前,都会执行finally语句,如果finally存在,如果finally语句包含return语句。程序就return了。finally中的return一定会被return
5、
详细区分(包含代码):https://blog.csdn.net/weixin_43304253/article/details/119418766
6、
解析:
首先明白一点:
类方法是属于整个类的,不是每个实例所独有的。用static修饰
实例方法是属于类的某个对象的。
类方法在初始化阶段就已经加载到方法区中。对象后来在堆中创建。一个已经存在的怎么可能使用未创建出来的。
-
类方法中不能引用对象变量
-
类方法中不能调用类的对象方法
-
类方法中不能使用super、this关键字
-
类方法不能被覆盖
-
对象方法可以引用对象变量,也可以引用类变量
-
对象方法中可以调用类方法
-
对象方法中可以使用super、this关键字。
this关键字的用法
- 1、普通的直接引用,相当于当前对象本身
- 2、形参与成员名字相同,区分
- 3、引用本类的构造函数(需要放在构造函数的第一行)
super关键字的用法
- 1、普通的直接引用(引用父类)(相当于指向当前对象的父类的引用)
- 2、子类中的成员变量或者方法与父类的成员变量或者方法重名时,区分
- 3、 引用父类的构造函数(放在子类构造函数的第一行)
如果子类重写父类的方法,在new出一个父类对象的子类引用。调用的方法是子类重写的方法,若要调用父类的重名方法需要使用super。
7、
解析:
首先是类初始化、然后是对象初始化
跟我一起来读=======
父类静态代码块—>子类静态代码块–>父类非静态代码块–>父类构造函数–>子类非静态代码块–>子类的构造方法
8、
static方法中时不能访问非静态变量a的,需要将a声明为static,答案才是0.
静态方法在初始化阶段就已经初始化,怎么可能调用未初始的变量。
9、
数据类型:1、基本数据类型(数值型(整数型、浮点型)、字符型、布尔型)。2、引用数据类型(类、接口、数组、String)
10、
重写(覆盖)
两同两小一大
两同:方法名和参数列表相同
两小:重写方法的返回值和抛出的异常小
一大:重写方法的访问修饰符大于等于被重写的访问修饰符。
-
1、方法运行的时候(子类没有重写父类的方法,子类的实例会向上寻找父类的同名方法)
-
2、重写只发生在可见的实例方法中【1、静态方法不存在重写,形式上的重写只能是隐藏。2、私有方法也不能重写,子类就算定义了,也相当于一个新的方法。3、静态方法和实例方法不存在相互重写】
-
修饰符:可以扩大不能缩小。父类是public 子类不能是private
-
抛出的异常可以缩小。父类的异常范围比子类的异常范围大
重载【方法名相同、参数列表不同】
- 方法名相同
- 参数列表不同(个数不同或类型不同、参数排列顺序)
- 方法的返回值类型可相同也可以不同
11、
解析:
String对象的两种创建方式:
- 1、String str1=“aaa”;在常量池中获取对象,编译时期会在常量池中创建一个字符串对象
- 2、String srr2=new String(“aaa”);一共会创建两个字符串对象,一个在堆中,一个在常量池中(前提是常量池还没有"aaa"字符串对象)
String类型的常量池比较特殊
直接使用双引号声明出来的String对象会直接存储在常量池中。
如果不是双引号声明的String对象,可以使用String提供的intern方法,String.intern()是一个Native方法,作用:如果运行时常量池中已经包含一个等于次String内容的字符串,则返回常量池中该字符的引用;如果没有,则在常量池中创建与此String内容相同的字符串,并返回常量池中创建的字符串的引用
12、
JVM中的方法区:https://blog.csdn.net/weixin_43304253/article/details/119645888
13、
- synchronized:具有原子性,有序性、可见性
- volatile:具有有序性和可见性
14、
解析:
java语言是静态多分配,动态单分配的
如果是方法重载选择,使用静态类型
如果是父子之间的方法重写,使用动态类型。
入 A a=new B(); 类型B去查找重写的方法。类型A去查找重载的方法。