关注一下嘛,又不让你背锅!

问:Java 常见的内部类有哪几种,简单说说其特征?
答:静态内部类、成员内部类、方法内部类(局部内部类)、匿名内部类。
静态内部类是定义在另一个类里面用 static 修饰 class 的类,静态内部类不需要依赖于外部类(与类的静态成员属性类似)且无法使用其外部类的非 static 属性或方法(因为在没有外部类对象的情况下可以直接创建静态内部类的对象,如果允许访问外部类的非 static 属性或者方法就会产生矛盾)。
成员内部类是没有用 static 修饰且定义在在外部类类体中的类,是最普通的内部类,可以看做是外部类的成员,可以无条件访问外部类的所有成员属性和成员方法(包括 private 成员和静态成员),而外部类无法直接访问成员内部类的成员和属性,要想访问必须得先创建一个成员内部类的对象然后通过指向这个对象的引用来访问;当成员内部类拥有和外部类同名的成员变量或者方法时会发生隐藏现象(即默认情况下访问的是成员内部类的成员,如果要访问外部类的同名成员需要通过 OutClass.this.XXX 形式访问);成员内部类的 class 前面可以有 private 等修饰符存在。
方法内部类(局部内部类)是定义在一个方法里面的类,和成员内部类的区别在于方法内部类的访问仅限于方法内;方法内部类就像是方法里面的一个局部变量一样,所以其类 class 前面是不能有 public、protected、private、static 修饰符的,也不可以在此方法外对其实例化使用。
匿名内部类是一种没有构造器的类(实质是继承类或实现接口的子类匿名对象),由于没有构造器所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调,匿名内部类在编译的时候由系统自动起名为 OutClass$1.class,一般匿名内部类用于继承其他类或实现接口且不需要增加额外方法的场景(只是对继承方法的实现或是重写);匿名内部类的 class 前面不能有 pravite 等修饰符和 static 修饰符;匿名内部类访问外部类的成员属性时外部类的成员属性需要添加 final 修饰(1.8 开始可以不用)。
问:下面说法哪些不正确,为什么?
-
内部类不能有自己的成员方法和成员变量。
-
内部类可用 abstract 修饰符定义为抽象类,也可以用 private 或 protected 定义。
-
内部类可作为其他类的成员,而且可以访问它所在类的成员。
-
除 static 内部类外,不能直接在内部类中声明 static 成员(static 常量除外)。
答:A 的描述是错误的,其他都正确。
因为内部类是指在一个类的内部嵌套定义的类,与普通类一样具有自己的成员方法和成员变量,成员和方法是类存在且有意义的基础。
问:下面的内部类哪些是正确的,哪些是错误的?
public class OutClass {
class InnerClass1 {
public static int func() {
return 1;
}
}
public class InnerClass2 {
static int func() {
return 1;
}
}
private class InnerClass3 {
int func() {
return 1;
}
}
static class InnerClass4 {
protected int func() {
return 1;
}
}
abstract class InnerClass5 {
public abstract int func();
}
}
答:由于静态内部类可以有静态成员或者静态方法,而非静态内部类不能有静态成员或者静态方法,所以 InnerClass1、InnerClass2 是错的。其他 InnerClass3、InnerClass4、InnerClass5 都是正确的,解释如第一题答案。
嘎然而止,这是内部类 Part 1 基础部分,其他 Part 部分直接上高速,尽请下个工作日收看续集(内部类绝对算的上是面试高频题了,细节很多)~~
老铁们,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨(其他历史文章请查看公众号历史记录)~
看完分享一波嘛,和你的小伙伴一起讨论才更加有意思,右上角分享 666~

看个笑话放松一下
同坐问我,锄禾日了几个人。我答,一个啊,就是当午。她说不对,是三个,因为锄禾日当午,汗滴和下土。前面一个男生转过头来,幽幽地说,是五个,谁知还有“盘中餐”,“粒粒”也很辛苦。。。我再也无法直视这首诗了!
Your time is limited, so don't waste it living someone else's life.
你的生命有限,所以别浪费时间去过别人的生活。