Java四大内部类代码示例
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java四大内部类代码示例相关的知识,希望对你有一定的参考价值。
四大内部类
成员内部类
就是普通的内部类,放在类里声明
例如:
package com.yyl.statictest;
public class PubClassTest
private String outer;
public String pouter;
private static String visit="visit";
class PubInnerClass
private String name;
private int age;
public PubInnerClass(String name, int age)
this.name = name;
this.age = age;
当内部类访问外部类时,可以不受访问控制符的影响,直接访问属性与方法
public void visitOuter()
System.out.println(PubClassTest.visit);
System.out.println(outer);
System.out.println(pouter);
System.out.println(PubClassTest.this.outer);
当外部类变量与方法和内部类同名,内部类默认访问自己的成员变量或方法,引用外部变量使用时加类名.this
:类名.this.变量名
、类名.this.方法名()
,例如:
public void visitOuterSame()
System.out.println(PubClassTest.this.pouter);
System.out.println(this.pouter);
在其他类创建一类中的内部类:内部类 对象名 = new 外部类对象( ).new 内部类( )
,例如:
PubClassTest.PubInnerClass pubInnerClass = new PubClassTest().new PubInnerClass("22",22);
外部类不能直接使用内部类的成员和方法,如下报错,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
静态内部类
在成员内部类前加一个static修饰就是静态内部类
例如:
public class StaticTest
private String outer;
private static String visit="visit";
static class StaticInnerClass
private String name;
private int age;
public StaticInnerClass(String name, int age)
this.name = name;
this.age = age;
静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员
的方式访问,例如
public void visitPubMem()
System.out.println(new StaticTest().outer);
外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员
”访问外部类的静态成员,例如
public void visitOuter()
System.out.println(StaticTest.visit);
创建静态内部类的对象时,不需要通过外部类的对象,可以直接创建 内部类 对象名= new 内部类();
,例如
StaticTest.StaticInnerClass staticInnerClass = new StaticTest.StaticInnerClass("yyl",12);
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。限制类的使用范围,只能在当前方法中使用。
例如:
package com.yyl.statictest;
public class LocalClassTest
private String outer="outer";
private static String visit="visit";
public void test()
String str = "string";
class LocalInnerClass
private String name="localinnerclass";
private int age;
public void show()
System.out.println(str);
System.out.println(visit);
System.out.println(LocalClassTest.this.outer);
System.out.println(name);
LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.show();
public static void main(String[] args)
LocalClassTest localClassTest = new LocalClassTest();
localClassTest.test();
运行结果如下:
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。不能在方法内部类中创建可变的局部变量,jdk1.8自动添加final
没有访问修饰符,但可以使用final或abstract修饰
可以访问外围类的成员变量。类名.this.变量名
,例如:
System.out.println(LocalClassTest.this.outer);
局部内部类内不能有静态声明,即不能使用关键字static,如下
在外部类方法中创建局部内部类对象才能调用局部内部类中方法
LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.show();
匿名内部类
使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
接口:
package com.yyl.statictest;
public interface AnonymousInterface
public void show();
匿名内部类实现:
package com.yyl.statictest;
public class AnonymousClassTest
public static void main(String[] args)
// 直接声明匿名类对象
AnonymousInterface anonymousClassTest = new AnonymousInterface()
public int age;
@Override
public void show()
System.out.println("AnonymousClassTest。。。。。。");
;
anonymousClassTest.show();
// 方法里传入匿名内部类
test(new AnonymousInterface()
@Override
public void show()
System.out.println("test里的AnonymousInterface");
);
public static void test(AnonymousInterface anonymousInterface)
anonymousInterface.show();
匿名内部类中是不能定义构造函数的。
匿名内部类中不能存在任何的静态成员变量和静态方法。
匿名内部类为局部内部类(即方法内部类),所以局部内部类的所有限制同样对匿名内部类生效。
匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
可以写代码块,初始化匿名内部类
匿名内部类可以很方便的定义回调。
使用内部类可以非常方便的编写事件驱动程序。
内部类的优点
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。
以上是关于Java四大内部类代码示例的主要内容,如果未能解决你的问题,请参考以下文章