汇总一链接:
Java语法汇总二(NK)(更新至2021.10.27)_sulia1234567890的博客-CSDN博客https://blog.csdn.net/sulia1234567890/article/details/120966791
41. 什么是web容器?(1)web容器是一种服务程序,在服务器的一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如Java中的tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以有多个容器。
(2)web容器,例如tomcat,用于接受,响应客户端的请求,负责将HTTP请求转化为HttpServletRequest对象,也就是常见servlet实例对象。
补:
(3)http: HTTP协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议。
(4)servlet:是一套技术标准,内含与web应用相关的一系列接口,用于为web应用实现方式提供宏观解决方案。
(5)jsp网页:java的服务器页面,其本质也是一个servlet,有html网页代码,Java代码,jsp标签组成,当servlet处理完数据后会转发给jsp,jsp负责显示数据。
42. java.lang包是java语言的核心包(1)java.lang包定义了一些基本类型,包括Integer,String之类的,是java程序必备的包,由解释器自动引入,无需手动导入。
43. JAVA的垃圾回收机制(1)java提供一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间是不可知的。当对象的引用变量被赋值为null,可能被当成垃圾。
(2)垃圾回收在jvm中的优先级相当低。
(3)垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重的bug, 照样内存溢出。
(4)进入DEAD的线程,它还可以恢复,GC不会回收。
44. Integer类的parseInt()方法(1)parseInt(): 将字符串参数解析为带符号的十进制整数。字符串中的字符都必须是十进制数,除了第一个字符可能是ASCII减号(‘-’, ‘u002D’)以指示负值,或加号('+', 'u002B')以指示正值。 返回所得到的整数值。
非纯数字的字符串转化为Integer对象会报错,比如String str = " 123456as"; int num = Integer.parseInt(str) 会报“java.lang.NumberFormatException”的错。
45. 迭代器Iterator(1).hasNext()
(2).next()
(3).remove():Iterator支持从源集合中安全的删除对象,只要在Iterator实例上调用remove()即可。好处是可以避免ConcurrentModifiedException, 当打开Iterator迭代集合时,同时又对集合做修改。有些集合不允许在迭代时删除或添加元素,但是调用Iterator的remove()方法是个安全的办法。it.remove(),无参,it是it=list.Iterator();
46. Java Thread的start()方法和run()方法(1)start():用start()方法来启动线程,是真正的实现了多线程。通过调用Thread类的start()方法来启动一个线程,这时候线程处于就绪(可运行)状态,并没有运行。一旦得到cpu时间片,就开始执行run()方法。
注意:此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
(2)run()方法:只是类的一个额普通方法而已,如果直接调用run()方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run()方法体执行完毕后才可继续执行下面的代码。
47. 使线程释放锁的几种操作(1)wait():释放。会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify, notifyAll唤醒时,进入可执行状态。
(2)join():释放。当前线程调用某线程的.join()时,会使当前线程等待某线程执行完毕再结束,底层调用了wait(),释放锁。
(3)sleep():不释放。会使当前线程睡眠指定时间,不释放锁。
(4)yield():不释放。会使当前线程重回到可执行状态,等待cpu的调度,不释放锁。
补:
(1)一个线程调用yield方法(休眠),可以使具有相同优先级的线程获得处理器。通俗的说,yield方法比较高尚,让同级的其他线程先获得处理器。因此,yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是实际中无法保证yield()达到让步的目的,因为让步的线程有可能再次被线程调度程度调度。
48. 关于内部类的几个知识点(1)静态内部类才可以声明静态方法
(2)静态方法不可以使用非静态变量
49. Java语言的静态多分派,动态单分派(1)如果是重载方法之间的选择,则是使用静态类型。
重载中,运用静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用方法。
(2)如果是父类与子类之间的重写方法的选择,则是使用动态类型。如A a = new B(); 会使用B类型去查找重写的方法,使用A类型去找重载的方法。
重写中,运用的是动态多分派,是根据new的类型确定对象,从而确定调用的方法。
50. 类的加载包括:加载,验证,准备,解析,初始化 51. Java的构造方法知识点汇总(1)构造方法不能被这些修饰: final,static,synchronized, native
构造方法不能被子类继承,所以用final没有意义。
构造方法用于创建一个新的对象,不能作为类的静态方法,所以用static没有意义。
java语言不支持native, synchronized修饰的构造方法。
(2)构造方法不需要同步化。(补:子类可以覆盖掉父类的同步方法)
(3)构造方法的优先级一般比代码块低
(4)构造方法的主要作用是完成对类的对象的初始化工作
(5)一般在创建新对象时,系统会自动调用构造方法
(6)构造方法没有返回值,也不返回void (注意区分,有的方法跟类名同名,但是有返回值类型,这个就不是构造方法,而是一般的方法)
52. AOP的相关知识(1)AOP将散落在系统中的“方面”代码集中实现。
(2)AOP有助于提高系统可维护性。
(3)AOP是一种设计模式,Spring提供了一种实现。
53. 数组的6种表示方式(1)float a[][] = new float[6][]
(2)float a[][] = new float[6][6]
(3)float []a[] = new float[6][]
(4)float []a[] = new float[6][6]
(5)float [][]a = new float[6][]
(6)float[][]a = new float[6][6]
54. 泛型的相关知识(1)创建泛型对象的时候,一定要支出类型变量T的具体类型,争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。
(2)JVM如何理解泛型概念?答:类型擦除
事实上,JVM不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。
处理方法很简单,我们叫做类型变量T的擦除(erased)。
即:泛型代码和JVM:
---虚拟机没有泛型,只有普通类和方法
---在编译阶段,所有泛型类的类型参数都会被Object或者他们的限定边界来替换。即类型擦除。
---在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的的多态灾难。无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。
(3)JVM是如何获取具体类型的呢?用反射,也正因为有了反射才促生了泛型。
55. Java程序的执行过程(1)编译器将Java源代码编译成字节码class文件
(2)类加载到JVM里面后,执行引擎会把字节码转为可执行代码
(3)执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行
56. 一个.java文件中定义几个类需要注意的问题(1)public权限类最多只能有一个(也可以一个都没有)
(2)这个.java文件名只能是public权限类的类名。如果没有public类,则.java文件的名字是随便的一个类名。
(3)当用javac命令生成编译这个.java文件时,则会针对.java文件中的每一个类生成一个.class文件。 一个源程序文件中定义几个类和接口,则编译该文件就会生成几个以.class为后缀的字节码文件。
(4)如果类中有内部类,会产生类名$内部类名.class。 如果有匿名类,则会产生类名$1.class。所以类编译不一定会产生1个.class文件而已。
57. 抽象类和接口的区别(1)抽象类可以有构造方法,接口不不能有构造方法
(2)抽象类中可以有普通成员变量,接口中没有(可有常量)
(3)抽象类中可以包含非抽象普通方法,接口中必须所有方法都是抽象的
(4)抽象类中的抽象方法的访问权限可以是public, protected和默认类型。接口中的抽象方法只能是public, 并且默认即为public abstract的
(5)抽象类中可以包含静态方法,在JDK1.8之前接口中不能包含静态方法,JDK1.8后接口可以。
(6)抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是public static final类型(默认的也是这个)
(7)一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。接口不可以实现接口,但是可以继承接口,并且一个接口可以继承多个接口,用逗号隔开。
58. Java中的“|” 和“||”(1)“|”:按位或, 先判断左边条件,不管左边是否可以决定结果,都会执行右边条件
(2)“||”:逻辑或,先判断左边条件,如果左边可以决定结果,那么就不会执行右边条件
59. 三元操作符的转换规则(1)若两个操作数不可转换,则不做转换,返回值为Object类型。
(2)若两个操作数是明确数据类型的表达式(比如变量),则按照正常的二进制数来转换,int类型转换为long类型,long类型转换为float类型等。
(3)若两个操作数中有一个是数字S, 另外一个是表达式,且其类型标示为T,那么若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。
(4)若两个操作数都是直接量数字,则返回值类型为范围较大者。
60. 8种基本类型的大小,封装类,默认值,范围等补:
数组引用变量的默认值是null。数组变量实例中,如果没有显示的为每个元素赋值,Java就会把该数组的所有元素初始化为元素响应类型的默认值。



