Java基础学习
一.Java概述
Java是一门面向对象的语言,不仅吸收了c++语言的各种优点,还摒弃了c++的多继承,指针等概念
1. JDK,JRE,JVM的区别
JDK:Java标准开发包,包括JRE和Java开发工具
JRE:Java运行环境,包括JVM和Java核心类库
JVM:Java虚拟机
2.Java语言的特点
入门难,后期容易
面向对象
支持多线程
跨平台性
3.什么是跨平台性,原理是什么
跨平台性值得是一次编译到处运行,就比如说,我们写一段Java代码,不管是在windows上还是Linux上都能运行,只要对应的操作系统提供了相应的JVM,因为Java程序会被编译成字节码文件,而字节码是运行在虚拟机上的,所以这就是Java的跨平台性
4.什么是字节码,采用字节码的好处是什么
字节码就是.class文件,是由Java文件编译后得到,字节码文件只依赖于虚拟机,是在虚拟机上执行的.
5.Java数据类型(8大基本数据类型,引用数据类型)
基本数据类型:byte short int long float double boolean char
引用数据类型:类 接口 数组
类型 | 类型名称 | 关键字 | 占用内存 | 取值范围 | 变量默认值 |
---|---|---|---|---|---|
整型 | 字节型 | byte | 1字节 | -128-127 | 0 |
整型 | 短整型 | short | 2字节 | -32768-32767 | 0 |
整型 | 整型 | int | 4字节 | -231-231-1 | 0 |
整型 | 长整型 | long | 8字节 | -263-263-1 | 0L |
浮点型 | 单精度浮点型 | float | 4字节 | -3.403E38-3.403E38 | 0.0F |
浮点型 | 双精度浮点型 | double | 8字节 | -1.798E308-1.798E308 | 0.0D |
布尔型 | 布尔型 | boolean | 1字节 | true/false | false |
字符型 | 字符型 | char | 2字节 | 表示一个字符(‘a’) | ‘\u0000’ |
6.switch都能作用在什么上
byte short int char String(jdk1.5) 枚举(jdk1.7)
7.最有效的方法计算2乘以8
2<<3
8.Math.round(11.5) (-11.5)
12 -11
9.float f = 3.4是否正确,为啥
不正确,因为3.4默认为double类型的,要想转化成float类型的话就需要强转float f = (float)3.4或者float f = 3.4f
10.short s1 = 1;s1 = s1+1
错误的,因为byte short char 运算结果默认为int类型,所以不能把int类型直接赋值给short类型
11.s1 += 1
正确,因为+=操作内部默认强转了
12.Java语言用什么编码方式,有什么特点
unicode
每一个字符都具有一个对应的unicode值,在任何语言都不冲突
13.访问修饰符4种
private:只能在本类中访问
default:在同一个包内能访问
protected:在同一个包或者不同包的子类中能访问
public:在全局都能访问
14.&和&&的区别
&&:假如前面的表达式为false就不执行后面的了直接返回false,前面的表达式为true,才会执行后面的表达式,如果后面的表达式为false,返回false,如果后面的表达式返回ture,结果返回true
&:无论前面的表达式结果如何,都要执行后面的表达式
15.Java关键字和保留字
关键字就是已经被java内部使用了的,比如class public等
保留字就是暂时还没使用,以后可能用得到,比如true false等
16.final,finally,finallize的区别
final:表示最终的,修饰的类不能被继承,修饰的方法不能被重写,修饰的变量就成为了常量
finally:通常和try-catch同步使用,finally里面的语句一定会被执行,通常用来关闭一些资源
finallize:它就是Jvm垃圾回收的最后一道防线,当我们执行system.gc()的时候,底层会调用finallize()来判断是否真的要回收垃圾
17.this 和 super
this:代表当前对象,可以调用当前类的方法,还可以在构造方法中使用,来区别形参和本类参数,还可以通过this()来调用本类额的构造方法
super:指代父类的资源,可以使用super.父类的属性或方法来进行调用,还可以使用super()来调用父类的构造,不过子类的构造函数里面已经默认调用了父类的构造函数
18.static
所谓static见名知意,静态的
被static修饰的变量成为静态变量,修饰的方法成为静态方法,代码块是静态代码块,他们都是在类加载的时候就被加载,并且全局只被加载一次,static存在的意义就是为了减少多次没必要的执行耗费资源,比如说创建数据库连接池一次就可以,就可以放到static代码块里面执行一次就好,还有就是在static方法中可以直接通过方法名引用静态方法,但是不能直接引用非静态方法,只能通过new一个对象,然后通过对象调用…
19.流程控制(break,continue,return)
break:结束循环
continue:结束当前的循环,进行下一次循环
return:结束方法
20.面向对象三大特性分别说一下
封装:封装指的是把一些属性都放到一个类中,私有化,对外只暴露方法getset,供外界调用
继承:继承就是子类继承父类,通过extends关键字,可以重写父类的方法,添加自己的特性
多态:多态指的就是编译时的类型和运行时的类型不同,就比如Person p = new Student();
编译时的类型是Person,运行时的类型是Student
21.面向对象五大基本原则
1.开闭原则:对扩展开放,对修改关闭
2.职责单一原则
3.里式替换原则:就是子类可以代替父类去一些需要父类的场景
4.依赖倒置原则:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象
5.接口分离原则
22.抽象类和接口的区别
抽象类用abstract修饰,接口用interface修饰
抽象类和接口都不能实例化
抽象类里面可以有抽象的方法和普通的方法
接口里可以有抽象的方法和默认的方法(java8新特性)
抽象类是用来被继承的,接口是用来被实现的
抽象类里面可以有构造方法,接口中不能有构造方法
23.普通类和抽象类的区别
普通类可以被实例化,抽象类不能被实例化
普通类里面不能有抽象方法,但是抽象类里面可以有普通的方法
24.成员变量和局部变量的区别
成员变量声明在类的内部方法外部,局部变量声明在方法的内部
成员变量随着类的创建而创建,放在堆中,局部变量是随着方法的调用而创建,放在栈中
成员变量等到这个对象被回收时才销毁,局部变量调用完这个方法就出栈
成员变量可以不赋值有默认值,局部变量必须赋值,么有默认值
25.无参构造的作用
可以初始化子类,当一个类继承另一个类的时候,就有了父子关系,子类初始化首先要调用父类的构造方法,如果此时父类只有有参数的构造方法而没有无参构造,那么子类只能调用父类的有参构造,如果子类没写出来父类的有参构造,就会报错
26.静态变量和实例变量的区别
静态变量随着类的加载而加载,实例变量随着对象的创间而创建,
静态变量全局只被加载一次,实例变量对象创建几次就会创建几次
静态变量可以通过类名.属性名调用,实例变量通过对象名.属性名
27.静态方法与实例方法的区别
静态方法也被称为类方法,在类加载的时候就被加载,并且全局只加载一次
实例方法是对象创建就被加载
静态方法可以直接通过类名.方法名来调用
实例方法只能是通过对象名.方法名来调用
在静态方法中调用实例方法只能先实例化,在调用
因为静态方法是优先于实例方法加载的,有了静态方法之后还不一定存在实例方法
28.内部类有几种(4,分别介绍)
静态内部类:声明为static的内部类
局部内部类:在方法中的类
匿名内部类:没有名字的内部类
成员内部类:普通的内部类
29.重写和重载(解释全)
重写必要条件就是继承,子类重写父类的方法,可以添加自己的特性,方法名相同,参数列表相同,返回值不能比父类的返回值范围更小,权限修饰符不能大于父类,不能抛出比父类更大的异常
重载就是发生在同一个类中的,方法名相同,参数列表不同,其他的无所谓
30.==和equals区别
== 比较两个基本数据类型的大小是否相等,或者比较两个引用类型的地址是否相等
equals:在没有被重写之前和 ==是一样的,重写之后就是比较两个引用类型的内容是否相等
31.hashcode和equals
hashcode相同时equals不一定为true,因为存在hash冲突
32.Java的IO流分为几种
按照流向分可以分为输入流和输出流
按照单元分可以分为字节流和字符流
按照角色分可以分为节点流和处理流
33.BIO,NIO,AIO区别
简答:
BIO:就是我们平时说的IO同步阻塞IO,并发能力低
NIO:BIO的升级,同步非阻塞IO,客户端和服务器通过通道通讯,实现了多路复用
AIO:NIO的升级,异步非阻塞IO,更厉害了
34.Files的方法
exists():判断文件存在否
createFile():创建文件
delete():删除
copy():复制
move():移动
write():写
read():读
35.说说反射和反射获取的三种方式
反射就是只程序在运行中动态的获取一个类中的所有属性和方法
优点:非常的灵活
缺点:效率低,因为操作JVM告诉JVM要执行哪些指令,比普通的java代码效率低
场景:
通过反射加载数据库的驱动程序Class.forName()
反射是框架设计的灵魂,比如Spring通过XML配置模式装载bean的过程:
将程序中的所有xml或properties文件载入内存中,Java类里面解析XML或properties里面的内容,得到对应实体类的字节码以及相关的属性信息,然后通过反射机制,动态配置实例的属性
36.常量池是什么
常量池存在于堆中,是为了方便存取,避免重复创建,创建字符串时候,JVM首先会去常量池中寻找,对于一些已有的字符串,直接在常量池中取出,而不需要在创建新的
37.String特点
不可变,因为底层使用了final修饰了一个char类型的数组
38.String类的常用方法有哪些
length():字符串长度
indexOf();返回指定字符的索引
equals():比较两个字符串是否相等
replace():替换
subString();截取
39.为什么HashMap的key使用String
因为String是不可变的,HashMap的Key是唯一的,所以使用String类型作为key就减少了不必要的HashCode比对,就提高了性能
40.String,StringBuffer,StringBuilder的区别
String是不可变的,StringBuffer和StringBuilder是可变的
StringBuffer是线程安全的,因为底层每个方法都加了Synchronized,效率会低一些
StringBuilder是线程不安全的,相对效率会高一些
总的来说String的效率最低其次StringBuffer最后StringBuilder
根据合适的场景来选择使用哪一个,如果多线程并发下,无疑使用StringBuffer如果单线程追求效率无疑StringBuilder
但是通常我们还是使用String
41.自动装箱和自动拆箱
自动装箱:基本数据类型转换为包装类
自动拆箱:包装类转化为基本数据类型
42.Integer i = 127 和Integer a = 127相等吗
相等,范围是-128~127之间都相等