2023.2.18刷题
1、java的4类流程控制语句
解析:
java的4类流程控制语句
循环语句:while,for,do while
选择语句(分支语句):if,switch
跳转语句:break,continue,break,label
异常处理语句:try catch finally,throw
2、类的加载过程
解析:
B、对象成员,实例化对象后才有的内容,已经完成类的加载过程了。类加载是对针对的类变量,而不是对象成员。
3、线程安全的map
解析:
线程安全的map:HashTable,SynchronizedMap,ConcurrentHashMap
解析:
4、StringBuffer类和String类
解析:
String类对象一旦成立,便不能被改变
StringBuffer类对象成立后,依然可以被修改
5、spring的事务传播特性
解析:
事务属性的种类:
传播行为(PROPERGATION):事务开启和事务结束(包括回滚和提交)
回滚:在事务提交之前将数据库数据恢复到事务修改之前数据库数据状态。
隔离级别:
只读:
事务超时:
https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
6、正则表达式
2023.2.19刷题
1、多态、匿名内部类、覆盖方法重写
解析:
匿名内部类:形式
形式:
例子:
Swimming s2 = new Swimming()
该代码是表示创建内部类对象,用于下面go方法,并重写了swim方法。
解析:
2、java解释器自动引入包
3、abstract、static、final、public关键字的使用
关键字 | 作用 |
abstract | 只能描述类和方法,不能描述变量。
|
static | 修饰成员变量和成员函数。static修饰的方法,在对象实例化之前就已经被分配了内存,被加载了。 静态方法中不能使用this和super关键字,因为this代表本类对象,super代表父类对象,而静态时,有可能没有对象存在,所以this和super无法使用。 |
final | 可以修饰类,方法,变量(成员变量内,局部变量,静态变量)。
|
public | 可以修饰抽象方法。它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。修饰类,成员变量,成员方法,构造方法。 |
protected | 可以修饰抽象方法。它主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。修饰成员变量,成员方法,构造方法,但不能修饰类(此处指的是外部类,内部类不加以考虑)。 |
default | 它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。 |
private | 它的访问权限仅限于类的内部,是一种封装的体现。修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类不加以考虑)。 |
详细的解释:
1.抽象方法只能定义在抽象类中,抽象方法和抽象类必须由abstract修饰,abstract关键字只能描述类和方法,不能描述变量。抽象方法只定义方法声明,不定义方法实现。抽象类不可以被实例化(创建对象),只有通过子类继承抽象类并覆盖抽象类中的所有抽象方法后,该子类才可以被实例化,否则该子类还是一个抽象类。抽象类中有构造函数用于给子类对象进行初始化,同时抽象类中可以含有非抽象方法。abstract关键字不可以与final,private,static关键字共存,因为被final修饰的方法不可以被重写,意味着子类不可以重写该方法,如果abstract和final共同修饰父类中的方法,子类要实现抽象方法(abstract的作用),而final又不让该方法重写,这相互矛盾。如果private和abstract共同修饰父类中的方法,private修饰则该方法不可以被子类访问,但是abstract修饰需要子类去实现,两者产生矛盾。如果static和abstract共同修饰父类中的方法,static表示是静态的方法,随着类的加载而加载,则该方法不需要在子类中去实现,这与abstract关键字矛盾。
2.static用于修饰成员变量和成员函数,想要实现对象中的共性数据的对象共享,可以将这个数据进行静态修饰,被静态修饰的成员可以直接被类名调用,静态随着类的加载而加载,而且优先于对象存在。静态方法只能访问静态成员(静态方法和静态变量),不可以访问非静态成员,这是因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。静态方法中不能使用this和super关键字,因为this代表本类对象,super代表父类对象,而静态时,有可能没有对象存在,所以this和super无法使用。
3.final关键字可以修饰类,方法,变量(成员变量内,局部变量,静态变量),被final修饰的类是一个最终类,不可以被继承,被final修饰的方法是一个最终方法,不可以被覆盖,但是可以被继承。被final修饰的变量只能是一个常量,只能赋值一次。内部类被定义在类中的局部位置上时,只能访问局部被final修饰的局部变量。
https://www.nowcoder.com/questionTerminal/fb463f20d1cc44e3b4476e5d5319e7e9
4、类的线程安全
5、多态深度了解
5.1“编译看左,运行看右”
解析:
1、A是父类,B是子类继承了A类。
A a = new B();
该代码:父类引用指向子类对象(向上转型)(实则是向上转型,子类的实例对象->指向父类的引用)
编译看=的左侧,即父类的方法,运行看=右侧,即子类的方法,对父类的中相同的方法名进行了重写。
2、多态满足的条件:1.继承 2.重写 3.父类引用指向子类对象
3、成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边,
参考复习链接:
https://blog.csdn.net/Fighting1021/article/details/119940351?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167679376116800188512455%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167679376116800188512455&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-119940351-null-null.142^v73^wechat_v2,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E7%BC%96%E8%AF%91%E7%9C%8B%E5%B7%A6%E8%BE%B9%E8%BF%90%E8%A1%8C%E7%9C%8B%E5%8F%B3%E8%BE%B9&spm=1018.2226.3001.4187
5.2多态实现的两种方法
Java通过方法重写和方法重载实现多态
方法重写(覆盖)是指子类重写了父类的同名方法
方法重载是指在同一个类中,方法的名字相同,但是参数列表不同
6、RMI采用什么通讯协议
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)远程过程调用协议应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的***,为远程通信开辟新的里程碑。 RMI的开发步骤
1、先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote 开发一个类来实现远程接口及远程方法,
2、值得注意的是实现类需要继承UnicastRemoteObject 通过javac命令编译文件,
3、通过java -server 命令注册服务,
4、启动远程对象
5、最后客户端查找远程对象,并调用远程方法 所以选C
7、Java基本类型
基本数据类型:八个
引用数据类型:
对象变量类型,复合数据类型,包含类、接口、数组(除了基本类型外,就是引用类型)。
8、对象实例化
解析:
抽象类和接口都不能实例化。
9、关键字
解析:
10、抛InterruptedException的代表方法
解析:
11、private,default,protected,public修饰符的区别
解析:
更多的部分参考 本部分的3、abstract、static、final、public关键字的使用。
12、标识符(变量的规则)
解析:
标识符:
1. 数字,字母,符号(只有_和$两种),数字不能开头。
2. 不能是关键字(有两个保留关键字,goto,const,关键字都是小写的)或者显式常量(null,true,false)。
13、Java语言的特点
1、Java致力于检查程序在编译和运行时的错误。
2、Java虚拟机实现了跨平台接口
3、类型检查帮助检查出许多开发早期出现的错误。
4、Java自己操纵内存减少了内存出错的可能性。
5、Java还实现了真数组,避免了覆盖数据的可能。
14、抽象类和最终类
抽象类:
抽象类是用来继承的,抽象类中的所有方法在子类中需要重写,否则该子类需要声明为抽象类
抽象类中可以有抽象方法,也可以没有抽象方法。
最终类(final类):
最终类不能被继承,即没有子类,最终方法也就不能被重写。
最终类中可以有最终方法也可以没有。
15、JVM内存
解析:
方法区在JVM中也是一个非常重要的区域,它与堆一样,是被 线程共享 的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
拓展:
概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。
16、线程的描述
1、线程的调度是抢先式,即根据线程的优先级来决定哪一个线程先运行。
2、不同优先级的线程间是抢先式的,而同级线程间是轮换式的。
3、一个新创建的线程并不是自动的开始运行的,必须调用它的start()方法使之将线程放入可运行态(runnable state),这只是意味着该线程可被JVM的线程调度程序调度而不是意味着它可以立即运行。
4、一个线程停止运行的原因:
可能是因为更高优先级线程的抢占,也可能是因为调用sleep()方法。
17、类之间的几种常见关系
解析:
USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。
关联关系:A类会用到B类,这是一种强依赖关系,是长期的并非偶然。在代码中的表现为:A类的成员变量中含有B类。
HAS-A:组合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是组合关系,鸟群中每个部分都是鸟。
IS-A:表示继承。父类与子类,这个就不解释了。
要注意:还有一种关系:组合关系也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分的关系,但这种整体和部分是不可分割的。
18、equals方法
1、equals方法是String类型重写的方法,首先能够判断参数是不是String类型。
==表示两者的地址是否相同
equals方法是检查啷个字符串的内容是否相同。注意大小写。
equalsIgnoreCase方法是需要检查字符串内容是否相同,并且忽略大小写比较。
2、int和Integer两者内容的比较。
Integer的内部数据是-127-128。在这个范围内的数据,Integer进行拆箱后再和int的数据内容进行比较。
19、Java程序初始化顺序(父类子类静态代码块、普通代码块、构造方法)
解析:
关于Java程序初始化顺序:
父类的静态代码块
子类的静态代码块
父类的普通代码块
父类的构造方法
子类的普通代码块
子类的构造方法