一转眼秋招过去了,春招又来了,3月初的时候大大小小的公司投了好多简历,但却基本没有回应,以为都凉了,谁知道在3月中旬的时候疯狂的来面试与笔试,经过了一星期多才差不多,这次的经验与知识比去年秋招更上了一层,但是说实话感觉还是不够,我现在第二层,以为面试官会问到第一层,其实问到了第五层。<难受>好吧,其实面试出问题的主要原因是因为有些知识真的是都忘记了。建议小伙伴们在复习知识的时候做个笔记,这样的话比较方便。下面来分享一下面试所遇到的问题吧。(还是从不同的的方面来说一下)
java:
1.问了一下关于前边的修饰符:就是public和protected和private和default(默认)的区别。
从权限比较大的开始看一下把:
本身类 同包 子孙类 其他包
public: √ √ √ √
protected: √ √ √ x
default: √ √ x x
private: √ x x x
关于权限的作用范围就是这样的,说实话,博主在复习面试的时候根本没有准备这个问题,只记得public为共有,private为私有。。。<难受>
2.先问了一下重写和重载的区别,然后问了一下一个方法,什么时候放在工具类中,什么时候放在父类里?
关于重写和重载的区别很简单,博主答得很快:
重写:
就比如父类有个方法:
public void getName()
{
System.out.println("这是父类的方法");
}
然后有一个继承父类的子类,也用这个方法名与这个参数。(方法名与参数一定要相同,要不说不上是重写).
子类中方法为:
public void getName()
{
System.out.println("这是子类重写父类的方法");
}
就是说当子类执行这个方法的时候,执行的是自己的代码,而不是父类中代码。是两个类的两个方法,而重载不是,是一个类中的两个方法,但是他们的参数不同,比如说一个类中的setMessage()方法
public void setMessage(String name){}
public void setMessage(int id){}
看一下这两个方法,方法名是一样的,但里面的参数一个为String一个为int,当执行的时候,如果参数传的为int执行第二个,传的为执行第一个方法,这就是重载。
下面就是关于一个方法,如果你想用的话,把他放在工具类中还是把他放在父类中?
这个问题百度了也没有正确的答案,博主不保证自己的答案是正确的,这里只是分享一下自己当时面试的时候所回答的:一个方法,如果父类与子类都用的到的话把他写在父类中,如果只有子类用的到的话,把他写在工具类中。(这只是博主本人的理解)
3.关于内部类与静态内部类的问题。
这个 问题比较常见的java问题,博主答了很多,但是没有答到面试官要的答案<可惜>。
非静态内部类与静态内部类的区别:
1.非静态内部类不能定义静态成员,而静态内部类可以
2.外部类的静态方法不能访问非静态内部类。
3.静态内部类与内部类的实例化区别:
//A类中有内部类B与静态内部类C
内部类B实例化:A.B b=new a().new b();
静态内部C类实力化:A.C c=new A.C();
4.这个是比较大的区别,也是博主当时没有答上来的一点。就是说非静态内部类可以访问外部类的所有的方法和变量,但静态内部类不行,因为非静态内部类在编译的时候会自动生成对外部类的引用,所以可以访问外部类的方法和变量,但这个会造成一定程度的资源问题,因为内部类拥有外部类的引用,所以我们即使只用内部类,外部类也不会被回收,而是一直存在。
4.可能因为上一个问题回答的不是很全,就问了一下博主聊不了解关于java的回收机制
这个博主是真没了解过<尴尬>,下面给上回收机制的定义:简单来说就是将没有被其他对象说引用的对象的内存回收。(这就解释了上一个问题,为什么非静态内部类会出现资源问题).
5.问了一下线程创建的方式:
有两种方式,
第一种就是直接创建线程:然后重写里面的run方法如下
class MyThrad extends Thread
{
@Override
public void run() {
System.out.println("第一种线程执行");
}
}
启动的时候,创建一个对象然后执行其start()方法就会执行run中的语句了。
第二种方式是写一个类,使他实现Runnable接口。如下
class myRunnable implements Runnable
{
@Override
public void run() {
System.out.println("第二种线程执行");
}
}
这个实现了Runnable的类,可以作为参数交给Thread,然后再执行start方法,之后创建的子线程就会执行Runnable中的run逻辑了,使用时如下。
new Thread(new myRunnable()).start();
其实还用一种简单的写法,用匿名类实现,实现如下:
new Thread(new Runnable() {
@Override
public void run() {
//写需要的逻辑
}
}).start();
6.问了一下run()方法和start()方法
start()方法,就是启动子线程的方法,说白了就是执行完start()后,主线程不用等run方法执行完可以继续向下执行语句。
run()方法,这里面的代码就是这个线程要干的事情,当run方法里的逻辑执行完之后这个线程就结束了。
7.问了一下你认为的线程池是干什么的,
线程池的概念博主以前看过,但是时间有点长就忘了<难受>,只是说,是让线程的运行更有优秀的东西。。。
下面给下答案:
因为 Java 中创建一个线程,需要调用操作系统内核的 API,操作系统要为线程分配一系列的资源,成本很高,所以线程是一个重量级的对象,应该避免频繁创建和销毁。使用线程池就能很好地避免频繁创建和销毁。
这就是这次面试的java部分了,由于这次面试时间比较长,问了许多问题,所以剩下的部分下一个博客再来与大家分享了,弄得太多,估计小伙伴们也记不太住。也不愿意往下看<嘻嘻>.
非java部分博客:https://blog.csdn.net/qq_29226403/article/details/105413996
//要是博客有疑问,或者博主说的有问题的欢迎评论留言阿。