1、面向对象与面向过程区别。
面向对象:
将事务高度抽象化的编程模式。 占用资源低,速度快
面向过程:
自顶而下的编程模式。 占用资源高,速度慢
2、面向对对象三大特性
封装:把客观事物封装成抽象的类,在一个对象内部,某些数据是私有的,不能被外界访问,对内部数据提供了不同级别的保护。
继承:可以使现有类的所有功能,在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:一个类实例的相同方法在不同情形有不同的形式。
3、面向对象五大原则
单一职责原则
开放封闭原则
里氏代替原则
依赖倒置原则
接口隔离原则
4、instanceof关键字作用
instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:
boolean result = obj instanceof Class
其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或
间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定
类型,则通过编译,具体看运行时定。
int i = 0;
System.out.println(i instanceof Integer);//编译不通过i必须是引用类型,不能是基本类型
System.out.println(i instanceof Object);//编译不通过
Integer integer=new Integer(1);
System.out.println(integer instanceof Integer);//true
//false,在JavaSE规范中对instanceof运算符的规定就是:如果obj为null,那么将返回false。
System.out.println(null instanceof Object);
5、隐式转换和显式转换
隐式转换:大范围的变量能够接受小范围的数据。
显式转换:把一个大类型的数据强制复制给小类型的数据。
隐式转换和显示转换其实就是自动类型转换和强制类型转换。
6、char类型能不能转成int类型,String,double
Char在java中也是比较特殊的类型,它的int值从1开始,一共有2的16次方个数据;
Char<int<long<float<double;Char类型可以隐式转成int,double类型,但是不能隐式转换成string;如果char类型转成byte,short类型的时候,需要强转。
7、基本数据类型
8种
整型:byte,short,int,long(默认值都是0)
浮点型:float,double(默认0.0)
字符型:char(默认‘’)
布尔型:boolean(默认false)
8、什么是拆装箱
装箱:自动将基本数据类型转换成为包装类型(int → Integer);调用方法:Integer的valueOf(int)方法。
拆箱:自动将包装器类型转换为基本数据类型(Integer → int)。调用方法:Integer的intValue()方法。
9、访问修饰符
修饰符 | 当前类 | 同包 | 子类 | 其他包 |
---|---|---|---|---|
public | 能 | 能 | 能 | 能 |
protected | 能 | 能 | 能 | 不能 |
default | 能 | 能 | 不能 | 不能 |
private | 能 | 不能 | 不能 | 不能 |
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开public,对于不是同一个包中的其他类相当于私有private。受保护(protected)对子类相当于公开,对不是同一个包中的没有父子关系的类相当于私有。java中,外部类的修饰符只能是public或者默认,类的成员(包括内部类)的修饰符可以是以上四种。
10、float f = 3.4是否正确
3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型,会造成精度损失。
11、short s1 = 1;s1 = s1+1和short s1 = 1;s1+=1
对于short s1 = 1;s1 = s1+1,由于1是int,因此s1 + 1运算结果也是int型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1+=1,可以正确编译。因为s1+=1,相当于s1 = (short)(s1+1)其中有隐含的强制类型转换。
12、重载和重写
重载:
重载overload是一个类中多态性的一种表现
重载要求同名方法的参数列表不同
重载的时候,返回值类型可以相同也可以不同。无法以返回型作为重载函数的区分标准
重写:
发生在父类与子类之间方法名,参数列表,返回类型必须相同
访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
13、equals与==区别
equals:
比较两个对象的内容是否相等
==:
==比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
14、i++与++i区别
i++:先赋值,后计算
++i:先计算,后赋值
15、实参与形参
实参(argument):
全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
形参(parameter):
全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
例如:todo
16、static关键字
static可以修饰内部类、方法、变量、代码块
static修饰的类是静态内部类
static修饰的方法是静态方法,表示该方法属于当前类的,而不属于某个对象,静态方法也不能被重写,可以直接使用类名来调用,在static方法中不能使用this或者super关键字
static修饰变量是静态变量或者叫类变量,静态变量是被所有实例所共享,不会依赖于对象。静态变量在内存中只有一份拷贝,在jvm加载类的时候,只为静态分配一次内存。
static修饰的代码块叫静态代码块,通常同来做程序优化的,静态代码块中的代码在整个类加载的时候只会执行一次。静态代码块可以有多个,如果有多个,按照先后顺序依次执行。
17、final
被final修饰的类不能被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可变,引用指向的内容可变
被final修饰的方法,jvm会尝试将其内联,以提高运行效率
被final修饰的常量,在编译阶段会存入常量池
18、String,StringBuffer,stringBuilder
String:只读字符串,被final修饰,每次对String的操作都会生成新的String对象
StringBuffer和StringBuilder都继承了AbstractStringBulder类,在做字符串拼接修改删除替换时,效率比String更高。
StringBuffer是线程安全的,加了synchronized关键字
String str = “aaa”与String str = new String(”aaa”)区别
todo
19、Java创建对象有几种方式
new
反射
clone
序列化机制(调用java.io.ObjectInputStream对象的 readObject()方法。)
20、集合
HashMap
为什么是0.75
为什么扩容是2的倍数
红黑树
21、java提供了哪些io方式?NIO如何实现多路复用
同步阻塞io/BIO
同步非阻塞io/NIO
异步非阻塞io/AIO