系列文章列表:
每50条Java知识点就会重新发布一篇新的Java零碎知识点集合,希望能对您有所帮助,无论是笔面试也好,平时零碎时间学习也罢,都希望我们都能每天进步一点点。喜欢的同仁请多多点赞、转发,也可以将指点批评评论出来,大家一起交流,Debug Yourself~
1.由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器。
2.finally 语句先于 return 和 throw 语句执行。
3.true、false、null 都不是Java中的关键字,goto、const是Java中保留的关键字。
常见的Java关键字列表如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
abstract continue for new switch default if package synchronized do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while boolean assert |
4.继承具有传递性,子类可以无条件向上转型!一切对象皆可Object不是嘛?
5.static变量也称作静态变量,静态变量和非静态变量的区别:
- 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
- 非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
6.Thread中的join()方法是指把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。主线程必须等待子线程执行完毕才结束。
7.关于Java中的static关键字,说一条相对深入一点的知识点:static 方法不能被子类重写,在子类中定义了和父类完全相同的static方法,则父类的static方法被隐藏,Son.staticMethod() 或 new Son().staticMethod() 都是调用的子类的 static 方法,如果是Father.staticMethod() 或者 Father f = new Son(); f.staticMethod() 调用的都是父类的 static 方法。
8.Java多线程的各个状态间的关系流程手绘版本,包含简版与详细版。
9.Java1.8开始,只允许使用 public,abstract,default,static 和 strictfp 这几个关键字,其中 strictfp 这个关键字你可能没见过,strictfp 关键字全称 strict float point(精确浮点)。strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守 FP-strict 的限制,符合 IEEE-754 规范。关于 FP-strict 限制和 IEEE-754 规范您可以参考如下两个链接:
当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着所有表达式的结果都必须是 IEEE-754 算法对操作数预期的结果,以单精度和双精度格式表示。如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp。
10.数组初始化默认初始化,基本类型是0,布尔类型是 false,引用类型为 null。
11.类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。Boolean类型默认值是false。
12.有时为了避免某些未识别的异常抛给更高的上层应用,在某些接口实现中我们通常需要捕获编译运行期所有的异常,即 Exception。
再来说说两种异常的分类:
- checked exception:指的是编译时异常,该类异常需要本函数必须处理的,用 try 和 catch 处理,或者用throws 抛出异常,然后交给调用者去处理异常。
- runtime exception:指的是运行时异常,该类异常不必须本函数必须处理,当然你也可以在函数中自行处理。
Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常作为一个检查异常(checked exception)是不能忽略的,必须处理。
13.JVM的一些工具使用用途复习:
- java.exe 是 java 虚拟机,执行「.java」文件
- javac.exe 是编译「.java」文件
- javadoc.exe 用来制作 java 文档
- jdb.exe 是 java 的调试器,全称「Java Debugger」
- javaprof.exe 是剖析工具
14.JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值。例如下面的代码是正确的:
1 2 3 4 |
Boolean flag = false; if (flag = true) { System.out.println(“true”); } |
15.再来简单的总结一下Java中的类加载器,更多详细信息可以参考老四的《Java十一道由浅入深的笔面试题第二期 详细解析》这篇文章。
JDK中提供了三个ClassLoader,根据层级从高到低为:
- Bootstrap ClassLoader — 主要加载JVM自身工作需要的类
- Extension ClassLoader — 主要加载%JAVA_HOME%\lib\ext目录下的库类
- Application ClassLoader — 主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。
JVM 加载类的实现方式,我们称之为「双亲委托模型」:如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的 Bootstrap ClassLoader 中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。
双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。假设有一个开发者自己编写了一个名为 Java.lang.Object 的类,想借此欺骗 JVM。现在他要使用自定义 ClassLoader 来加载自己编写的 java.lang.Object 类。然而幸运的是,双亲委托模型不会让他成功。因为 JVM 会优先在 Bootstrap ClassLoader 的路径下找到 java.lang.Object 类,并载入它。
16.javac的参数一览
17.在来一张Java中的集合关系表供参考:
18.Java中存根类是一个类,它实现了一个接口,它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。
RMI(Java Remote Method Invocation,中译为Java远程方法调用)采用 stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的。每个远程对象都包含一个代理对象 stub,当运行在本地Java虚拟机上的程序调用运行在远程Java虚拟机上的对象方法时,它首先在本地创建该对象的代理对象 stub, 然后调用代理对象上匹配的方法。每一个远程对象同时也包含一个 skeleton 对象,skeleton 运行在远程对象所在的虚拟机上,接受来自 stub 对象的调用。这种方式符合等到程序要运行时将目标文件动态进行链接的思想。
19.synchronized 关键字 : 用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。
20.ServletContext对象:servle t容器在启动时会加载 web 应用,并为每个 web 应用创建唯一的 servlet context 对象,可以把 ServletContext 看成是一个 Web 应用的服务器端组件的共享内存,在 ServletContext 中可以存放共享数据。ServletContext 对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。整个 web 应用只有唯一的一个ServletContext 对象。
ServletConfig对象:用于封装servlet的配置信息。从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对servlet自身有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
21.Super 代表父类对应的对象,所以用 super 访问在子类中无法直接使用的父类成员和方法。子类不可以继承父类的构造方法,只可以调用父类的构造方法。
22.多种混合计算时,自动将所有数据类型转换为容量最大的一种数据类型。
23.一个类可以不定义构造方法,在这种情况下,类中隐含定义一个方法体为空的无参构造方法。这个构造方法称为默认构造方法,当且仅当类中没有明确定义任何构造方法时才会自动提供它。这里说明构造方法可以默认提供而不显式定义。
而类必须有构造方法来初始化用;可见性修饰符方面,使用private也是可以的,能有一些特殊的作用比如在单例模式下。关于单例模式的介绍可以参考一下老四写的《浅析设计模式第二十一章之单例模式 值得收藏》这篇文章。
24.局部内部类是放在代码块或方法中的,不能有访问控制修饰符,且不能用static修饰。
25.待续。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。