进大厂背过的Java面试题系列-12

 欢迎关注公众号:“Java元空间” ,回复“1”,获取大厂面试资料。这里有Java、SQL、大厂面试经验、面试题,欢迎大家关注交流。

​1、为什么不能从静态的方法里调用非静态的方法或变量?

  非静态的方法可以调用静态的方法,但是静态的方法不可以调用非静态的方法。

  类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

  在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。

2、静态方法和实例方法有何不同?

1)在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

2)静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

问题:static修饰变量、代码块是什么时候执行?执行几次?

  在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行;static块只执行一次。

【注】: 

     ​static语句块,不是在实例化的时候被执行的;

     ​在调用类中任何一个方法时,jvm进行类加载,static语句块是在类加载器加载该类的最后阶段进行初始化的。并且只会被初始化一次。(注:若一次性调用多个方法,则只会执行一次static代码块。)

3、在 Java 中定义一个不做事且没有参数的构造方法的作用?

    ​    ​Java 程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super()来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

问题:子类继承父类时,父类的构造方法什么时候调用?

  实例化一个子类对象时会先执行其父类的构造函数,然后再执行子类的构造函数。

  super()必须先被调用;如果子类构造方法里没有写super(),编译器会自动调用super()方法,即调用父类的默认无参构造方法。所以不可以父类中只定义了有参数的构造方法(在Java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法;但是如果一个构造方法在父类中已定义,在这种情况,编译器是不会自动插入一个默认的无参构造方法)

4、构造方法有哪些特性?

 名字与类名相同。

可以有多个同名不同参的函数​。

 没有返回值,但不能用void声明构造函数。

生成类的对象时自动执行,无需调用。

5、成员变量与局部变量的区别有哪些?

1) 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。

2) 从变量在内存中的存储方式来看:如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。

3)从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

4)成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

6、为什么重写equals时必须重写hashCode方法?(重要)

    ​    ​当对象的equals()方法被重写时,通常有必要重写 hashCode() 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

      (1)两个对象相等,hashcode一定相等      (2)两个对象不等,hashcode不一定不等      (3)hashcode相等,两个对象不一定相等      (4)hashcode不等,两个对象一定不等      hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。这样**如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致。

HashMap中的get与put:

(1)put:

1.首先根据put元素的key获取hashcode,然后根据hashcode算出数组的下标位置,如果下标位置没有元素,直接放入元素即可。
2.如果该下标位置有元素,则需要已有元素和put元素的key对象比较equals方法,如果equals不一样,则说明可以放入进map中,会在该数组位置创建一个链表,后put进入的元素到放链表头,原来的元素向后移动。

(2)get:
根据元素的key获取hashcode,然后根据hashcode获取数组下标位置,如果只有一个元素则直接取出。如果该位置是一个链表,则需要调用equals方法遍历链表中的所有元素与当前的元素比较,得到真正想要的对象。(当两个对象的hashcode不同的话,肯定他们不能equals。)阿里2021最全新的java面试题总结

7、this、super两者的区别

(1)this:代表对象本身,可以理解为:指向对象本身的一个指针。

this的用法在java中大体可以分为3种:

1)普通的直接引用

这种就不用讲了,this相当于是指向当前对象本身:

2)形参与成员名字重名,用this来区分:

3)引用构造函数

this(参数):调用本类中另一种形式的构造方法(应该为构造方法中的第一条语句)

(2)super:代指父类,可以用于调用父类的普通方法和构造方法。

调用父类构造方法:super()(无参构造方法)或super(参数)(有参构造方法)

调用父类普通方法:super.方法名(参数)

8、Java序列化中如果有些字段不想进行序列化,怎么办?

  对于不想进行序列化的变量,使用transient关键字修饰。

  transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。

9、获取用键盘输入常用的的两种方法

方法1:通过 Scanner

Scanner sc = newScanner(System.in);String s  \=sc.nextLine();input.close();

方法2:通过 BufferedReader

BufferedReader input= new BufferedReader(new InputStreamReader(System.in));

10. 并行和并发有什么区别?

并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值