撰写成一问一答的形式,每次回答都默写,对比参考答案后,再默写出更恰当的答案。
自测篇
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 重载和重写有什么区别?
答案篇
- Java、MySQL和Linux中注释有哪几种形式?
在Java中,注释有两种分别为单行注释和多行注释。
- 单行注释使用//表示;
- 多行注释使用/* * */表示。
在MySQL中,单行注释使用#表示;
- 标识符和关键字的区别是什么?
在Java中,关键字有修饰符和数据类型等,其重要是帮助实现某些功能。
- Java 语言关键字有哪些?
在Java语言中,关键字是指被Java语言赋予特殊含义的一组保留字,用于表示语言中的各种语法结构和功能。Java语言的关键字共有50个,包括以下内容:
- 基本数据类型:boolean、byte、short、int、long、float、double、char。
- 流程控制:if、else、switch、case、default、while、do、for、break、continue、return。
- 类和对象:class、interface、implements、extends、new、this、super、abstract、final、static、private、protected、public、package、import。
- 异常处理:try、catch、finally、throw、throws。
- 其他:void、true、false、null、assert。
需要注意的是,在使用Java语言时,不能将关键字用作变量名、方法名、类名等标识符,否则会导致编译错误。
- 自增自减运算符?
在Java中,i++/--是常见的一种自增自减运算符表达方式,其是在其最小循环结束后相应值i+1/-1;
- 对应的还有++/--i,其含义是即刻马上相应值i+1/-1,再进行其他操作;
- 移位运算符?
在Java中,移位运算符是一种用于对二进制数进行移位操作的运算符,包括左移运算符(<<)、右移运算符(>>)和无符号右移运算符(>>>)。
- 左移运算符(<<):将一个数的二进制表示向左移动指定的位数,右边用0补齐。例如,对于二进制数101(十进制数为5),执行左移操作(<< 2),结果为10100(十进制数为20)。
- 右移运算符(>>):将一个数的二进制表示向右移动指定的位数,左边用符号位(正数用0,负数用1)补齐。例如,对于二进制数10100(十进制数为20),执行右移操作(>> 2),结果为101(十进制数为5)。
- 无符号右移运算符(>>>):将一个数的二进制表示向右移动指定的位数,左边用0补齐。例如,对于二进制数10100(十进制数为20),执行无符号右移操作(>>> 2),结果为00101(十进制数为5)。
移位运算符可以用于对二进制数进行快速的乘、除、取模等计算。在实际编程中,需要根据具体需求来选择适当的移位运算符,以保证程序的正确性和性能。
- continue、break 和 return 的区别是什么?
continue是跳过最小循环中本次循环,即仍在循环内继续下一次循环。
break则是直接结束整个最小循环,但仍继续最小循环外后的代码执行。
return则是直接结束整个代码块,返回相应的内容。
以上都是从结束范围的角度来看,其影响范围大小为:continue <= break <= return;
- 成员变量与局部变量的区别?
成员变量 | 局部变量 | |
存在位置 | 类内方法区外 | 方法区内 |
作用域 | 整个类内 | 方法区内 |
存储位置 | 存放在堆中 | 存在在栈中 |
生命周期 | 整个代码运行后才结束 | 调用完方法后结束 |
默认值 | 由Java虚拟机自动赋予 | 必须自行设置默认值 |
初始化 | 无初始化,则有默认值 | 必须自行设置默认值 |
访问权限 | public/protected/private | 没有访问权限的限制 |
- 字符型常量和字符串常量的区别?
字符型常量 | 字符串常量 | |
存储位置 | 存在在栈中 | 常量池中 |
数据类型 | 基本数据类型:char | 引用型数据String/本质上是char[] 数组 |
表示方式 | char ch = 'c' | String s = "s" |
长度不同 | 只有一个字符 | 多个字符 |
编译时 | int数据类型 | 字符串类型 |
- 静态变量有什么作用?
静态变量使用static修饰,属于类,存储在静态存储区;方便访问:直接通过类名.静态变量名即可访问;
在实际应用中,电影院想要售票时,则可使用静态变量定义售票票数,多方能够同时抢购;
但因为数据传输时会有延迟,则需要使用synchronized关键字来实现同步锁,保证售票时是有票可售的。
- 方法
- 什么是方法的返回值?方法有哪几种类型?
方法是在类中创建,主要是为了提高复用性,当类中多次需要调用某个功能时,可将其写成方法便于调用;
方法的返回值是在定义方法时定义要返回的数据类型,每次调用方法都会返回相应的数据类型,除了void方法无返回值外;
可按照是否有返回值和参数列表分成四类:
无返回值和参数列表、有返回值无参数列表、无返回值有参数列表、有返回值有参数列表
- 方法有哪几种类型?
静态方法、成员方法、抽象方法、构造方法、重写方法、重载方法、同步方法和内部方法
静态方法是与静态类都要使用static修饰,能够直接通过类名.静态方法调用,像Math类中的数学方法定义为静态方法,便于直接使用访问。
成员方法即需要创建对象后,才能通过对象调用的方法;
内部方法即只使用一次的方法,便于用完即丢;
- 静态方法为什么不能调用非静态成员?
可以从两个角度进行解释:
- 级别不同的角度:静态方法属于类方法,而非静态成员变量属于对象级变量,需要创建对象才能使用;
- 并且静态方法属于共享方法,无法根据上下文找到创建对象的信息,所以其内部不能有非静态成员;
- 从JVM虚拟机的角度:静态方法属于类方法在类初始化便被创建,而对象级的非静态方法则是要在对象实例化后再创建相应的内存,此时若静态方法调用不存在的非静态成员则是违法操作;
- 静态方法和实例方法有何不同?
静态方法 | 实例方法 | |
存储位置 | 存在在静态存储区 | 存储在堆中 |
语法 | 必须使用static修饰 | 不能使用static修饰 |
内存分配 | 在类加载时便分配一块空间共同使用 | 创建对象后再分配内存 |
访问方式 | 无需创建对象直接访问:类名.静态方法名 | 创建对象后才能访问:实例对象名.方法名 |
生命周期 | 整个代码运行后才结束 | 与对象生命周期相同 |
访问权限 | 都相同 | 都可使用public/protected/private修饰 |
访问类成员 | 只能访问静态成员(静态成员变量和方法) | 都可访问 |
- 重载和重写有什么区别?
区别 | 重载 | 重写 |
发生范围 | 同一个类 | 继承父类的子类 |
参数列表 | 一定要修改,返回类型相同; | 不能修改 |
返回类型 | 不能修改 | 返回类型可小于等于父类 |
发生时期 | 编译期 | 运行期 |
访问修饰符 | 无限制;可修改 | final/private/static不能被重写;不能更严格 |
异常 | 可修改 | 只能更小或相同的异常 |
重载是方法名相同,根据输入/参数列表不同,采取不同措施;
- 返回类型不算;同个类中相同方法名and输入信息不同;
- 参数列表:参数类型or参数数量不同or参数顺序
而重写是针对子类继承父类方法,即输入相同;若要与父类输出不同,则要重写进而覆盖父类方法;
- 方法名、返回类型or参数类型or参数数量都相同,不同的是方法内代码内的修改;
- 重写发生在运行时,参数列表相同,但返回类型可以<=父类类型;
- 为什么访问修饰符为final/private/static的不能被重写,但是被static修饰的方法能够被再次声明?
- final:final修饰的方法表示该方法是最终的,不能被修改。因此,当一个方法被声明为final时,它不能被子类重写。
- private:private修饰的方法表示该方法是私有的,仅在类内部可见。子类无法访问父类的私有方法,因此它们无法被重写。
- static:static修饰的方法表示该方法属于类,而不是类的实例。静态方法是类级别的,不能被子类重写。然而,子类可以声明一个与父类中的静态方法具有相同方法签名的新方法,这被称为静态方法的再次声明。这时,子类和父类中的静态方法被认为是两个完全独立的方法,而不是方法重写。
类比必胜客披萨
- 重载:餐厅提供了多种口味的披萨,如意式披萨、美式披萨和素食披萨。尽管它们都叫做“披萨”,但它们的口味和配料各不相同,因此可以认为是重载的例子。
- 重写:餐厅有一个“每日特色披萨”项目,每天提供的披萨口味都不同。在这种情况下,每天的特色披萨可以看作是对基本披萨概念的重写,因为它们具有相同的名称和基本结构,但各自的实现不同。
小测检验:
问题1:当我们在一个类中实现重载时,哪些方法签名组件可以发生变化?
问题2:在实现方法重写时,子类方法的访问修饰符是否可以比父类方法的访问修饰符更严格?
答案:
问题1:在一个类中实现重载时,可以改变的方法签名组件包括参数的数量、类型和顺序。方法的返回类型和访问修饰符可以不同,但这并不影响重载的实现。
问题2:在实现方法重写时,子类方法的访问修饰符不能比父类方法的访问修饰符更严格。子类中重写的方法应具有相同或更宽松的访问权限。
- 什么是可变长参数?
即参数能够在设定的范围内变动,这样便能够减少对于参数变化,但操作不变的场景的代码重写。
是什么?
如何实现/语法是什么?注意事项是什么?
- public void sum(String name,String ...)
- 必须作为最后一个传递参数且只有一个可变长参数,首先匹配前面的固定参数。
问题和理解大部分来源为Guide哥的Java面试指南,有需要的可自行检索加入其星球获得。