1.21. 面向对象的特性(oop特性)
三大特性:封装(降低耦合),继承,多态
封装:把数据隐藏起来,对数据私有化,只对外提供get和set方法
权限修饰符
修饰符 | 在本类中 | 同一个包下的其他类里 | 任意包下的子类里(不是创建的子类对象里) | 任意包下的任意类里 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protrcted | √ | √ | √ | |
public | √ | √ | √ | √ |
继承:提高代码的复用,或者是对父类不满意的代码重写
- 子类拥有父类非private的属性和方法(构造方法也除外)
- 子类可以拥有自己的属性和方法,即拓展
- 子类可以用自己的方式实现父类的方法
多态:多态主要是用来实现动态联编的,换句话说,就是程序的最终形态是由运行时决定的,而非编译时决定,即声明的引用变量最终会指向哪个实例对象
1.22. 重写和重载的区别
重写(Override):把父类中有的方法重新写一遍
- 子类函数的访问修饰权限不能小于父类
- 方法名,参数列表,返回类型子父类一致
- 发生的前提是有继承关系
重载(Overload):相同名称的方法有不同的参数类型或者参数个数
- 返回类型无要求
- 是多态性的一种表现
1.23. try. catch、finally执行顺序
- 不管有没有出现异常,finally代码块都会执行;
- 不管try和catch的代码块中有return时,finally仍会执行,且如果finally代码块也有return,则此代码肯定会返回finally执行的return值。
- 先执行try,有异常则执行catch,()不管有没有异常然后执行finally
1.24. 为什么使用接口,接口的好处
- 定义时不需要考虑接口中方法如何实现
- 接口可以做到多继承
- 不暴露对象的类,只暴露对象的编程接口
1.25. 谈一谈对反射的了解
- 程序运行时动态加载类并获取类里的属性和方法
- 本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
1.26. 有什么办法可以把方法区内存撑爆
-
固定方法区大小小一些,就容易爆
-
加载大量的第三方jar包
-
大量动态生成反射类
1.27. 如何查看gc日志,主要关注哪些内容?
- 打开 Java 虚拟机(JVM)的启动参数:在启动应用程序的命令行或脚本中,找到包含 JVM 参数的部分。
- 添加 GC 日志参数:在 JVM 参数中添加以下参数之一来启用 GC 日志记录:
-verbose:gc
:打印简要的 GC 日志信息。-Xloggc:<filename>
:将 GC 日志写入指定的文件中。文件名可以是绝对路径或相对路径。
- 设置 GC 日志文件的位置:如果您使用了
-Xloggc
参数,请确保指定的文件路径存在,并对应用程序具有写入权限。 - 启动应用程序:使用修改后的 JVM 参数启动您的应用程序。
- 分析 GC 日志:一旦应用程序运行并生成 GC 日志文件,可以使用以下工具之一来分析日志:
- GCViewer:一个开源的 Java GC 日志分析器。
- GCToolkit:适用于 OpenJDK 的 GC 日志分析和可视化工具。
在查看 GC 日志时,会关注以下内容:
- GC 类型:标记-清除、标记-整理、复制、分代等。
- GC 时间:GC 执行的时间长度,以及每个 GC 阶段的耗时。
- GC 停顿时间:应用程序停止响应的时间,因为 JVM 在执行 GC 操作时会暂停应用程序线程。
- 堆内存使用情况:包括堆的大小、已使用的空间、空闲的空间等。
- 对象回收统计:包括垃圾对象的数量、被回收的对象的类型等。