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. 通过类名实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值