Java基础

概述

JDK 和 JRE 有什么区别?

JDK:Java开发的工具包,提供了Java的开发环境和运行环境,包含JRE。

JRE:Java的运行环境。

面向对象

面向对象和面向过程的区别

面向过程:

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源

缺点:没有面向对象易维护、易复用、易扩展。

面向对象:

优点:易维护、易扩展、易复用,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活,更加易于维护。

缺点: 性能比面向过程低。

面向对象的特性

封装、继承、多态

  • 封装: 封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;

    • 类:封装对象的属性和行为
    • 方法:封装具体的业务逻辑功能实现
    • 访问控制修饰符: 封装具体的访问权限
  • 继承: 继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;

  • 多态: 多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

多态的表示形式
  • 方法的重写(根据对象不同来表现多态)
  • 类的向上转型
  • 类的继承
重载和重写的区别

重载: 发生在同一类中,方法的方法名相同,入参的类型、个数、顺序不同,方法体不同, 方法的返回值不同。

重写:发生在父子类中,子类重写父类的方法,方法名相同,入参出参相同,方法体不同。

抽象类必须要有抽象方法吗?

不是必须的

普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法

抽象类不能被实例化

抽象类能使用 final 修饰吗?

抽象类的创建是为了给其他的类继承,重写方法。

如果使用final修饰,该类不能被继承,就产生矛盾。无意义。

接口和抽象类有什么区别?
  • 接口里不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
  • 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
  • 接口里不包含构造器;抽象类里可以包含构造器
  • 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
  • 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。
访问修饰符 public,private, protected,default
  • public 对所有类可见,使用对象:类,接口,变量,方法
  • protected 对同一包内的类和所用子类可用。 使用对象:变量,方法。不能修饰类 。
  • default 在同一包内可见。使用对象:类,接口,变量,方法。
  • private 在同一类中可见。使用对象:变量,方法。 不能修饰类

关键字

final 在 java 中有什么作用?
  • final是一个修饰词。
  • final修饰类,该类不能被继承。
  • final修饰方法,该方法不能被重写。
  • final修饰变量,变量变成常量,在初始化时必须赋值,且后续不能被修改。
说一说你对static关键字的理解

static可以修饰成员变量、方法、初始化块、内部类(包括接口、枚举),以static修饰的成员就是类成员。类成员属于整个类,而不属于单个对象。

对static关键字而言,有一条非常重要的规则:类成员不能访问实例成员。因为类成员是属于类的,类成员的作用域比实例成员的作用域更大,完全可能出现类成员已经初始化完成,但实例成员还不曾初始化的情况,如果允许类成员访问实例成员将会引起大量错误。

概念

equals 和 == 的区别是什么?

== 对于基本类型,比较的是==两边的属性值是否相等。对于引用类型,比较的是两边是否引用同一个对象。

equals 没有重写,比较的是两边对象的引用,重写后比较的是两边的属性值是否相等。

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不一定,也可能是产生了hash冲突。

hash冲突一般4种解决方案

  • 开放寻址法 发生hash冲突时,将冲突的key以目前冲突得到的hashCode再进行hash计算,按照这种方式,直到找到不冲突的hash值。

  • 再hash法 提供多个不同的hash函数,发生冲突时,用另一个hash函数计算,直到不冲突为止

  • 链地址法 发生冲突时,会将改地址构成一个链表进行存储。hashMap是使用这个方法 + 红黑树来解决hash冲突,当链表长度大于8时,转成红黑树进行存储。

  • 建立公共移除区 将hash冲突的元素,存放到该区域。

成员变量与局部变量的区别

变量:在程序执行的过程中,在某个范围内值可以发生改变的量,本质上讲,变量其实是内存中的一小块区域。

成员变量,类内部定义的变量,针对整个类有效,随着对象的创建而存在,存储在堆内存中

局部变量,类的方法中的变量,只针对某个特定范围有效,方法被调用,或者语句被执行时存在,方法或语句结束,自动释放,存储在栈内存中

静态变量与实例变量的区别

静态变量: 静态变量不属于任何实例对象,属于类的,在内存中只会有一份,在类的加载过程中,jvm只为静态变量分配一次内存空间

实例变量: 每次创建对象都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量

java 中的 Math.round(-1.5) 等于多少?

-1,Math.round四舍五入,向上取整。

switch是否能作用在byte上,long? string

Switch 可以作用在 byte、short、char、int、 enum 、string上, long不行

&和&&的区别

& 按位与 和 逻辑与运算

&& 是短路的逻辑与运算,运算符左边为false,右边表达式将不会参与运算,表达式值直接为false

值传递, 引用传递?
  • 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
字符串常量池

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的效率,避免开辟多块空间存储相同的字符串,在创建字符串时,jvm会首先检查字符串常量池中是否已经存在,如果存在,直接返回它的引用,如果不存在,会实例化一个字符串放到池中,并返回引用地址。

内部类

静态内部类: 定义在类内部的静态类,可以访问外部类所有的静态变量,不能访问外部类的非静态变量

成员内部类: 定义在类内部,可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有

局部内部类: 定义在方法中内部类,可以访问外部类的所有变量和方法,定义在静态方法中的内部类只能访问静态变量和方法

匿名内部类: 没有名字的内部类,必须继承一个抽象类或者实现一个接口。不能定义任何静态变量和方法,所在方法的形参需要被匿名内部类使用时,必须声明final,不能是抽象的,必须实现继承的抽象类或者实现的接口的所有方法。

内部类的优点

内部类对象可以访问创建它的外部类对象的内容,包括是私有数据

内部类不为同一包其他类所见,具有很好的封装性

内部类实现了多重继承,优化Java单继承缺陷

匿名内部类可以很方便的定义回调

局部内部类和匿名内部类访问局部变量时,问什么变量要加上final

因为生命周期不一致,局部变量存储在栈中,当方法执行结束,非final的局部变量就会被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题

String

String 属于基础的数据类型吗?

String不属于基本的数据类型,属于对象,需要通过new String创建。基本数据类型只有8种,

分别是int、long、short、float、double、byte、char、boolean

java 中操作字符串都有哪些类?它们之间有什么区别?

有string,stringBuffer, stringBuilder。

string是声明不可变的对象,生成的对象放进常量池中,每次修改string都会生成新的string对象,然后将新对象的引用地址指向string。

stringBuffer和stringBuilder是在原有的对象上进行操作。

stringBuffer是线程安全的,性能低。

stringBuilder是非线程安全的,性能高。

String str="i"与 String str=new String(“i”)一样吗?

不一样,内存分配方式不一样

=i str会直接指向常量池

而new str会指向堆内存中new的对象,该对象再指向常量池。

如何将字符串反转?

根据字符串的长度遍历,每次获取最后一个字符添加到新的字符串中。

String 类的常用方法都有那些?

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

IO

java 中 IO 流分为几种?

功能:输入流,输出流

类型:字节流,字符流

BIO、NIO、AIO 有什么区别?

BIO: 同步阻塞式IO,使用方便,并发处理能力低。

NIO:同步非阻塞式IO,客户端和服务器端通过Channel通讯,实现了多路复用。

AIO:异步非阻塞式IO,异步IO的操作基于时间和回调机制。

Files的常用方法都有哪些?

exists 检测文件路径是否存在

createFile 创建文件

createDirectory 创建文件夹

delete 删除文件或目录

move 移动文件

size 查看文件格式

read 读取文件

write 写入文件

异常

反射

Java获取反射
  1. 通过new对象实现反射机制

  2. 通过路径实现反射机制

  3. 通过类名实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值