Java基础知识 | 常见面试题(上):基本语法

撰写成一问一答的形式,每次回答都默写,对比参考答案后,再默写出更恰当的答案。

相关内容

Java基础知识 | 常见面试题(上):基础概念和常识

自测篇

2.1 Java、MySQL和Linux中注释有哪几种形式?
2.2 标识符和关键字的区别是什么?
2.3 Java 语言关键字有哪些?
2.4 自增自减运算符?
2.5 移位运算符?
2.6 continue、break 和 return 的区别是什么?
2.7 变量
2.7.1 成员变量与局部变量的区别?
2.7.2 字符型常量和字符串常量的区别?
2.7.3 静态变量有什么作用?
2.8 方法
2.8.1 什么是方法的返回值?方法有哪几种类型?
2.8.2 方法有哪几种类型?
2.8.3 静态方法为什么不能调用非静态成员?
2.8.4 静态方法和实例方法有何不同?
2.8.8 重载和重写有什么区别?

答案篇

  1. Java、MySQL和Linux中注释有哪几种形式?

在Java中,注释有两种分别为单行注释和多行注释。

  • 单行注释使用//表示;

  • 多行注释使用/* * */表示。

在MySQL中,单行注释使用#表示;

  1. 标识符和关键字的区别是什么?

在Java中,关键字有修饰符和数据类型等,其重要是帮助实现某些功能。

  1. Java 语言关键字有哪些?

在Java语言中,关键字是指被Java语言赋予特殊含义的一组保留字,用于表示语言中的各种语法结构和功能。Java语言的关键字共有50个,包括以下内容:

  1. 基本数据类型:boolean、byte、short、int、long、float、double、char。

  2. 流程控制:if、else、switch、case、default、while、do、for、break、continue、return。

  3. 类和对象:class、interface、implements、extends、new、this、super、abstract、final、static、private、protected、public、package、import。

  4. 异常处理:try、catch、finally、throw、throws。

  5. 其他:void、true、false、null、assert。

需要注意的是,在使用Java语言时,不能将关键字用作变量名、方法名、类名等标识符,否则会导致编译错误。

  1. 自增自减运算符?

在Java中,i++/--是常见的一种自增自减运算符表达方式,其是在其最小循环结束后相应值i+1/-1;

  • 对应的还有++/--i,其含义是即刻马上相应值i+1/-1,再进行其他操作;

  1. 移位运算符?

在Java中,移位运算符是一种用于对二进制数进行移位操作的运算符,包括左移运算符(<<)、右移运算符(>>)和无符号右移运算符(>>>)。

  1. 左移运算符(<<):将一个数的二进制表示向左移动指定的位数,右边用0补齐。例如,对于二进制数101(十进制数为5),执行左移操作(<< 2),结果为10100(十进制数为20)。

  2. 右移运算符(>>):将一个数的二进制表示向右移动指定的位数,左边用符号位(正数用0,负数用1)补齐。例如,对于二进制数10100(十进制数为20),执行右移操作(>> 2),结果为101(十进制数为5)。

  3. 无符号右移运算符(>>>):将一个数的二进制表示向右移动指定的位数,左边用0补齐。例如,对于二进制数10100(十进制数为20),执行无符号右移操作(>>> 2),结果为00101(十进制数为5)。

移位运算符可以用于对二进制数进行快速的乘、除、取模等计算。在实际编程中,需要根据具体需求来选择适当的移位运算符,以保证程序的正确性和性能。

  1. continue、break 和 return 的区别是什么?

continue是跳过最小循环中本次循环,即仍在循环内继续下一次循环。

break则是直接结束整个最小循环,但仍继续最小循环外后的代码执行。

return则是直接结束整个代码块,返回相应的内容。

以上都是从结束范围的角度来看,其影响范围大小为:continue <= break <= return;

  1. 成员变量与局部变量的区别?

成员变量

局部变量

存在位置

类内方法区外

方法区内

作用域

整个类内

方法区内

存储位置

存放在堆中

存在在栈中

生命周期

整个代码运行后才结束

调用完方法后结束

默认值

由Java虚拟机自动赋予

必须自行设置默认值

初始化

无初始化,则有默认值

必须自行设置默认值

访问权限

public/protected/private

没有访问权限的限制

  1. 字符型常量和字符串常量的区别?

字符型常量

字符串常量

存储位置

存在在栈中

常量池中

数据类型

基本数据类型:char

引用型数据String/本质上是char[] 数组

表示方式

char ch = 'c'

String s = "s"

长度不同

只有一个字符

多个字符

编译时

int数据类型

字符串类型

  1. 静态变量有什么作用?

静态变量使用static修饰,属于类,存储在静态存储区;方便访问:直接通过类名.静态变量名即可访问;

在实际应用中,电影院想要售票时,则可使用静态变量定义售票票数,多方能够同时抢购;

但因为数据传输时会有延迟,则需要使用synchronized关键字来实现同步锁,保证售票时是有票可售的。

  1. 方法

    1.   什么是方法的返回值?方法有哪几种类型?

      方法是在类中创建,主要是为了提高复用性,当类中多次需要调用某个功能时,可将其写成方法便于调用;

      方法的返回值是在定义方法时定义要返回的数据类型,每次调用方法都会返回相应的数据类型,除了void方法无返回值外;

      可按照是否有返回值和参数列表分成四类:

      无返回值和参数列表、有返回值无参数列表、无返回值有参数列表、有返回值有参数列表

    1.   方法有哪几种类型?

      静态方法、成员方法、抽象方法、构造方法、重写方法、重载方法、同步方法和内部方法

      静态方法是与静态类都要使用static修饰,能够直接通过类名.静态方法调用,像Math类中的数学方法定义为静态方法,便于直接使用访问。

      成员方法即需要创建对象后,才能通过对象调用的方法;

      内部方法即只使用一次的方法,便于用完即丢;

    1.   静态方法为什么不能调用非静态成员?

      可以从两个角度进行解释:

    1. 级别不同的角度:静态方法属于类方法,而非静态成员变量属于对象级变量,需要创建对象才能使用;

      1. 并且静态方法属于共享方法,无法根据上下文找到创建对象的信息,所以其内部不能有非静态成员;

    2. 从JVM虚拟机的角度:静态方法属于类方法在类初始化便被创建,而对象级的非静态方法则是要在对象实例化后再创建相应的内存,此时若静态方法调用不存在的非静态成员则是违法操作;

    1.   静态方法和实例方法有何不同?

    静态方法

    实例方法

    存储位置

    存在在静态存储区

    存储在堆中

    语法

    必须使用static修饰

    不能使用static修饰

    内存分配

    在类加载时便分配一块空间共同使用

    创建对象后再分配内存

    访问方式

    无需创建对象直接访问:类名.静态方法名

    创建对象后才能访问:实例对象名.方法名

    生命周期

    整个代码运行后才结束

    与对象生命周期相同

    访问权限

    都相同

    都可使用public/protected/private修饰

    访问类成员

    只能访问静态成员(静态成员变量和方法)

    都可访问

    1.   重载和重写有什么区别?

    区别

    重载

    重写

    发生范围

    同一个类

    继承父类的子类

    参数列表

    一定要修改,返回类型相同;

    不能修改

    返回类型

    不能修改

    返回类型可小于等于父类

    发生时期

    编译期

    运行期

    访问修饰符

    无限制;可修改

    final/private/static不能被重写;不能更严格

    异常

    可修改

    只能更小或相同的异常

      重载是方法名相同,根据输入/参数列表不同,采取不同措施;

    • 返回类型不算;同个类中相同方法名and输入信息不同;

    • 参数列表:参数类型or参数数量不同or参数顺序

      而重写是针对子类继承父类方法,即输入相同;若要与父类输出不同,则要重写进而覆盖父类方法;

    • 方法名、返回类型or参数类型or参数数量都相同,不同的是方法内代码内的修改;

    • 重写发生在运行时,参数列表相同,但返回类型可以<=父类类型;

    • 为什么访问修饰符为final/private/static的不能被重写,但是被static修饰的方法能够被再次声明?

      • final:final修饰的方法表示该方法是最终的,不能被修改。因此,当一个方法被声明为final时,它不能被子类重写。

      • private:private修饰的方法表示该方法是私有的,仅在类内部可见。子类无法访问父类的私有方法,因此它们无法被重写。

      • static:static修饰的方法表示该方法属于类,而不是类的实例。静态方法是类级别的,不能被子类重写。然而,子类可以声明一个与父类中的静态方法具有相同方法签名的新方法,这被称为静态方法的再次声明。这时,子类和父类中的静态方法被认为是两个完全独立的方法,而不是方法重写。

类比必胜客披萨

  • 重载:餐厅提供了多种口味的披萨,如意式披萨、美式披萨和素食披萨。尽管它们都叫做“披萨”,但它们的口味和配料各不相同,因此可以认为是重载的例子。

  • 重写:餐厅有一个“每日特色披萨”项目,每天提供的披萨口味都不同。在这种情况下,每天的特色披萨可以看作是对基本披萨概念的重写,因为它们具有相同的名称和基本结构,但各自的实现不同。

小测检验:

  问题1:当我们在一个类中实现重载时,哪些方法签名组件可以发生变化?

  问题2:在实现方法重写时,子类方法的访问修饰符是否可以比父类方法的访问修饰符更严格?

  答案:

  问题1:在一个类中实现重载时,可以改变的方法签名组件包括参数的数量、类型和顺序。方法的返回类型和访问修饰符可以不同,但这并不影响重载的实现。

  问题2:在实现方法重写时,子类方法的访问修饰符不能比父类方法的访问修饰符更严格。子类中重写的方法应具有相同或更宽松的访问权限。

  1.   什么是可变长参数?

  即参数能够在设定的范围内变动,这样便能够减少对于参数变化,但操作不变的场景的代码重写。

  是什么?

  如何实现/语法是什么?注意事项是什么?

  • public void sum(String name,String ...)

  • 必须作为最后一个传递参数且只有一个可变长参数,首先匹配前面的固定参数。

    问题和理解大部分来源为Guide哥的Java面试指南,有需要的可自行检索加入其星球获得。 

你可能感兴趣的:(面试,职场和发展)