面试基础问题总结(一)
面试基础问题
1、静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
2、构造方法的主要作用是完成对类的对象的初始化工作。
3、构造方法本身并没有返回值。
4、一般在创建(new)新对象时,系统会自动调用构造方法。
5、构造方法的特点:
- 构造方法的方法名与类名相同
- 构造方法没有返回值类型,也不写void
- 构造方法可以重载
6、什么时候会用到构造方法:在创建对象的时候
7、构造方法的作用:创建对象的时候给属性赋初值
8、构造方法的分类:显示的构造方法和隐式地构造方法
- 显示的构造方法:显示的写出构造方法时,系统不会提供默认的无参构造方法
- 隐式地构造方法:系统默认提供的无参构造方法
9、代码块:
- 静态代码块:static修饰的代码块,在类加载时执行,且只执行一次。因为类就加载一次了。
- 实例代码块:没有static修饰的代码块,创建对象时执行,每创建一次对象加载一次。
- 实例代码块在执行构造方法之前执行。所以优先级高于构造方法。
10、Java程序初始化顺序(类加载顺序):
父类静态变量,父类静态代码块(只执行一次),子类静态变量,子类静态代码块(只执行一次),父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数
11、重载: 方法名相同,参数列表不同,与返回值无关
重写: 发生在不同类中,两者要有继承关系,重写的方法名和参数列表要完全一致,重写的意义在于父类的方法已经不能满足时,子类重写为自己需要的。
12、序列化机制使得对象可以脱离程序的运行而独立存在。
序列化后是保存当前对象的状态,而static修饰的变量并不会被实例化,所以不会被保存当反编译后任然是返回原本static修饰时的值
13、关于抽象类:
- JDK 1.8以前,抽象类的方法默认访问权限为protected
- JDK 1.8时,抽象类的方法默认访问权限变为default
14、关于接口:
- JDK 1.8以前,接口中的方法必须是public的
- JDK 1.8时,接口中的方法可以是public的,也可以是default的
- JDK 1.9时,接口中的方法可以是private的
15、抽象类特点:
- 抽象方法只能在抽象类里面
- 抽象类和抽象方法必须被abstract修饰
- 抽象类不能创建对象(不能实例化)
- 抽象类中可以有非抽象的方法,在被其他类继承的时候可以不重写。
- 抽象类和类的关系也是继承
- 抽象类是可以有构造方法的,只不过,抽象类的构造方法定义为protected,因为他只能被子类使用,即用super(paraments);
- 被abstract修饰的类就是抽象类,有没有抽象方法无所谓
- 一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类
- 抽象类不能直接创建一个对象,但是可以通过调用静态方法实现。
16、赋值语句常见:
- fload修饰的小数如果不加 f 后缀,默认是double类型。double转成float向下转换,意味着精度丢失,所以要进行强制类型转换。
- 整数默认是int类型,int类型不能转型为Double,最多通过自动装箱变为Integer但是Integer与Double没有继承关系,也没法进行转型,所以Double d=100是错误的。
17、线程相关:
- run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用,用于定义线程的执行体。
- start()的作用是启动相应的线程。启动一个线程实际是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远也不会运行,用于开启多线程。
18、 java中"包"的引入的主要原因是java本身跨平台特性的需求。实现跨平台的是JVM。
包(package)由一组类(class)和接口(interface)组成
19、final关键字
final变量,如果是基本数据类型,则其数值一旦初始化后就不能被改变。
被final修饰的对象,引用是不能改变的,但是对象属性值是可以改变的内容是可以改变的。
- 类中的 final 方法可以被子类继承,但是不能被子类修改。
- 声明 final 方法的主要目的是防止该方法的内容被修改。
能不能被同一个包的类访问与final无关,由public protect default private 决定
20、volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
22、servlet的生命周期:
-
初始化阶段:调用init方法
-
响应客户请求:调用service
-
终止:调用destory方法
响应客户端请求:首先Servlet通过HttpRequest对象封装http请求信息,然后Servlet容器调用HttpServlet的service方法,它会根据用户请求的方式调用具体的方法。如果请求方式是Get则调用doGet方法,如果请求方式是POST则调用doPost方法,执行完后,通过HttpRespones对象生成相应数据相应客户的请求,一般要重写doGet方法和doPost方法
23、标识符:
- 只能由数字,字母,符号(有且仅有_和$两个)组成。
- 数字不能作为标识符的开头。
- 不能和关键字,保留字,显式常量一样。关键字都是小写的。
- null,true,false都不是关键字,属于显式常量。goto,const都是保留关键字。
24、java语言中的数组元素下标总是从0开始,下标可以是整数或整型表达式。
25、java垃圾回收:
垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
26、基本类型与基本类型封装型比较(**和equals())
- 基本型(比如int)和基本型封装型(比如Integer)进行“**”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,
- 两个Integer类型进行“**”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,
- 两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
- 基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型(比如int和Integer使用equals()比较)
27、混合赋值运算符:
- '<<'表示左移位
- ‘>>’表示带符号右移位
- '>>>'表示无符号右移
- 但是没有<<<运算符
28、抽象类使用时候:
- 一个类中有抽象方法则必须申明为抽象类。
- 我建一个接口,然后一个抽象类implements这个接口,并override的所有方法。然后我在建一个类extends这个抽象类,并且不能为任何抽象方法提供任何细节或方法体时,这时这个类必须是抽象类。
- 一个类实现一个接口就必须实现其中所有的抽象方法,若该实现类不能实现接口中的所有方法则实现类定义为抽象类
29、接口和抽象类
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
接口和抽象类在方法上的区别
- 普通成员变量:抽象类中可以有普通成员变量,接口中没有普通成员变量(static final变量);
- 方法:抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;
- 静态成员变量:抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
- 静态方法:抽象类中可以包含静态方法,但不能是抽象静态方法;接口中不能包含静态方法(静态的方法不能被覆写)
- 构造方法(静态的):抽象类可以有构造方法,接口中不能有构造方法;
- 方法访问权限:抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
- 子类实现和继承: 一个类可以实现多个接口,但只能继承一个抽象类。
30、static
- static修饰某个字段时,肯定会改变字段创建的方式(每个被static修饰的字段对于每一个类来说只有一份存储空间,而非static修饰的字段对于每一个对象来说都有一个存储空间)
- static属性是属于类的,所以对象共同拥有,所以既可以通过类名.变量名进行操作,又可以通过对象名.变量名进行操作
- 修饰的变量是所有同一个类生成的对象共享的
31、关于java中的构造方法
- java构造方法可以有任何访问的修饰: public, protected, private 或者没有修饰(通常被 package 和 friendly 调用) . 但是 不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized 。
- 类默认提供一个无参构造方法。
- java构造方法中的this关键字: 构造器的this指向同一个类中,用于调用同一个类中不同参数列表的另外一个构造器,必须放在第一行,否则会引起编译错误!
- java构造方法中的super关键字:构造方法的super关键字用于调用其父类的构造方法,子类默认调用父类的构造方法,也就是说super()是默认调用的,显示调用必须放在构造方法第一行!
32、Socket套接字
就是源Ip地址,目标IP地址,源端口号和目标端口号的组合
- 服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号)
- 客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)
33、package包
- 为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包。Java中的包一般均包含相关的类,java是跨平台的,所以java中的包和操作系统没有任何关系,java的包是用来组织文件的一种虚拟文件系统。
- import语句并没有将对应的java源文件拷贝到此处仅仅是引入,告诉编译器有使用外部文件,编译的时候要去读取这个外部文件。
- Java提供的包机制与IDE没有关系
- 定义在同一个包(package)内的类可以不经过import而直接相互使用。
34、只有在我们没有显示声明任何构造方法时java才会为我们提供一个默认的无参构造函数。
35、关于Java包的导入:
- java.lang包是java语言包,是自动导入的。
- java.util包是java的工具包,需要手动导入。
- java.sql包,JDBC接口类,需要手动导入。
- java.io;各种输入输入流,需要手动导入。
36、switch,cace循环中如果没有break,会发生case穿透现象,程序会继续向下执行,直到遇到break或者结束switch语句的大括号为止。
37、abstract不能与final并列修饰同一个类。
abstract 不能与private、static、final或native并列修饰同一个方法。
38、Map和SortedMap是接口,不能直接new对象
HashMap 允许null-null键值对
TreeMap 允许value值为null,不允许key值为null
ConcurrentMap,key和value都不允许为null
39、java中的i++和++i在java语言层面上来看使用中间量机制,i=i++,i不变,i=++i相当于++i,而结合在一个语句里使用则会报错,因为++后应该跟变量。同理,i=(++i)++也是不对的。
40、for(初始化语句;判断条件语句;控制条件语句){}
其中,判断条件语句是boolean型,初始化语句->判断条件语句->括号里面的->控制条件语句
41、真数组: 数组元素在内存中是一个接着一个线性存放的,通过第一个元素就能访问随后的元素,避免了数据覆盖的可能性,和数据类型覆盖并没有关系。
42、接口的方法都是 public abstract 变量都是public static final的 ,方法只能通过接口调用,不能通过实现类调用。
jdk8之后,接口可以定义 static方法 与 default方法。 static方法只能通过接口调用,不能通过实现类调用。default只能通过接口实现类调用,不能通过接口名调用。
43、一个java文件可以包含多个java类,但是只能包含一个public类,并且public类的类名必须与java文件名相同。
一个以". java"为后缀的源文件只能有一个与文件名相同的类,可以包含其他类
44、HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,HashMap内部包含了一个默认大小为 16 Entry 类型的数组 table,其中每个Entry 是一个链表,当链表长度大于等于 8 时会将链表转换为红黑树。
45、try catch finally
- 不管有木有出现异常,finally块中代码都会执行;
- 当try和catch中有return时,finally仍然会执行;
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
46、进程间通信机制有哪些
1、进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字共六种
2、管道:管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,一般用于两个不同进程之间的通信。有名管道也是一种半双工的通信方式,但它允许无亲缘关系进程间的通信。
3、信号:信号是一种比较复杂的通信方式,信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,传递的消息比较少用于通知接收进程某个时间已经发生
4、信号量:信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同 步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段
5、消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载 无格式字节流以及缓冲区大小受限等特点。
6、共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。他往 往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
7、套接字:套接字可用于不同及其间的进程通信。
流式套接字:提供可靠的,面向连接的通讯流
数据包套接字:定义一种无连接的服务,通过相互独立的报文进行传输,是无序的
原始套接字:用于新的网络协议的测试
47、防止SQL注入,需要注意以下几个要点:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
48、sql语句中
- All:对所有数据都满足条件,整个条件才成立;
- Any:只要有一条数据满足条件,整个条件成立;
- Some的作用和Any一样 .
49、sql语句中:
having子句即可包含聚合函数作用的字段也可包括普通的标量字段。
having子句必须于group by 子句同时使用,不能单独使用。
没有聚合函数的使用也可以用having过滤。
where在分组前过滤,having在分组后过滤,两者之间不冲突。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!