Java基础知识点

Java基础知识点

1.方法重载和重写的区别

方法重载:

  • 同一个类中的方法,方法名相同,返回值可以相同可以不同 ,参数列表必须不同
  • 发生在编译期,在编译期确定执行哪个方法

方法重写:

  • 指的是子类重新定义父类已经定义过的方法,方法的签名必须完全相同(包括返回值、方法名、参数列表)
  • 发生在运行期,是多态的体现

2.IO流中为什么要有字节流和字符流?

IO流中提供了一个直接操作字符的接口,方便我们对字符进行流操作

如果是音频文件、图片等媒体文件用字节流比较好

如果涉及到字符的话,比如说中文,使用字符流比较好

3.IO中的缓冲流知道吗?

IO中有字节缓冲流和字符缓冲流

它属于是设计模式中的装饰器模式,在不改变原有对象的情况下,来增强子类的功能

使用缓冲流,可以把数据加载至缓冲区,一次读取、写入多个字节,降低IO次数

使用缓冲流的作用主要体现在read()和write(int b),不带字节数组的方法的时候,使用缓冲流的话可以显著提高性能。

为什么会提高性能呢?其实就是缓冲流中自带的有缓冲区,缓冲区是一个字节数组,可以把读取、写入的字节先放到缓冲区,再一次性地进行IO,降低IO次数。

4.IO模型

IO模型分为:阻塞IO、非阻塞IO、IO多路复用

  • 阻塞IO:当用户进程发起read()请求,因为用户进程不能够直接访问内核空间,所以用户进程会阻塞等待,当内核经过准备数据、数据就绪、将数据从内核空间复制到用户空间,用户进程解除阻塞接收数据。

  • 非阻塞IO:也是用户进程发起read()请求向内核要数据,如果内核没有返回数据的话,用户进程也不会阻塞,它会反复不断发起read()请求的调用。等待数据从内核拷贝到用户空间的时候,线程依旧是阻塞的,直到拷贝完成

  • IO多路复用:IO多路复用模型中,线程先发起select请求,询问内核数据是否准备就绪,当数据准备就绪,线程会发起read()请求,数据从内核空间拷贝到用户空间仍然是阻塞的。

  • AIO:异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

5.String

String为什么是不可变的?

答出来两点就好了:

  • 保存字符的字符数组是被final修饰的且为私有的,并且没有提供set方法。
  • String类是被final修饰的,避免了从子类进行破坏。

字符串常量池了解吗?

字符串常量池是一种池化技术,作用就是复用、减少空间消耗。

在JDK 1.7 之前位于堆上,之后位于直接内存。

在创建字符串的时候,会现在堆上找有没有相同的,有的话只需要在栈上创建引用,再指向常量池。

没有的话创建常量池,在栈上创建引用指向它。

6.反射了解吗?

反射的作用是赋予了在运行时动态获取类的方法和属性的能力,而且可以调用类的方法和属性。

平常我们写业务代码是很少用到反射的,但是在框架上反射用的很多

比如动态代理,注解也使用了反射机制

这就是基于反射分析类,在运行时拿到类上、方法上、参数上的注解信息。

再根据注解信息进行下一步的处理

7.获取class对象的四种方式

如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象:

1. 知道具体类的情况下可以使用:

java 复制代码
Class alunbarClass = TargetObject.class;

但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化

2. 通过 Class.forName()传入类的全路径获取:

java 复制代码
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

3. 通过对象实例instance.getClass()获取:

java 复制代码
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();

4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取:

java 复制代码
ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject");

通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行


.loadClass("cn.javaguide.TargetObject");

复制代码
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行

------

著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/java/basis/reflection.html
相关推荐
ZHE|张恒3 分钟前
Spring Boot 3 + Flyway 全流程教程
java·spring boot·后端
TDengine (老段)27 分钟前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
心随雨下1 小时前
Tomcat日志配置与优化指南
java·服务器·tomcat
Kapaseker1 小时前
Java 25 中值得关注的新特性
java
wljt1 小时前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动1 小时前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
canonical_entropy1 小时前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert3181 小时前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式
不是株1 小时前
JavaWeb(后端进阶)
java·开发语言·后端