版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
内部类都有哪些?
四种:静态内部类、非静态内部类、局部内部类、匿名内部类。
静态内部类和非静态内部类的区别
直接代码演示
class OuterClass{ private static String msg = "GeeksForGeeks"; //静态内部类 public static class NestedStaticClass{ //静态内部类只能访问外部类的静态成员和静态方法 public void printMessage(){ //试着将msg改成非静态的,这将导致编译错误 System.out.println("来自静态内部类的消息: " + msg); } } //非静态内部类 public class InnerClass{ public void display(){ System.out.println("来自非静态内部类的消息: " + msg); } } } public class Demo { //怎么创建静态内部类和非静态内部类的实例 public static void main(String[] args) { //创建静态内部类的实例(注意前面还是要加外部类的名字) OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass(); //调用静态内部类的非静态方法 printer.printMessage(); //结合以上步骤,一步创建的内部类实例 OuterClass.InnerClass innerObject = new OuterClass().new InnerClass(); //现在可以调用内部类方法 innerObject.display(); } }
静态内部类和非静态内部类主要的不同:
1)静态内部类不依赖于外部类实例而被实例化,而非静态内部类需要在外部类实例化后才可以被实例化。
2)静态内部类不需要持有外部类的引用。但非静态内部类需要持有对外部类的引用。
3)静态内部类不能访问外部类的非静态成员和静态方法。它只能访问外部类的静态成员和静态方法。非静态内部类能够访问外部类的静态和非静态的成员和方法。
局部内部类
在外部类的方法中定义的类。其作用的范围是在所在的方法内。它不能被public、private、protected来修饰。它只能访问方法中定义为final类型的局部变量。
class outerClass{ public void f(){ class innerClass{ //局部内部类 } } }
匿名内部类
interface Person{ public abstract void eat(); } public class Demo2 { public static void main(String[] args) { Person p = new Person() { @Override public void eat() { System.out.println("Eat Something"); } }; p.eat(); } }
是一种没有类名的内部类。
需要注意的是:
扫描二维码关注公众号,回复: 7601043 查看本文章
- 匿名内部类一定是在new的后面,这个匿名内部类必须继承一个父类或者实现一个接口。
- 匿名内部类不能有构造函数。
- 只能创建匿名内部类的一个实例
- 在Java8之前,如果匿名内部类需要访问外部类的局部变量,则必须使用final来修饰外部类 局部变量。在现在的Java8已经取消了这个限制。