聊聊Java面试(一)——从内部类说起

引言

这段时间公司一直在招人,也做了几场面试,发现很多即使有着多年开发经验的老手却也会在被他们标记为精通的语言这一关栽跟头。面试中对编程语言的考察可以说是最为基础的一部分,对于工作年限较短甚至是刚毕业的面试者,我往往会把考察的重点放在这方面,而对于经验相对成熟的面试者,这部分的考察会是个开场热身,答得好第一印象就好,如果连这都答不好,后面的天也就比较难聊了。这几场给别人的面试下来,我突然想把一些Java的基础知识总结一下,都是些很简单的点,但是绝对是面试中经常会聊以及对于Java语言使用进阶的要点。
这一篇先说说Java中的内部类。

成员内部类

内部类中最基本的就是成员内部类,它的定义就像一个类中普通的成员一样,可以被private、protected和public关键字修饰以控制其访问范围。用一个小实例来看一看:

public class Outter {
    private int num = 100;
    public String str = "The number is ";

    class Inner {
        public void printString() {
            System.out.println("Print by inner class: " + str + num);
        }
    }
}

在上面的代码中,我们定义了一个类Outter,在其中又定义了一个名为Inner的类,Inner类即为Outter类的成员内部类。对于成员内部类(Inner)来说,它可以无条件地任意使用外部类(Outter)中的任何成员,包括私有成员和静态成员。可以看到上面的代码中,Inner类有一个printString()方法,输出外部类中的变量num和str,我们来试着运行一下:

public class TestInner {
    public static void main(String[] args) {
		Outter.Inner inner = (new Outter()).new Inner();
		inner.printString();
	}
}

运行结果为:
成员内部类示例运行

再看看编译后生成的文件:
成员内部类编译后生成文件

我们来根据代码和运行结果总结一下成员内部类的特点:
1.成员内部类可以自由地使用外部类的成员;
2.成员内部类依附于外部类而存在,创建一个成员内部类的对象的前提,是必须存在一个外部类对象。

还有一点需要注意,外部类对成员内部类中成员的调用就没这么随意了,必须创建一个成员内部类的对象,通过这个成员内部类的对象才可以完成对其成员的访问。

局部内部类

局部内部类,也常被称为方法内部类,要注意一下这两个称呼说的是同一个东西哦。
顾名思义,局部内部类是定义在一个方法或作用域中的类。对于局部内部类的访问仅限于定义它的方法或作用域中,从这一点来看它与方法/作用域中的局部变量类似。因为局部内部类的使用场景其实较少,简单看下使用例子就带过吧:

public class Outter {
    ...
	public void printByLocalCls(int num) {
		class LocalCls {
			void printString(int number) {
				System.out.println("Print by local class: " + str + number);
			}
		}
		
		(new LocalCls()).printString(num);
	}
}

注意一下,局部内部类就像局部变量一样,它是不能被private、public这些关键字修饰的。看一下运行代码:

public class TestInner {
    public static void main(String[] args) {
		...
		(new Outter()).printByLocalCls(1000);
	}
}

运行结果为:
局部内部类示例运行

匿名内部类

按理说,匿名内部类是我们在开发中最常使用的一种内部类了,但是一提到匿名内部类,还真有不少人有点懵。不过只要简单一提它的用法,大家肯定又恍然大悟——方法回调。匿名内部类的特点就是没有class关键字、没有类名,也没有构造方法,一般在继承其他类或实现接口并不需要增加额外方法、只需要重写或实现继承的方法时使用。比如在Android编码时,我们对一个按钮注册点击事件:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ...
    }
});

这里就是使用了一个匿名函数,即直接使用new关键字产生一个对象的隐式引用。

静态内部类

静态内部类的定义方式与成员内部类类似,只不过多了static关键字的修饰,它的各方面性质与一般的静态成员类似。
对比成员内部类来看,静态内部类主要有以下区别:
1.静态内部类的创建不依赖于外部类;
2.静态内部类只能引用外部内中的静态成员。

静态内部类的使用都很常见,也就不多啰嗦了。

小结

关于Java中内部类的基本知识其实也就这些,很轻松就可以掌握,所以这一篇文章就写得比较短小随意了。当然,关于内部类还有很多有意思的实现细节,比如成员内部类是如何直接引用外部类的成员的,这些东西就比较深入了,实际使用倒是不会去深究,感兴趣的朋友也可以自己研究下编译生成的字节码文件,增涨一些见识,在面试时也可以和面试官吹吹牛皮。这一篇就到这儿了,之后要写的东西可能就更偏向Java的一些进阶知识了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值