成员变量在类内的方法之外,局部变量在方法内
13. 静态变量和实例变量有什么区别?
A。 静态变量是由修饰符修饰的变量。 内存中只有一个内存空间。 静态变量的内存分配是在类加载过程中完成的,可以通过(类名.)直接访问。
b. 实例变量必须依赖于某个实例。 它需要先创建对象,然后通过该对象访问它。 每次创建实例对象时,都会为实例变量分配不同的内存,每个对象访问自己的实例变量。
C。 一个类无论创建多少个对象,静态变量都只初始化一次,所有实例都可以访问这个静态变量,并且可以通过类名直接访问。
14.类可以继承吗?
不能。 该类被final修饰,因此不能被继承。
15.类中常用的方法有哪些?
获取字符串的长度:()
比较字符串:()
连接字符串:()
提取字符串:()
搜索字符串:()
分割字符串:split()
忽略字符串大小写:()
将所有英文字符转换为小写:()
将所有英文字符转换为大写:( )
删除空格:trim()
16. 和 之间有什么区别?
:适合少量字符串操作
:线程不安全,适合单线程下对字符缓冲区进行大量操作的情况
:线程安全,效率低,适合多线程下对字符缓冲区进行大量操作的情况
(操作就是字符串的拼接) JDBC中拼接sql
17.您对面向对象的4大特性有何理解?
封装:封装一般认为是绑定数据和操作数据的方法,只能通过定义好的接口来访问数据。 我们在类中编写的方法是对实现细节的一种封装; 我们写的类就是对数据和数据操作的封装。 可以说,封装就是把所有能隐藏的东西都隐藏起来,只向外界提供最简单的编程接口。 (减少代码冗余)
继承:继承是通过从现有类获取继承信息来创建新类的过程。 提供继承信息的类称为父类(超类、基类); 接收继承信息的类称为子类(派生类)。
多态性:多态性是指允许不同子类型的对象对同一消息做出不同的响应。 简单地说,它是使用相同的对象引用调用相同的方法,但做不同的事情。 多态性分为编译时多态性和运行时多态性。 方法重载()实现了编译时多态(也称为预绑定),而方法重写()实现了运行时多态(也称为后绑定)
抽象:抽象是总结一类对象的共同特征来构造类的过程,包括数据抽象和行为抽象。 抽象只关注对象的属性和行为,而不关注这些行为的细节。
18.方法重载和重写有什么区别? (方法重载发生在类中,方法重写发生在父类与子类之间)
方法重载和重写都是实现多态的方法。 区别在于前者实现了编译时多态,而后者实现了运行时多态。 重载发生在类中。 如果同名方法有不同的参数列表(不同的参数类型、不同的参数个数,或两者都有),则认为是重载; 重写发生在子类和父类之间,重写要求子类重写的方法与父类重写的方法具有相同的返回类型,比父类重写的方法有更好的访问权限,并且不能声明更多的异常比父类重写的方法(代码交换原理)。 重载对返回类型没有特殊要求。
方法重载规则:
1.方法名称相同,但参数列表中参数的顺序、类型和数量不同。
2.重载与方法的返回值无关,它发生在类中。
3、可以抛出不同的异常,可以使用不同的修饰符。
方法重写规则:
1、参数列表和返回类型必须与重写的方法完全一致。
2、构造方法不能重写,声明为final的方法不能重写,声明为final的方法不能重写,但可以再次声明。
3、发生在父类与子类之间时,子类的访问权限不能比父类严格。
19.(默认)有什么区别?
20. 多重继承下初始化的顺序是什么?
先父类后子类,先属性后构造方法。
21、使用运行时多态开发的思路是什么?
A。 编写父类
b. 写一个子类,子类重写父类方法
C。 运行时,使用父类的类型和子类的对象
Pet pet = new Dog();
22.类中的向上转型和向下转型有什么区别?
向下转型:超类转换为子类(使用强制转换)(对象类或接口)
向上转换:子类使用父类的类型,子类的对象转换为父类(自动类型转换)
23. 接口和抽象类有什么区别?
差异一:语法方面
1、继承实现((抽象类单继承,接口多实现)接口还可以继承其他接口)
2、成员变量
①. 抽象类中可以有普通成员变量,但接口中不能有普通成员变量
②. 抽象类和接口都可以包含静态成员变量
3. 方法
①. 抽象类可以有构造函数,但接口不能有构造函数。
②.抽象类可以包含非抽象普通方法,接口中的所有方法都必须是抽象的,并且不能有非抽象普通方法。
③. 抽象类中的抽象方法的访问类型可以是默认类型,但接口中的抽象方法只能是类型,默认是类型。
④. 抽象类可以包含静态方法,但接口不能包含静态方法。
差异 2:概念方面
抽象类体现了继承关系。 要使继承关系合理,父类和派生类之间必须存在“is-a”关系,即父类和派生类的概念本质上应该是相同的。 接口的情况并非如此。 它不要求接口的实现者在概念上与接口定义一致,而只需实现接口定义的契约,即“has-a”关系。
设计接口时要注意稳定性,方法的参数和返回值不能随意改变。
差异三:设计方面
抽象层次不同,抽象类是类的抽象,接口是行为的抽象。 抽象类将整个类抽象为一个整体,包括属性和行为,而接口抽象了类的各个部分(行为)。 抽象类是自下而上抽象的,接口是自上而下设计的。
24.java中常见的异常类型?
25、编写多个异常的注意事项?
A。 catch语句的排列顺序:先子类,后父类
b. 发生异常时按顺序一一匹配
C。 只执行与异常类型匹配的第一个catch语句
(不要“吃异常”,父类有底线)
在catch中,需要输出异常信息,并打印异常发生处的堆栈信息。 如果没有输出,就会导致异常发生,但由于没有相关错误信息的输出,所以异常发生的情况未知。 这种情况被称为“饮食异常”。
26. 错误和错误有什么区别?
Error类和该类的父类都是类,它们的区别如下:
Error类一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、内存空间不足、方法调用栈溢出等。 对于这种错误导致的应用程序中断,程序本身无法恢复和预防。 遇到此类错误时,建议让程序终止。
类代表程序可以处理、捕获并可能从中恢复的异常。 遇到这样的异常,应该尽可能的处理异常,恢复程序,不能随意终止异常。
27.和有什么区别?
运行时异常( ) 编译可以通过,但一运行就终止。 程序不会处理运行时异常。 如果发生此类异常,程序将终止。 (bug的来源,需要检查运行时异常)(父类)
检查异常 ( ) 或使用 try。 。 。 catch catch,或者用语句抛出,交给其父类处理,否则编译不通过。 (父亲)
28. Final、 和 有什么区别?
Final:用于声明属性、方法、类,分别表示属性不可变、方法不可重写、类不可继承。
:异常处理语句结构的一部分,表示始终执行。
:类的方法。 待回收对象的这个方法会在垃圾收集器执行时被调用。 可以重写此方法以在垃圾收集期间提供其他资源回收,例如关闭文件。 这是一个被动方法(实际上是一个回调方法),我们不需要调用。
29.投掷和投掷有什么区别?
扔:
A。 该语句用在方法体中,表示抛出异常,由方法体中的语句处理。
b. 它是一个专门抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定抛出了某种异常。
:
A。 就是声明在方法声明之后使用异常语句,表示如果抛出异常,则方法的调用者将处理该异常。
b. 主要是声明该方法将抛出某种类型的异常,以便其使用者需要知道需要捕获的异常类型。
C。 表示有可能出现异常,但不一定会出现这种异常
30、什么是装箱和拆箱,以及包装的应用场景?
拆箱 - 包装类变量可以分配原始类型
装箱 - 原始类型的变量可以分配一个包装类
封装类的应用场景:
主要用在集合类中。 (集合不允许存储基本数据类型。存储数字时,使用包装类型)
包装类的作用:
A。 集合不允许存储基本数据类型。 存储数字时,使用包装类型;
b. 包装类提供了一系列实用的方法
31.List、Set、Map有什么区别?
①.List和Set是存储单列数据的集合,Map是存储键、值等双列数据的集合;
②. List中存储的数据是有序的并且允许重复;
③. Map中存储的数据是无序的,它的key不能重复,它的value可以重复。
④. Set中存储的数据是无序的,不允许重复,但是元素在集合中的位置是由元素决定的,位置是固定的(Set集合是基于数据存储的,所以位置是固定,但位置不受用户控制,因此集合中的元素对于用户来说仍然是乱序的)
32.有什么区别?
实现了一个变长数组,并且在内存中分配了连续的空间。 遍历元素和随机访问元素的效率比较高。
使用链表存储。 插入和删除元素时效率更高。
33、如果一个存储有很多值,但不知道KEY是什么,如何遍历所有的KEY和VALUE?
Get:接口的()方法
* 方法
* (): 判断是否还有其他可访问的元素
* next():返回下一个要访问的元素
(),返回这个map中包含的映射(键值)
() 方法获取密钥; ()方法获取值
(),返回键集
取出所有key的集合,获取对象,取出key,根据key取出对应的value
34.进程和线程有什么区别?
进程是指在内存中运行的应用程序。 每个进程都有自己独立的内存空间,一个进程中可以启动多个线程。 例如,在系统中,一个正在运行的exe就是一个进程。
线程是指进程中的一个执行过程,一个进程中可以运行多个线程。 例如,java.exe进程中可以运行许多线程。 线程总是属于一个进程。
进程中包含线程,线程必须属于某个进程。 一个进程中的多个线程共享该进程的内存,两者之间是一对多的关系。
35、线程的实现方法有哪些?
①. 继承类
特点:编写方便,可以直接操作线程; 适合单继承
②. 实现接口
特点:避免单一继承的限制; 促进资源共享
③. 编写实现类
特点:需要实现call()方法。 call方法与run方法不同,call方法有返回值。
36、多线程中调用start方法和run方法有什么区别?
调用run()方法:主线程只有一条执行路径; 没有启动新线程(普通方法调用)。
调用start()方法:多条执行路径,主线程和子线程并行交替执行; 启动一个线程。
调用start方法就是线程的启动。 调用后,线程进入就绪状态。
Run方法编写了线程要实现的功能。 一般不直接调用,而是由系统调用。 如果调用的话,就是普通的方法调用。
37. 多线程有问题吗?
什么时候使用多线程开发?
①. 程序需要同时执行两个或多个任务。 例如:手机淘宝中“我的界面”的后台程序,开启多个线程从不同系统获取数据,组合发送给前端APP。
②. 程序需要实现一些需要等待的任务,例如:导出过大的Excel文件。
③. 需要一些程序在后台运行,例如:Java垃圾收集器程序。
线程安全注意事项:
1、出现线程安全问题:当多个线程共享数据时,由于其中一个线程还没有完成对共享数据的操作,其他线程就会参与进来,因此出现了数据篡改的问题。
2、如何解决线程安全问题:要保证一个线程操作共享数据时,其他线程必须在外面等待,直到操作共享数据的线程执行完毕,其他线程才能操作共享数据。
3、同步方法的锁是当前对象this,同步代码块需要指定锁对象(必须唯一); 相比之下,同步代码块可以更精确地控制所管理的代码。
另:调试多线程的排查方法是输出多条日志,而不是Debug。 使用log4j输出中间处理结果来排查问题。
38.有什么区别?
全部实现Map接口,继承类,继承类
线程安全,效率低下,key和value都不允许为null。
它是非线程安全的,高效,并且键和值都允许为空。
为什么线程安全效率低下:
线程安全是以牺牲效率为代价的。 它是(一种同步锁,用于共享数据,一次只有一个线程可以访问共享数据),所以线程安全不需要多线程访问时使用。 实现同步。
39.Join和yield有什么区别?
Yield:(礼貌)当前线程贡献CPU使用权,但当前线程仍有可能再次获得CPU使用权。
Join:该方法出现时,挂起当前线程,执行其他进程,等待其他线程执行完毕后再执行挂起的进程。
40.线程的状态?
线程的状态
在某些条件下,线程的状态会发生变化。 一个线程有以下几种状态:
1.新建状态(New):一个线程对象被新创建。
2.就绪状态():线程对象创建后,其他线程调用该对象的start()方法。 该状态的线程位于“可运行线程池”中,变为可运行状态,只等待获取CPU的使用权。 即处于就绪状态的进程拥有其运行所需的除CPU之外的所有资源。
3、运行状态():处于就绪状态的线程获取CPU并执行程序代码。
4、阻塞状态():阻塞状态是指线程由于某种原因放弃了CPU的使用权,暂时停止运行。 直到线程进入就绪状态,才有机会进入运行状态。
阻塞分为三种类型:
(1)、等待阻塞:正在运行的线程执行wait()方法,该线程会释放所有占用的资源,JVM会将该线程放入“等待池”中。 进入该状态后,无法自动唤醒,必须依赖其他线程调用()或()方法才能被唤醒。
(2)同步阻塞:当运行的线程获取对象的同步锁时,如果同步锁被其他线程占用,JVM就会将该线程放入“锁池”中。
(3)其他阻塞:当正在运行的线程执行sleep()或join()方法时,或者发出I/O请求时,JVM会将线程置于阻塞状态。 当sleep()状态超时时,join()等待线程终止或超时,或者当I/O处理完成时,线程再次转入就绪状态。
5、死亡状态(Dead):线程执行完毕或因异常退出run()方法,线程结束生命周期。
41.获取Class对象的三种方法是什么?
第一种方式:
不带new,根据类的class属性获取Class对象(类名.class)
第二种方式:
new的情况下,通过.()方法获取Class对象
第三种方式:
通过Class.("包名+类名")方法获取Class对象
42.什么是反射?
Java反射是指在运行状态下,对于任何一个类,都可以知道这个类的所有属性和方法; 对于任何对象,您可以调用它的任何方法和属性; 并且您可以更改其属性。
反映()机制
它可以动态获取类的信息,动态调用对象的方法。
反射机制主要提供以下功能
在运行时确定任何对象的类。
在运行时构造任何类的对象。
在运行时确定任何类的成员变量和方法。
在运行时调用对象的任何方法。
对反射的理解:
1、通常我们创建对象的时候都是通过New class来创建的,但是通过反射技术,我们可以通过Class来创建实例。 (类的完整路径),例如:加载JDBC驱动程序时,我们使用反射技术。
2.反射主要用于平时开发中框架层的开发。 例如,框架内部使用反射技术来创建实例。
43.工厂模式和单例模式?
单例模式:应用该模式的类只能有一个实例。 它必须自己创建这个实例,它必须将这个实例提供给整个系统本身。 从具体实现来看:首先,单例类只提供了私有构造函数; 其次,类定义包含该类的静态对象私有对象; 第三,类提供静态公共函数用于创建或获取自身的静态私有对象。
工厂模式:简单来说,对象的创建传统上都是交给工厂类来创建,然后通过工厂类的工厂方法可以自己获取对象。 适用场景是对象创建步骤繁琐,过程相对复杂。
工厂模式和单例模式的区别:
区别一:工厂模式可以创建不同类型的对象实例,而单例模式只能创建一种类型的对象实例;
区别二:工厂模式创建的对象实例没有在内存中只创建一份的要求,而单例模式创建的对象实例在内存中只有一份。