JAVA面向对象有哪些特征
封装
封装是指将对象属性和方法打包在一个类中,只向外界暴露必要的接口,它通过访问修饰符来控制访问权限。
- Public:可以在程序的任何地方访问
- Private:只能在类内访问
- Protected:可以在类内、子类和同一包中访问
- 默认:包私有,只能在同一包中访问
继承
继承是指一个类继承另一个类的属性和方法
- this和super的区别:this是指当前对象的实例(实例变量与形参相同时),引用当前对象的实例变量;调用当前对象的构造函数;返回当前对象的引用。super是引用父类对象,访问和调用父类属性和方法。
多态
多态允许一个接口或者方法在不同类中有不同的实现,它依靠方法重载和方法重写来实现。
- 方法重载:发生在一个类的内部,要求函数的参数列表不同(类型、顺序、个数);返回值的类型可以相同也可以不同。
- 方法重写:发生在父类和子类直接,子类重写父类方法,要求参数列表必须相同;返回类型可以相同或者子类返回类型是父类返回类型的子类型;子类访问级别不能比父类更低;子类抛出异常不能比父类更广泛。
抽象
抽象是指将对象的共性提取出来定义一组通用的行为或者属性,不关心具体的实现细节。
- 抽象类(abstract):不能被实例化的类;可以包含抽象方法和具体方法;可以有成员变量和构造方法。
- 接口(interface):只包含抽象方法(Java 8以后有默认方法),它定义一组方法,这些方法必须由实现接口类完成。没有成员变量;一个类可以实现多个接口。
- 抽象类用于提供一组相关类的属性和方法,接口用于定义类应该实现的行为规范。
final关键字
final表示最终的,不可改变的。当它修饰类的时候表示这个类不能被继承(String类);修饰方法的时候表示方法不能被重写;修饰基本数据类型的时候表示该变量为常量,不能修改;修饰引用数据类型时,表示引用对象不变,但是对象的值可以改变。
String为什么使用final修饰
- String是不可变类型,它是线程安全的。
- String的使用范围太广泛,如果可以对它修改会导致安全问题。
- String不能被继承,如果继承会破坏它的不可变。
Static关键字
static关键字用于定义静态变量、静态方法和静态代码块。它减少了内存的使用,因为所有对象共享一个静态成员。
- 静态变量:属于类,可以直接通过类名进行访问;无论创建多少对象,静态变量在内存中只有一个副本,所有对象共享这个副本;在类加载时初始化,程序执行期间一直存在。
- 静态方法:属于类,可以通过类名直接访问;只能访问静态变量和调用静态方法,因为它在对象实例创建前已经存在。
- 静态代码块:类加载时运行,用于初始化静态变量。
String创建字符串对象的方式
- 使用字符串常量池:JVM在字符串常量池中查找有没有相同的值,如果有则返回引用,如果没有先创建一个放在字符串常量池中再返回引用。
- 使用new创建:在堆内存中创建一个,即使有内容相同的值也创建。
字符串常量池的作用
- 避免重复创建相同对象。
- 在字符串常量池中,相同的字符串使用同一个引用,可以实现快速比较。
- 因为减少在堆空间中创建对象,所以减少垃圾回收压力。
String中常用方法
length():求长度;chatAt():求指定索引处的字符;substring():求子串;repalce():替换;trim():去掉前后空白;split():划分字符串
JDK和JRE的区别
- JDK:JAVA开发工具,包含开发和调试JAVA程序所需要的工具和资源,它由JRE、开发工具和API组成,用于开发编译调试工具,供开发者使用。
- JRE:JAVA的运行环境,提供了运行JAVA程序的所需要的库、JVM和其他组件;JVM:JAVA虚拟机,解释和执行JAVA字节码,用于运行JAVA程序,供用户使用。
continue、break和return的区别
- continue:跳过当前循环,立即进入下一次的循环。
- break:退出循环结构
- return:终止当前方法的执行,直接返回结果
JAVA中的IO流
- 字节流,可以分为字节输入流(InputStream)和字节输出流 (OutputStream);其中字节输入流有FileInputStream和DataInputStream,字节输出流有FileOutputStream和DataOutputStream。
- 字符流,可以分为字符输入流(Reader)和字符输出流(Writer);其中字符输入流有FileReader和DataReader,字节输出流有FileWriter和DataWriter。
- 节点流,直接与数据源或者目的地连接,FileInputStream,FileOutputStream
- 过滤流,在已经存在的流上构建,提供额外的功能,如缓冲和数据格式转换,DataInputStream,DataOutputStream
File中常用方法
createFile()创建文件;createDirectory()创建目录;delete()删除文件;copy()复制文件;move()移动文件;readAllbytes()读取文件所有字节;readAlllines()读取文件所有行;write()文件写入;list()遍历文件;watch()监控文件;
面向对象和面向过程编程
- 面向对象:使用对象和类封装数据的行为,通过对象之间的交互实现程序功能;可以重复使用代码;通过类和对象将程序划分为独立模块,提高代码可维护性;代码更加灵活,易于扩展和修改。
- 面向过程:通过一系列步骤和函数来处理数据和实现功能,从上到下按照顺序执行;简单直观,效率高。
深拷贝和浅拷贝
- 深拷贝:复制对象本身和引用类型指向的对象,引用类型指向不同的对象,对象之间完全独立;改变对象引用不会对复制前的对象有影响。
- 浅拷贝:复制对象本身和非引用对象,对于引用类型直接复;改变对象引用对复制前的对象有影响。
JAVA中的异常
JAVA中的异常父类为Throwable类,它里面包含Error和Exception。Error是指严重错误,程序无法控制和恢复,如内存溢出,栈溢出。Exception是指可以通过捕获来恢复程序,它包含受检异常(在编译时必须处理,如IO异常、SQL异常)和非受检异常(运行时异常,编译时不要求处理,如空指针、数组边界)
处理异常的过程
在JAVA中可能是通过一系列方法的调用才会抛出异常,这些方法称为调用栈。JAM会顺着调用栈查看是否有可以处理异常的代码,如果有则调用处理,如果没有则交给默认的异常处理器,默认异常处理器会打印异常信息并终止程序。一般通过try-catch-finally和try-with-resources来处理异常。try-with-resources能够确保资源不再被需要的时候正确关闭,减少了忘记资源的可能性,避免了资源泄露。
finally在以下情况不会被执行
- 在finally语句块中发生异常
- 在前面代码中使用System.exit()退出程序
- 程序所在线程死亡
反射
反射是指在运行时,对于给定类的名字可以得到这个类的所有信息。它的常见用途是:动态调用方法;动态创建对象;访问和修改字段;查看注解。
- 优点:轻松获取类的信息;提高代码的复用性;增加程序灵活性,在运行时动态对类进行修改。
- 缺点:会绕过一些限制访问属性;可读性差;动态解析性能差。
反射的使用场景
- 在JDBC连接数据库时,使用反射加载数据库驱动文件。
- 使用反射将XML文件装载Bean文件。