Java八股文基础篇-01

1、Java的数据类型有哪些?

Java的数据类型有:
(1)基本数据类型:byte,short,int,long,float,double,char,boolean2)空类型:void3)引用数据类型:数组、类、接口、枚举、注解等

2、变量的三要素是什么?变量使用有什么要求?

变量的三要素:
    数据类型、变量名、变量值
变量使用要求:
    变量必须先声明再使用;
    变量必须初始化,其中成员变量有默认值;
    局部变量有作用域,同一个作用域中变量不能重复声明;
    给变量赋值时要求值的类型<=变量声明的类型;

3、基本数据类型变量和引用数据类型变量有什么区别?

基本数据类型的变量:存储数据值,数据类型不同,宽度不同
引用数据类型的变量:存储地址值

4、Java的运算符+有几种意思?

1)作为一元运算符:表示正号
(2)当+左右两边有字符串出现时,表示拼接
(3)其他情况表示求和

5、Java的自增、自减运算符在自增变量前后有什么区别?

首先,
自增运算符++,表示自增变量自增1,
自减运算符--,表示自增变量自减1。
其次,以自增为例
(1)如果自增表达式直接加;构成语句,自增运算符在自增变量前后没有区别
    a++;++a; 没区别
(2)如果自增表达式 和其他运算符一起运算,或者自增表达式作为实参使用时,则有区别。
    自增运算符在前:表示先自增,再取自增变量的值运算,
    自增运算符在后:表示先取自增变量的值,然后自增变量再自增1,计算用的是自增之前取的值。

6、Java的与运算符& 和 && 的区别?

&:
    按位与,不会发生短路现象
&&:
    逻辑与,会发生短路现象,也称为短路与。
    当&&左边是false,右边就不看了。

7、Java的运算符| 和 || 的区别?

|:
    按位或,不会发生短路现象
||:
    逻辑或,会发生短路现象,也称为短路或。
    当||左边是true,右边就不看了。

8、Java的运算符<<,>>,>>>的区别?

<<:
    称为左移,左移几位相当于乘以2的n次方。
    可能发生正变负,负变正的情况。
>>:称为右移,右移几位相当于除以2的n次方。
    不会发生正变负,负变正的情况。
>>>:无符号右移
    正数的右移,和>>一样。
    负数的右移,直接变正数。

9、Java的分支结构if…else和switch…case有什么区别?

1if...else适用于任何条件的判断,
switch...case只适用于byte,short,char,intString,枚举类型的常量判断。
即能够使用switch...case的都可以使用if...else,反过来不可以。
(2if...else不会发生分支贯穿/穿透的现象,
    switch...case可能发生分支贯穿/穿透的现象。

10、Java的循环有几种情况?

Java的循环有3种形式:
    for,while,do...while

11、Java的普通for循环和增强for循环的区别?

普通for循环:
    任何需要重复执行某些代码的场景都可以使用它。
增强for循环:
    只能用于遍历数组,或实现了java.lang.Iterable接口的集合。
    增强for循环遍历数组时,本质上底层是用普通for循环。
    增强for循环遍历集合时,本质上底层是用Iterator迭代器遍历。

12、关键字break、continue、return的区别?

break:
    用于switch或循环,表示提前结束当前switch或循环。
continue:
    用于循环,表示提前结束本次循环体的执行。
return:
    用于方法体中,结束当前方法体的执行。
    return;表示直接结束当前方法体的执行。
    return 结果;表示结束当前方法的执行,并返回结果。

13、类和对象的关系?

类是创建对象的模板。
对象是类的实例。

14、类的成员有哪些?

类的成员:
    成员变量
    成员方法
    构造器
    代码块
    成员内部类

15、静态变量、实例变量、局部变量的区别?

  1. 局部变量:
    • 声明在方法、构造器、代码块里面,没有默认值,必须手动初始化,在栈中分配内存,有严格的作用域,只能加final修饰。
  2. 实例变量:
    • 声明在类中,其他成员外面,有默认值,也可以在声明后面手动初始化,或者使用非静态代码块和构造器初始化,在堆中分配内存,每一个对象的实例变量都是独立的,可以加public,protected,private,transient,final等修饰符。
  3. 静态变量:
    • 声明在类中,其他成员外面,必须有static修饰,有默认值,也可以在声明后面手动初始化,或者使用静态代码块初始化,在方法区中分配内存,每一个类的静态变量是所有对象共享的,可以加public,protected,private,transient,final等其他修饰符。

16、构造器的特点?

  • 构造器的名字必须和类名相同
  • 构造器没有返回值类型
  • 构造器的首行必须是this() 或 this(输出列表)或super()或super(实参列表),如果这4句都没写,默认是super()
  • 构造器不会被继承,但是子类构造器一定会调用父类的构造器
  • 如果一个类没有编写任何构造器,那么编译器将会给这个类自动添加默认的无参构造器
  • 构造器只能加权限修饰符public,protected,缺省,private
    • 枚举类和单例类的构造器一定是私有化的
  • 构造器的调用必须用new关键字

17、方法重载和重写的区别?

  • 方法的重载:在同一个类中,或父子类中,出现方法名相同,形参列表不同的两个或多个方法称为方法的重载。和返回值类型、修饰符等无关。
  • 方法的重写:在父子类、接口和实现类中,出现方法名相同,形参列表相同的两个方法称为方法的重写。方法的重写对返回值类型、修饰符、抛出的异常列表等都有严格的要求。
    • 方法名相同,形参列表必须相同
    • 返回值类型:如果是基本数据类型必须相同,如果是引用数据类型必须<=的关系
    • 权限修饰符:必须子类可见,必须>=的关系
    • 其他修饰符:不能是static和final修饰
    • 抛出的异常列表:被重写方法没有throws受检异常/编译时异常,重写时也不能throws受检异常/编译时异常。如果被重写方法throws受检异常/编译时异常,重写方法时,要么不throws,要是throws的异常类型满足<=的关系。关于非受检异常/运行时异常不做限制。
Overload方法重载Override方法重写
方法名必须相同必须相同
形参列表必须不同必须相同
返回值类型不看基本数据类型和void:必须相同 引用数据类型:<=
权限修饰符不看>=,并且要求被重写方法在子类可见
抛出的异常列表不看被重写方法没有throws受检异常/编译时异常,重写时也不能throws受检异常/编译时异常。 如果被重写方法throws受检异常/编译时异常,重写方法时,要么不throws,要是throws的异常类型满足<=的关系。 关于非受检异常/运行时异常不做限制。
位置同一个类 父子类中父子类中,实现类和接口中

18、可变参数是什么意思?

可变参数:
    参数类型后面出现...形式,就称为可变参数。

在声明可变参数的方法中,可变参数就是数组。
在调用时,可变参数可以传入对应类型的数组,或者传入0~n个对应类型的元素。

19、什么是递归?

方法出现自己调用自己就是递归。

20、静态代码块和非静态代码块的区别?

静态代码块:
    有static修饰的代码块。是给静态变量初始化的。在类初始化时执行,一个类的静态代码块只会执行一次。
非静态代码块:
    没有static修饰的代码块。是给实例变量初始化的。在实例初始化时执行,每次new对象时,都会执行。

21、静态方法和非静态方法有什么区别?

静态方法:
    在本类中的任意成员中都可以被调用。
    父类的静态方法可以被子类继承,但不能被重写。
    父接口的静态方法不会被实现类继承,也不能被重写。
非静态方法:
    只能在本类的非静态成员中被调用。
    非final修饰的非静态方法,只要子类、实现类可见,就可以选择重写。

22、抽象方法和非抽象方法的区别?

抽象方法:
    有abstract修饰,没有方法体,不能由privatestaticfinalnative修饰。
    在子类或实现类中需要重写。
    抽象方法只能出现在抽象类或接口中。
非抽象方法:
    没有abstract修饰,有方法体。

23、关键字class、interface、enum的区别

class:
    声明类
interface:
    声明接口
@interface:声明注解(这个可选)
enum:
    声明枚举类

24、继承的关键字是什么?

extends

25、实现接口的关键字是什么?

implements

26、extends关键字的作用

extends:
    表示子类继承父类,子接口继承父接口
    <泛型变量>的上限指定,<T extends Object & Comparable>
    <泛型通配符?>的上限指定,<? extends Comparable>

27、包的作用是什么

1)避免类的重名
(2)限制某些类或成员的可见性范围
(3)组织管理不同主题的类

28、package和import的区别

package:
    声明包
    必须在.java文件的首行
import:
    导包
    在package语句和类定义之间

29、this和super的意思

this:当前对象
super:引用父类/父接口中声明的成员

30、this和super的用法

this:1)可以单独使用
(2this.成员变量:
 可以通过this.成员变量,访问当前对象的成员变量,这个成员变量可以是当前类声明的,也可以是从父类继承的,如果要使用父类声明的成员变量,要求当前类没有重名的成员变量。
当局部变量和成员变量重名时,可以在成员变量前面加this.成员变量进行区别。
(3this.成员方法
可以通过this.成员方法,调用当前对象的成员方法,这个方法可以当前类声明的,也可以是从父类继承的,如果要使用父类声明的成员方法,要求当前类没有重写该方法。
this.成员方法,加不加this完全相同。
this.虚方法时,执行时要看this对象的运行时类型是否重写过虚方法,如果重写了,一定执行重写的代码。
(4this()this(实参列表)
表示调用本类其他的构造器
(5)外部类.this.成员
在非静态内部类中使用,引用外部类的成员。
super:
(1)不能单独使用
(2super.成员变量
可以通过super.成员变量引用父类声明的成员变量,特别是当前类有与父类重名的成员变量时,通过super.成员变量可以区别。
(3super.成员方法
可以通过super.成员方法引用父类声明的成员方法,特别是当前类有重写父类的方法时,通过super.成员方法可以方法被重写的方法体
(4super()super(实参列表)
表示调用父类的构造器
(5)父接口.super.方法
在实现类中调用父接口的默认方法,当默认方法有冲突时使用

31、如何理解面向对象的3个基本特征

封装:
    为了体现高内聚、低耦合的开发原则。
    为了安全、隐藏类的内部实现细节,提高代码的复用性。
继承:
    为了提高代码复用性、便于代码扩展。
    为了表示is-a的事物关系。
多态:
    为了代码编写更灵活,可以实现虚方法的动态绑定。
    即是:父类对子类对象地址的引用

32、如何理解多态性?

对象的多态性
(1)一个类可以引用本类对象,也可以引用各种子类对象
(2)一个对象可以让编译器按照本类处理,也可以按照父类或父接口类型,但是运行时类型不变

33、什么是基本数据的自动类型转换和强制类型转换?

当把数据类型小的数据赋值给数据类型大的变量时,就会发生自动类型提升。
    byte->short->int->long->float->double
        char->byteshortchar三个类型在计算时,就会自动升级为int。
当数据类型小的数据与数据类型大的数据混合计算时,数据类型小的数据会自动类型提升。
当把数据类型大的数据赋值给数据类型小的变量时,就要强制类型转换。
    double->float->long->int->short->byte
                ->char
当希望某个数据类型小的数据按照某个大的类型计算时,也可以使用强制类型转换。

34、什么是向上转型和向下转型?

向上转型:
    把子类对象赋值给父类的变量。
    把实现类的对象赋值给父接口的变量。
向下转型:
    把父类变量赋值给子类的变量。
    可能发生ClassCastException,最好向下转型之前加instanceof判断

35、使用接口有什么好处?

1)避免单继承
(2)表示has-a的关系

36、枚举类有什么特点?

枚举类的对象是固定的有限的几个常量对象。
枚举类有固定的直接父类java.lang.Enum类,也不能有子类,构造器私有化了。

37、包装类有什么作用?

当必须使用对象时,基本数据类型就会自动装箱为包装类对象。
当对包装类进行计算时,可以自动拆箱为基本数据类型。

38、int,Integer,BigInteger的区别?

int:基本数据类型
Integer:包装类
BigInteger:任意大小的整数    

39、final、finally、finalize的区别

final:修饰符
    final修饰类,表示不能被继承
    final修饰方法,表示不能被重写
    final修饰变量,表示不能修改值
finally:
    和try...catch结构一起使用,
    表示无论是否有异常,是否可以捕获异常,是否有return语句,都要执行的finally块。
finalize:
    finalize是Object类的一个方法,由GC调用,在对象被回收时调用,适用于释放JVM之外的内存。

40、受检异常和非受检异常的区别?

受检异常:
    称为编译时异常,编译器检测到某个代码可能发生受检异常,就会强制要求编写try...catchthrows。
非受检异常:
    称为运行时异常,无论是否真的会发生运行时异常,编译器都不会提示你编写try...catchthrows。
但是无论受检异常还是非受检异常,只要发生了,没有用try...catch处理,就一定会导致程序崩溃。

41、两种实现多线程的方式?

继承Thread类或实现Runnable接口
  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Chao Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值