Android初级面试经验6.0-之一(2020年春招版)

       一转眼秋招过去了,春招又来了,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

//要是博客有疑问,或者博主说的有问题的欢迎评论留言阿。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值