目录
- 面向对象
- Java跨平台原理
- Java和c++相比它的语言特点?Java单继承和c++多继承的好处坏处?
- Java 类初始化采用什么顺序呢?
- 什么是构造函数?什么是构造函数重载?构造器能否被重写?
- 抽象类和接口有什么区别? 分别都在什么时候使用?什么情况下继承抽象类可以不用实现它的声明方法
- 请说明类和对象的区别?
- 异常
- &(按位与)和&&(短路与)的区别
- 什么是JDK?什么是JRE?什么是JVM?
- super 关键字的作用?static关键字的作用?final关键字的作用?
- finally 是不是一定会被执行到?
- 八种基本数据类型和占用的大小:star:
- 深拷贝和浅拷贝:star:
- 新特性
- 反射机制
- String
- Object类的常见方法:star:
- 什么是值传递和引用传递
- == 比较的是什么
- Java 的泛型是如何工作的 ? 什么是类型擦除 ?
- 有哪些IO类
面向对象
什么是面向对象,你怎么理解,和面向过程的区别?
把数据及对数据的操作方法放在一起,作为一个相互依存的整体。
把每种事物都看成是整体,所谓整体就是由一系列属性和行为组成,例如人,你可以看成由胳膊,腿,等属性,组成的对象。跑和跳则可以看做方法。
面向对象:便于模块化,结构化。面向过程:着眼局部或者具体。
面向对象的三大特性?分别解释下?
封装:把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。
继承:从已有类得到继承信息创建新类的过程。
多态:分为编译时多态(方法重载)和运行时多态(方法重写)。
要实现多态需要做两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象。
重载和重写的区别?⭐️
重写是父类与子类之间多态性的体现,而重载是一个类的行为的多态性的体现
-
重载,编译时多态,在一个类里面,方法名字相同,而参数不同。
-
重写,也叫覆盖,运行时多态,重写发生在子类与父类之间
两同:方法名,参数列表相同
两小:返回值类型和声明异常类型,子类小于等于父类
一大:访问权限,子类大于等于父类
Java跨平台原理
由源文件(.java)编译成字节码文件(.class),一次编译到处运行
虚拟机作用:将字节码文件解释成对应平台机器码并执行
Java和c++相比它的语言特点?Java单继承和c++多继承的好处坏处?
摒弃指针
单继承
自动内存管理
单继承:方便简洁
多继承:使用复杂麻烦
Java 类初始化采用什么顺序呢?
初始化父类中的静态成员变量和静态代码块
初始化子类中的静态成员变量和静态代码块
初始化父类中的普通成员变量和代码块,再执行父类的构造方法
初始化子类中的普通成员变量和代码块,再执行子类的构造方法
什么是构造函数?什么是构造函数重载?构造器能否被重写?
新对象被创建的时候会调用构造函数,每个类都有构造函数
可以为一个类创建多个构造函数,但是要保证每个构造函数都有唯一的参数列表。
不能
抽象类和接口有什么区别? 分别都在什么时候使用?什么情况下继承抽象类可以不用实现它的声明方法
相同点:都不能被实例化
不同点:
-
接口只有方法的定义,不能有方法的实现,java 1.8中可以用default或static定义方法体,而抽象类可以有定义与实现
一个类可以实现多个接口,但只能继承一个抽象类。 -
接口强调特定功能的实现,而抽象类强调所属关系
-
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。
抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号
只需实现它的抽象方法
请说明类和对象的区别?
- 类是对某一类事物的描述,是抽象的;
- 对象是表示的一个具体的个体,是类的一个实例
异常
throw 和 throws 的区别?
- throw:在方法体内部,表示抛出异常,由方法体内部的语句处理;throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例;
- throws:在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理;表示出现异常的可能性,并不一定会发生这种异常。
异常和错误的关系
???
常见的异常类有哪些?
NullPointerException
ArrayIndexOutOfBoundsException
FileNotFoundException
SQLException
IOException
IndexOutOfBoundsExecption
IllegalArgumentException
&(按位与)和&&(短路与)的区别
&:无论左边表达式执行结果如何,都会执行右边
&&:左边不符合时,右边不执行
什么是JDK?什么是JRE?什么是JVM?
JVM是Java平台的基础,将字节码文件解释成对应平台机器码并执行
JDK:它能够创建和编译程序。它包含 JRE,还有编译器(javac)和工具(如 javadoc)。
JRE: 运行已编译 Java 程序,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。
super 关键字的作用?static关键字的作用?final关键字的作用?
子类中显式调用父类方法或变量,但是必须处于第一行
static 关键字可以用来修饰属性、方法、内部类、代码块;修饰的资源属于类级别,是全体对象实例共享的资源;
用来修饰一个引用
如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
修饰方法表示无法被重写
修饰类表示无法被继承
finally 是不是一定会被执行到?
不一定
- 当程序进入 try 块之前就出现异常时,会直接结束,不会执行 finally 块中的代码;
- 当程序在 try 块中强制退出时也不会去执行 finally 块中的代码,比如在 try 块中执行 exit 方法
八种基本数据类型和占用的大小⭐️
原始类型:byte(1),short(2),int(4),long(8),float(4),double(8),boolean,char(2)
包装类型
Boolean,Character,Byte,Short,Integer,Long,Float,Double
深拷贝和浅拷贝⭐️
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
新特性
Lambda 表达式
前提:接口有且只有一个方法须要重写
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("The runable now is using!");
}
}).start();
//用lambda
new Thread(() -> System.out.println("It's a lambda function!")).start();
反射机制
四种方式获取 Class 对象
- 知道具体类的情况下可以使用:Class alunbarClass = TargetObject.class;
- 通过 Class.forName()传入类的路径获取:Class alunbarClass1 = Class.forName(“cn.javaguide.TargetObject”);
- 通过对象实例instance.getClass()获取:Employee e = new Employee();
Class alunbarClass2 = e.getClass(); - 通过类加载器xxxClassLoader.loadClass()传入类路径获取:class clazz = ClassLoader.LoadClass(“cn.javaguide.TargetObject”);
哪些地方用到了反射,它的优缺点
反射是框架设计的灵魂,
JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序
Spring框架中xml的配置模式
- 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
- 缺点: 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
String
String可以修改吗
不可改变类型,每次值发生改变,都会创建一个新的对象
StringBuilder和StringBuffer的区别⭐️
StringBuffer 线程安全(在append()方法上使用了synchronized) StringBuilder 执行效率高
常用的方法有哪些⭐️
indexOf():返回指定字符得索引
charAt():返回指定索引处得字符
repalce():字符串替换
trim():去除字符串两端的空白
split():分割字符串 返回分割后的字符串数组
getBytes():返回字符串的 byte 类型数组
length():返回字符串的长度
toLowerCase():字符串转小写
toUpperCase():字符串转大写
substring():截取字符串
equals():字符串比较
final修饰 StringBuffer 后还可以 append 吗
可以,final 修饰的是一个引用变量,那么这个引用始终指向这个对象,但这个对象内部的属性是可以改变的
String 字符串修改实现的原理
当 String 修改字符串的时候会创建一个 StringBuilder 对象,调用 append 方法,最后通过 toString 方法返回
String str = new String(“abc”)创建几个对象
首先要看常量池里是否有“abc”这个字符串,如果有,则创建一个,如果没有,则创建两个
i++线程安全吗
Object类的常见方法⭐️
getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
hashCode()//native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。
equals()//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。
clone()
toString()
notify()
notifyAll()
wait()
finalize()//实例被垃圾回收器回收的时候触发的操作
什么是值传递和引用传递
值传递:传递的是变量的一个副本,改变副本不影响原变量
引用传递:传递的是对象地址的一个副本,对引用对象操作影响原变量
== 比较的是什么
是对象的的话就比较引用
基本数据类型的话,则比较值是否相等
Java 的泛型是如何工作的 ? 什么是类型擦除 ?
泛型使得数据的类型可以通过参数传递过来,它提供了一种扩展能力,更符合面向对象思想。
当具体的类型确定之后,泛型还提供了类型检测机制,不符合的类型不允许赋值,否则编译不通过。
所以类型擦除就是在进入 JVM 之前,与泛型相关的信息会被擦除掉,这些信息被擦除后,相应的类型就会被替换成泛型类型参数的上限,如果没有指定,则替换成 Object。
有哪些IO类
按数据类型分
- 字节流InputStream、OutputStream(可通过缓冲流BufferedInputStream和BufferedOutputStream提升性能)
- 字符流Reader、Writer(可通过BufferedReader和BufferedWriter提升性能)
将a.txt文件中的单词与b.txt文件中的单词交替输出到控制台