Java面试题大全(持续更新中)

本文详细解释了Java中的类型转换、整数交换技巧(包括第三方变量、位运算符),静态成员与局部变量的区别,以及面向对象编程的基础特征。还讨论了包、类加载顺序、继承和方法重写等内容,并通过示例展示了如何在控制台上输出特定数值和使用equals与==的区别。
摘要由CSDN通过智能技术生成

(1):当short与int进行运算的时候,会提升为int类型,两个int类型相加的结果也是int类型.

(2):在底层会做强制类型转换,相当于 s=(short)(s+1);

4.实现两个整数的交换.

int a = 5;

int b = 3;

(1)用第三方变量://开发常用

int temp = x;

x = y;

y = x;

(2)不需要第三方变量://有弊端,有可能会超出int的取值范围

x = x + y;

y = x - y;

x = x - y;

(3)用位运算符交换两个数.

a = a ^ b;

b = a ^ b;

a = a ^ b;

5. 2 * 8最有效率的运算方式.

2 << 3;

6.switch 的表达式可以是什么?

byte short char int 枚举(jdk1.5) String(jdk1.7)

7.传值和传址

基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失

引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问

Java中到底是传值还是传址

1,既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址

2,java中只有传值,因为地址值也是值(出去面试都说这种,支持者是高司令(java之父))

8.面向对象特点及特征

特点: 1.是一个更符合人们思想习惯的思想;

2.将复杂的事情简单化;

3.从执行者变成指挥者;

特征: 1.封装 2.继承 3.多态

9.成员变量和局部变量的区别

  • A:在类中的位置不同

  • 成员变量:在类中方法外

  • 局部变量:在方法定义中或者方法声明上

  • B:在内存中的位置不同

  • 成员变量:在堆内存(成员变量属于对象,对象进堆内存)

  • 局部变量:在栈内存(局部变量属于方法,方法进栈内存)

  • C:生命周期不同

  • 成员变量:随着对象的创建而存在,随着对象的消失而消失

  • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

  • D:初始化值不同

  • 成员变量:有默认初始化值

  • 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

  • 注意事项:

  • 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

  • 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char

  • 引用数据类型变量包括哪些:数组,类,接口,枚举

10.static关键字

(1)static关键字的特点

* a:随着类的加载而加载

* b:优先于对象存在

* c:被类的所有对象共享

* d:可以通过类名调用

(2)static的注意事项

* a:在静态方法中是没有this关键字的

* 静态是随着类的加载而加载,this是随着对象的创建而存在。

* 静态比对象先存在。

* b:静态方法只能访问静态的成员变量和静态的成员方法

* 静态方法:

* 成员变量:只能访问静态变量

* 成员方法:只能访问静态成员方法

* 非静态方法:

* 成员变量:可以是静态的,也可以是非静态的

* 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。

* 简单记:

* 静态只能访问静态。

11.静态变量和成员变量的区别

  • 静态变量也叫类变量 成员变量也叫对象变量

  • A:所属不同

  • 静态变量属于类,所以也称为为类变量

  • 成员变量属于对象,所以也称为实例变量(对象变量)

  • B:内存中位置不同

  • 静态变量存储于方法区的静态区

  • 成员变量存储于堆内存

  • C:内存出现时间不同

  • 静态变量随着类的加载而加载,随着类的消失而消失

  • 成员变量随着对象的创建而存在,随着对象的消失而消失

  • D:调用不同

  • 静态变量可以通过类名调用,也可以通过对象调用

  • 成员变量只能通过对 象名调用

12.看程序写结果

class Student {

static {

System.out.println(“Student 静态代码块”); //3

}

{

System.out.println(“Student 构造代码块”); //4 //6

}

public Student() {

System.out.println(“Student 构造方法”); //5 //7

}

}

class Demo2_Student {

static {

System.out.println(“Demo2_Student静态代码块”); //1

}

public static void main(String[] args) {

System.out.println(“我是main方法”); //2

Student s1 = new Student();

Student s2 = new Student();

}

}

13.看程序写结果

class Fu{

public int num = 10;

public Fu(){

System.out.println(“fu”);

}

}

class Zi extends Fu{

public int num = 20;

public Zi(){

System.out.println(“zi”);

}

public void show(){

int num = 30;

System.out.println(num);

System.out.println(this.num);

System.out.println(super.num);

}

}

class Test1_Extends {

public static void main(String[] args) {

Zi z = new Zi();

z.show();

}

}

/*

fu

zi

30

20

10

*/

14.看程序写结果

class ExtendsTest {

public static void main(String[] args) {

Zi z = new Zi();

}

/*

1,jvm调用了main方法,main进栈

2,遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,

再创建对象,当Fu.class加载进内存,父类的静态代码块会随着Fu.class

一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载

第一个输出,静态代码块Fu,第二个输出静态代码块Zi

3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,

再初始化子类,所以先走的父类构造,但是在执行父类构造时,发现父类

有构造代码块,构造代码块是优先于构造方法执行的所以

第三个输出构造代码块Fu,第四个输出构造方法Fu

4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi

*/

}

class Fu {

static {

System.out.println(“静态代码块Fu”); //1

}

{

System.out.println(“构造代码块Fu”); //3

}

public Fu() {

System.out.println(“构造方法Fu”); //4

}

}

class Zi extends Fu {

static {

System.out.println(“静态代码块Zi”); //2

}

{

System.out.println(“构造代码块Zi”); //5

}

public Zi() {

System.out.println(“构造方法Zi”); //6

}

}

Zi z = new Zi(); 请执行结果。

15.方法重写的面试题

  • Override和Overload的区别?Overload能改变返回值类型吗?

  • overload可以改变返回值类型,只看参数列表

  • 方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的

  • 方法重载:在同一个类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。

  • 子类对象调用方法的时候:

  • 先找子类本身,再找父类。

16.final关键字的面试题?

A:修饰局部变量

B:初始化时机

/*

A:

基本类型:值不能被改变。

引用类型:地址值不能被改变。对象中的属性可以改变。

B:

显式初始化

在对象构造完毕前即可

*/

17.一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

  • 可以

  • 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

18.abstract不能和哪些关键字共存

static final private

abstract和static

被abstract修饰的方法没有方法体

被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的

abstract和final

被abstract修饰的方法强制子类重写

被final修饰的不让子类重写,所以他俩是矛盾

abstract和private

被abstract修饰的是为了让子类看到并强制重写

被private修饰不让子类访问,所以他俩是矛盾的

19.看程序写结果

A:看下面程序是否有问题,如果没有,说出结果

class Fu {

public void show() {

System.out.println(“fu show”);

}

}

class Zi extends Fu {

public void show() {

System.out.println(“zi show”);

}

public void method() {

System.out.println(“zi method”);

}

}

class Test1Demo {

public static void main(String[] args) {

Fu f = new Zi();

f.method();

f.show();

}

}

//编译出错。编译看左边,而Fu类中没有method()方法。

B:看下面程序是否有问题,如果没有,说出结果

class A {

public void show() {

show2();

}

public void show2() {

System.out.println(“我”);

}

}

class B extends A {

public void show2() {

System.out.println(“爱”);

}

}

class C extends B {

public void show() {

super.show();

}

public void show2() {

System.out.println(“你”);

}

}

public class Test2DuoTai {

public static void main(String[] args) {

A a = new B();

a.show();

B b = new C();

b.show();

}

}

//爱

//你

20.package,import,class有没有顺序关系

package放在有效代码的第一行,import放在中间,class放在三者最后。

21.要求:使用已知的变量,在控制台输出30,20,10。

class Outer {

public int num = 10;

class Inner {

public int num = 20;

public void show() {

int num = 30;

System.out.println(?); //num

System.out.println(??); //this.num

System.out.println(???);//Outer.this.num

}

}

}

class InnerClassTest {

public static void main(String[] args) {

Outer.Inner oi = new Outer().new Inner();

oi.show();

}

}

22.按照要求,补齐代码

interface Inter { void show(); }

class Outer { //补齐代码 }

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

要求在控制台输出”HelloWorld”

//需要补齐代码内容

public static Inter method() {

return new Inter() {

public void show() {

System.out.println(“HelloWorld”);

}

};

}

23.==号和equals方法的区别

相同点:都是作比较的,返回的都是布尔类型。

不同点:

(1)==:

* 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,

基本数据类型比较的是值, 引用数据类型比较的是地址值

(2)equals:

* equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

22.按照要求,补齐代码

interface Inter { void show(); }

class Outer { //补齐代码 }

class OuterDemo {

public static void main(String[] args) {

Outer.method().show();

}

}

要求在控制台输出”HelloWorld”

//需要补齐代码内容

public static Inter method() {

return new Inter() {

public void show() {

System.out.println(“HelloWorld”);

}

};

}

23.==号和equals方法的区别

相同点:都是作比较的,返回的都是布尔类型。

不同点:

(1)==:

* 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,

基本数据类型比较的是值, 引用数据类型比较的是地址值

(2)equals:

* equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中…(img-bbZri8Qp-1714400919747)]

高效学习视频

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值